Index: /enpraxis.educommons/tags/3.2.0-pre/MANIFEST.in
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/MANIFEST.in	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/MANIFEST.in	(revision 126)
@@ -0,0 +1,2 @@
+recursive-include enpraxis *
+global-exclude *.pyc
Index: /enpraxis.educommons/tags/3.2.0-pre/README.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/README.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/README.txt	(revision 126)
@@ -0,0 +1,7 @@
+enpraxis.educommons Package Readme
+=========================
+
+Overview
+--------
+
+A content management system for OpenCourseWare and OER rrelated materials.
Index: /enpraxis.educommons/tags/3.2.0-pre/docs/HISTORY.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/docs/HISTORY.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/docs/HISTORY.txt	(revision 126)
@@ -0,0 +1,9 @@
+Changelog for enpraxis.educommons
+
+    (name of developer listed in brackets)
+
+enpraxis.educommons - 3.2.0 Unreleased
+
+    - Initial package structure.
+      [zopeskel]
+
Index: /enpraxis.educommons/tags/3.2.0-pre/docs/INSTALL.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/docs/INSTALL.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/docs/INSTALL.txt	(revision 126)
@@ -0,0 +1,43 @@
+enpraxis.educommons Installation
+=======================
+
+To install enpraxis.educommons into the global Python environment (or a workingenv),
+using a traditional Zope 2 instance, you can do this:
+
+ * When you're reading this you have probably already run 
+   ``easy_install enpraxis.educommons``. Find out how to install setuptools
+   (and EasyInstall) here:
+   http://peak.telecommunity.com/DevCenter/EasyInstall
+
+ * Create a file called ``enpraxis.educommons-configure.zcml`` in the
+   ``/path/to/instance/etc/package-includes`` directory.  The file
+   should only contain this::
+
+       <include package="enpraxis.educommons" />
+
+
+Alternatively, if you are using zc.buildout and the plone.recipe.zope2instance
+recipe to manage your project, you can do this:
+
+ * Add ``enpraxis.educommons`` to the list of eggs to install, e.g.:
+ 
+    [buildout]
+    ...
+    eggs =
+        ...
+        enpraxis.educommons
+        
+  * Tell the plone.recipe.zope2instance recipe to install a ZCML slug:
+  
+    [instance]
+    recipe = plone.recipe.zope2instance
+    ...
+    zcml =
+        enpraxis.educommons
+        
+  * Re-run buildout, e.g. with:
+  
+    $ ./bin/buildout
+        
+You can skip the ZCML slug if you are going to explicitly include the package
+from another package's configure.zcml file.
Index: /enpraxis.educommons/tags/3.2.0-pre/docs/LICENSE.GPL
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/docs/LICENSE.GPL	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/docs/LICENSE.GPL	(revision 126)
@@ -0,0 +1,222 @@
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
Index: /enpraxis.educommons/tags/3.2.0-pre/docs/LICENSE.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/docs/LICENSE.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/docs/LICENSE.txt	(revision 126)
@@ -0,0 +1,16 @@
+  enpraxis.educommons is copyright enPraxis
+
+  This program is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 2 of the License, or
+  (at your option) any later version.
+
+  This program is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, 
+  MA 02111-1307 USA.
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/__init__.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/__init__.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/__init__.py	(revision 126)
@@ -0,0 +1,6 @@
+# See http://peak.telecommunity.com/DevCenter/setuptools#namespace-packages
+try:
+    __import__('pkg_resources').declare_namespace(__name__)
+except ImportError:
+    from pkgutil import extend_path
+    __path__ = extend_path(__path__, __name__)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/CHANGES.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/CHANGES.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/CHANGES.txt	(revision 126)
@@ -0,0 +1,311 @@
+========================
+Changes in version 3.1.0
+========================
+
+"Download Course" Additions 
+   Moved "download this course" into a "Reuse Course" portlet. The course downloads now include IMS information. Using a portlet will also allow for additional formats, such as Common Cartridge, to be added in the future.  
+
+Display License and Caption for Embedded Objects 
+   Using the Kupu editor, eduCommons can now display separate licenses and citations for image objects embedded in a page, distinct from the overall page license. 
+
+Captcha integration 
+   We now integrate captcha on the registration page to prevent spambot submissions.
+
+Lingua Plone 2.0 Integration 
+   LinguaPlone 2.0 has been implemented into eduCommons 3.1.0, allowing users to localize content and support multiple languages on a single OpenCourseWare site. 
+
+Add accessibility check 
+   This is intended to help institutions who want to include accessibility check into their workflow. 
+
+Enable Javascript/Page-specific CSS and embed tags by default
+   We have enabled Javascript and page-specific CSS and embed tags by default.
+
+Documentation for Adding Small Widgets 
+   Add eduCommons-specific documentation and examples for adding Plone 3 portlets. 
+
+Add "Remix this course" functionality 
+   This feature is designed to allow courses from MIT OpenCourseWare (pending implementation by MIT OCW) as well as other eduCommons OCWs to be easily imported into OpenOCW (or another eduCommons site if specified, but OpenOCW will be the default). On published eduCommons OCW courses that have been packaged, a "Remix this course" link appears. This allows unauthenticated users to send the entire course to OpenOCW (OpenOCW login credentials must be provided).  
+
+Update "download this course" to improve handling of large courses 
+   "Download this course" is no longer auto-generated when a course is published or changed. Instead, a new "Package course" button appears in the contents view of the course once it has been published. The "Download this course" .zip file now includes IMS information. It now appears in its own portlet, along with the "Remix this course" link.
+
+Other updates
+   Updated eduCommons to exclude new content from showing in the left nav by default (including zip imports).
+   Improved IE 6 and 7 compatibility.
+
+========================
+Changes in version 3.0.2
+========================
+
+Fixed bugs in 3.0.1 migration release
+
+
+========================
+Changes in version 3.0.1
+========================
+
+Added migration support for from eduCommons 2.3.1
+
+
+========================
+Changes in version 3.0.0
+========================
+
+Added full support for Plone 3.0
+   Inline editing
+   Working Copy support
+   Link and reference integrity checking
+   Automatic locking and unlocking
+   Easy collaboration and sharing
+   Versioning, history and reverting content
+   Upgraded visual HTML editor 
+
+Added OpenOCW Functionality
+   Simplified Workflow
+   Refactored Security
+   Eased Production processes
+
+Simplified Course Building
+   Course Builder Widget allows 'one step' production of Division, Course, and templates Course objects (syllabus, etc).
+
+
+========================
+Changes in version 2.3.1
+========================
+
+Added Migration from 2.2.0
+   The migration process has been improved and simplified.
+
+ 
+========================
+Changes in version 2.3.0
+========================
+
+Added i18n Support for Spanish, Dutch, French, and Chinese
+   Translations are now available for the aforementioned languages.
+
+Added Support for MOCSL Tools
+   The Folksemantic AddOn Product allows for seamless interaction with
+   Annorate, Make A Path, and Send2Wiki.
+
+Fixed Metadata Bugs
+   The Citations were presenting incorrect metadata; now pulling in correct
+   metadata per object.
+
+Added Course Wide Instructor Metadata
+   A flag is now available to note if the Instructor of the Course is also the
+   principal creator for objects within the course.
+
+Added MIT CP Import Support
+   Via the IMS Transport Tool, an end user can now import IMS Content Packages.
+   eduCommons will strip the package of it's chrome and import content, navigation,
+   and metadata.
+
+Added Zip File Download for Courses
+   End Users can now get a Zip File download of a course object, stripped of eduCommons
+   chrome and ready for reuse
+
+Extended RSS Feed Support
+   Departments and Courses now have configurable feeds per object, and the ability to turn
+   feeds on and off
+
+Added Recursive Copyright Clearance
+   Folderish Objects may now recrusively clear or revoke copyight
+
+
+========================
+Changes in version 2.2.0
+========================
+
+Front end UI Enhancements
+
+Auto-citation generation (from metadata) displayed inline with documents and included in skinless content. Simplify conformance with Attribution terms of Creative Commons licenses for those who build derivative works.
+
+Social Bookmarking Dropdown. Help users bookmark and later find OERs hosted in eduCommons using popular social bookmarking services.
+
+Integration with MyOCW (pending MyOCW release dates).
+
+Expanded support for IMS Content Packaging, including a transform engine that can translate from popular IMS CP formats to and from eduCommons.
+
+Updated internationalization support, with translation updates for a predetermined set of languages.
+
+Finalized support for content translation using the LinguaPlone product. 
+
+
+========================
+Changes in version 2.1.1
+========================
+
+Updated Internationalization Files
+  Updated internationalization files to reflect the latest eduCommons changes.
+
+Added Support for Inline Translations
+  Integrated the LinguaPlone product with eduCommons, making it now possible 
+  to have multiple translations of content within the same eduCommons instance.
+
+RSS Feeds on front page, and RSS feeds for departments
+  RSS feed icon now appears on the front page of eduCommons, as well as on the 
+  courses listing page. A new RSS feed now appears for departments, which
+  lists the latest published courses in a department.
+
+Added Support for Social Bookmarking Services
+  Added support for bookmarking services, starting with del.icio.us. Support
+  for more to come.
+
+Added a Skinless View for Documents
+  eduCommons now provides a skinless view of documents, making it both possible
+  and easy to reuse content.
+
+==============================
+Changes in version 2.1.0-final
+==============================
+
+A new IMS Transport Engine
+  A refactored IMS Content Packaging engine that provides a more robust import
+  and export functionality. On import eduCommons will identify where required 
+  tags missing in the manifest file, if it is not able to read it directly.
+
+IMS Content Packaging Documentation
+  This version ships with detailed documentation on how to write out an IMS 
+  Content Package that eduCommons can consume. The documentation is provided
+  in raw text, web based, and in a standalone (PDF) file.
+
+A New Content Licensing Engine
+  eduCommons now allows a default content license and a rights holder to be
+  set sitewide. It also includes the ability to license an individual piece 
+  of content, should the need arise to publish content under a license 
+  different to the site wide one.
+
+Copyright Bylines
+  Content is now published with the appropriate copyright byline, including
+  the ability to specify copyright dates, the rights holder, and the license
+  itself. The license includes a hyper-link to the legal terms of the license
+  as well as an icon (if the license includes one).
+
+Creative Commons License Support
+  eduCommons now includes a license selector that integrates with Creative
+  Commons Licenses (www.creativecommons.org), allowing eduCommons to remain
+  flexible with the latest CC offerings.
+
+Support for Other Licenses
+  eduCommons supports other licenses, including the traditional all rights 
+  reserved, and GNU Free Document Licenses, as well as allowing content
+  developers to input their own license.
+
+RDF and machine readable Creative Commons License Support
+  eduCommons will publish by default any metadata for a content object in
+  embedded RDF format. eduCommons will also publish machine readable creative
+  commons licenses, that can be read and processed by search engines.
+
+Content Licensing Product for Plone 2.5
+  The content licensing features in eduCommons are shipped in a standalone product
+  that can also be used in a default Plone 2.5 instance.
+
+Native Support for Plone 2.5
+  This version of eduCommons supports the latest version of Plone (2.5), with some 
+  functionality now taking advantage of the new Zope 3 component architecture.
+
+Improved HTML Validation/Fixing Engine
+  The HTML Validation/Fixer Engine has been updated, and now displays a detailed
+  report of problems within the body of an HTML document, and provides a simple
+  method to fix most problems, and identify remaining ones that need extra
+  attention. This functionality works when a content developer's editor is not
+  set to use the FCKeditor.
+
+
+
+
+==============================
+Changes in version 2.0.0-final
+==============================
+
+Human Readable URLS
+  URLs are human readable, instead of being based on an auto generated id.
+
+Recursive Folder Change State
+  Can change workflow state recursively on content in subfolders.
+
+Native Support for Plone 2.1
+  Integrated eduCommons custom skin files with new Plone 2.1 functionality. 
+  Content objects are now based on ATContentTypes. Substantial changes across 
+  the code base. eduCommons is currently based on Plone-2.1.2 and Zope-2.8.6.
+
+Content Status History on Object Views in Edit Mode
+  The content status history of an object is now available in the view from 
+  a history link at the top of the page while in edit mode.
+
+No Redirect on Front Page
+  Front page no longer redirects to an ECIndex folder, but renders directly.
+
+Removed Forum Support
+  Forum support is being replaced by new social software in the future, which 
+  means that the old OLS code base is no longer being maintained. If you require 
+  forum support it is recommended that you use the excellent zForum 
+  (http://www.zforum.org) plone product until the new software is in place.
+
+Improved IMS Content packaging
+  Workflow status history is now written in the IMS content package instead 
+  of being stored in a binary blob.
+
+eduCommons Custom Skin Support
+  eduCommons can now reskinned in release mode without requiring eduCommons 
+  to be restarted.
+
+Courses Object Removed
+  The courses object has been removed, and departments are now put in the 
+  root of the site. This simplifies the UI and removes confusion over what 
+  the Courses object is/was.
+
+Improved Default Templates
+  Default templates for the front page, FAQ and about pages propagate the 
+  eduCommons site title, making it easier to customize default site text.
+
+Department and Course IDs
+  Departments and Courses now support the display of ID's in front of their 
+  titles. Courses also support the display of the year and semester that the 
+  course was taught in.
+
+==============================
+Changes in version 1.6.1-final
+==============================
+
+eduCommons Document HTML Fixer
+  Implement an HTML engine that can fix HTML mistakes automatically in ecDocuments.
+
+RDF Headers/Metadata
+  Add RDF headers to ECDocuments implementing the RDF/Dublin Core standard.
+
+Support for Plone 2.1.1/Zope 2.8.2
+  Implementing support for the latest Plone (2.1.1) and Zope (2.8.2) code bases.
+
+Support for Default Templates
+  Support for adding default templates for commonly used pages within eduCommons.
+
+
+Review and Revise IMS Export Rights
+  Changes in the UI to only present IMS import/export to administrators and managers. 
+  This is necessary because producers do not have rights on content that is not in the 
+  "In Progress" state, which prevents producers from being able to import/export 
+  content not in the appropriate state. 
+
+
+Zip export (non-ims)
+  Allow a producer administrator or manager to export course content in a zip file format.
+
+Creative Commons metadata header
+  Add a metadata header to ECDocuments for the creative commons license.
+
+Removal of "Courses" link in bread crumb
+  Remove the "Courses" link in the breadcrumb due to the fact that is is confusing to users.
+
+XHTML Validation of an Entire Course
+  Adding the ability to do validation of XHTML across a course, while reporting 
+  errors in a log file.
+
+Add Folders to Course Contents
+  Add folders to course content pages so that objects which externally link to other 
+  objects will retain their links with out having to rewrite them.
+
+Migration from 1.5.2-final
+  Implement the ability to migrate existing 1.5.2-final sites to 1.6.1-final.
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMS/eduCommonsv1.1.xsd
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMS/eduCommonsv1.1.xsd	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMS/eduCommonsv1.1.xsd	(revision 126)
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns="http://cosl.usu.edu/xsd/eduCommonsv1.1"
+           targetNamespace="http://cosl.usu.edu/xsd/eduCommonsv1.1"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    
+    <xs:annotation>
+        <xs:documentation>
+            eduCommonsv1.1 XML Schema Document
+            Author: Brent Lambert
+            Version: 1.1
+        </xs:documentation>
+    </xs:annotation>
+    
+    <xs:complexType name="eduCommonsType">
+        <xs:annotation>
+            <xs:documentation>
+                eduCommons specific fields not represented in standard metadata sets. 
+                Used to set specific eduCommons options on content objects.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element ref="objectType" minOccurs="0"/>
+            <xs:element ref="copyright" minOccurs="0"/>
+            <xs:element ref="license" minOccurs="0"/>
+            <xs:element ref="clearedCopyright" minOccurs="0"/>
+            <xs:element ref="courseId" minOccurs="0"/>
+            <xs:element ref="term" minOccurs="0"/>
+            <xs:element ref="displayInstructorEmail" minOccurs="0"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="licenseType">
+        <xs:annotation>
+            <xs:documentation>
+                Information about the copyright license that is used for a content 
+                object. eduCommons uses this information to display copyright bylines, 
+                and embedded RDF copyright metadata in content views. 
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element ref="licenseName" minOccurs="0" maxOccurs="1"/>
+            <xs:element ref="licenseUrl" minOccurs="0" maxOccurs="1"/>
+            <xs:element ref="licenseIconUrl" minOccurs="0" maxOccurs="1"/>
+        </xs:sequence>
+        <xs:attribute name="category" use="required" type="licenseTypes"/>
+    </xs:complexType>
+    
+    <xs:simpleType name="objectTypes">
+        <xs:annotation>
+            <xs:documentation>
+                A list of possible types that a content object can have. eduCommons 
+                uses this information to create the correct type of object in an 
+                eduCommons environment.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="Department"/>
+            <xs:enumeration value="Course"/>
+            <xs:enumeration value="File"/>
+            <xs:enumeration value="Image"/>
+            <xs:enumeration value="Document"/>
+            <xs:enumeration value="Link"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:simpleType name="licenseTypes">
+        <xs:annotation>
+            <xs:documentation>
+                Copyright license categories. All copyright licenses should fall under 
+                one of these categories. If a license is not specifically 
+                listed, use the "Other" category. If you know that the license will be 
+                the same as the eduCommons site wide settings use the "Site Default" 
+                setting.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:token">
+            <xs:enumeration value="Site Default"/>
+            <xs:enumeration value="All Rights Reserved"/>
+            <xs:enumeration value="GNU Free Document License"/>
+            <xs:enumeration value="Creative Commons License"/>
+            <xs:enumeration value="Other"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:element name="eduCommons" type="eduCommonsType"/>
+    <xs:element name="objectType" type="objectTypes"/>
+    <xs:element name="copyright" type="xs:string"/>
+    <xs:element name="license" type="licenseType"/>
+    <xs:element name="clearedCopyright" type="xs:boolean"/>
+    <xs:element name="courseId" type="xs:string"/>
+    <xs:element name="term" type="xs:string"/>
+    <xs:element name="displayInstructorEmail" type="xs:boolean"/>
+
+    <xs:element name="licenseName" type="xs:string"/>
+    <xs:element name="licenseUrl" type="xs:anyURI"/>
+    <xs:element name="licenseIconUrl" type="xs:anyURI"/>
+    
+</xs:schema>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMS/eduCommonsv1.2.xsd
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMS/eduCommonsv1.2.xsd	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMS/eduCommonsv1.2.xsd	(revision 126)
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+           targetNamespace="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+           xmlns:xs="http://www.w3.org/2001/XMLSchema">
+    
+    <xs:annotation>
+        <xs:documentation>
+            eduCommonsv1.2 XML Schema Document
+            Author: Brent Lambert
+            Version: 1.2
+        </xs:documentation>
+    </xs:annotation>
+    
+    <xs:complexType name="eduCommonsType">
+        <xs:annotation>
+            <xs:documentation>
+                eduCommons specific fields not represented in standard metadata sets. 
+                Used to set specific eduCommons options on content objects.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element ref="objectType" minOccurs="0"/>
+            <xs:element ref="copyright" minOccurs="0"/>
+            <xs:element ref="license" minOccurs="0"/>
+            <xs:element ref="clearedCopyright" minOccurs="0"/>
+            <xs:element ref="accessible" minOccurs="0"/>
+            <xs:element ref="courseId" minOccurs="0"/>
+            <xs:element ref="term" minOccurs="0"/>
+            <xs:element ref="displayInstructorEmail" minOccurs="0"/>
+	    <xs:element ref="instructorAsPrincipalCreator" minOccurs="0"/>
+        </xs:sequence>
+    </xs:complexType>
+
+    <xs:complexType name="licenseType">
+        <xs:annotation>
+            <xs:documentation>
+                Information about the copyright license that is used for a content 
+                object. eduCommons uses this information to display copyright bylines, 
+                and embedded RDF copyright metadata in content views. 
+            </xs:documentation>
+        </xs:annotation>
+        <xs:sequence>
+            <xs:element ref="licenseName" minOccurs="0" maxOccurs="1"/>
+            <xs:element ref="licenseUrl" minOccurs="0" maxOccurs="1"/>
+            <xs:element ref="licenseIconUrl" minOccurs="0" maxOccurs="1"/>
+        </xs:sequence>
+        <xs:attribute name="category" use="required" type="licenseTypes"/>
+    </xs:complexType>
+    
+    <xs:simpleType name="objectTypes">
+        <xs:annotation>
+            <xs:documentation>
+                A list of possible types that a content object can have. eduCommons 
+                uses this information to create the correct type of object in an 
+                eduCommons environment.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:NMTOKEN">
+            <xs:enumeration value="Department"/>
+            <xs:enumeration value="Course"/>
+            <xs:enumeration value="File"/>
+            <xs:enumeration value="FSSFile"/>
+            <xs:enumeration value="Image"/>
+            <xs:enumeration value="Document"/>
+            <xs:enumeration value="Link"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:simpleType name="licenseTypes">
+        <xs:annotation>
+            <xs:documentation>
+                Copyright license categories. All copyright licenses should fall under 
+                one of these categories. If a license is not specifically 
+                listed, use the "Other" category. If you know that the license will be 
+                the same as the eduCommons site wide settings use the "Site Default" 
+                setting.
+            </xs:documentation>
+        </xs:annotation>
+        <xs:restriction base="xs:token">
+            <xs:enumeration value="Site Default"/>
+            <xs:enumeration value="All Rights Reserved"/>
+            <xs:enumeration value="GNU Free Document License"/>
+            <xs:enumeration value="Creative Commons License"/>
+            <xs:enumeration value="Other"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:element name="eduCommons" type="eduCommonsType"/>
+    <xs:element name="objectType" type="objectTypes"/>
+    <xs:element name="copyright" type="xs:string"/>
+    <xs:element name="license" type="licenseType"/>
+    <xs:element name="clearedCopyright" type="xs:boolean"/>
+    <xs:element name="accessible" type="xs:boolean"/>
+    <xs:element name="courseId" type="xs:string"/>
+    <xs:element name="term" type="xs:string"/>
+    <xs:element name="displayInstructorEmail" type="xs:boolean"/>
+    <xs:element name="instructorAsPrincipalCreator" type="xs:boolean"/>
+
+
+    <xs:element name="licenseName" type="xs:string"/>
+    <xs:element name="licenseUrl" type="xs:anyURI"/>
+    <xs:element name="licenseIconUrl" type="xs:anyURI"/>
+    
+</xs:schema>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMSContentPackaging.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMSContentPackaging.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/IMSContentPackaging.txt	(revision 126)
@@ -0,0 +1,529 @@
+IMS Content Packaging and eduCommons 3.1.1-final
+================================================
+
+This document details how to write IMS Content packages that are compatible with
+eduCommons 3.1.1-final. 
+
+eduCommons uses version 1.2 of the IMS Content Packaging Specification. XML Schemas
+for the specification can be found at http://imsglobal.org/xsd/imscp_v1p2.xsd and
+http://imsglobal.org/xsd/imsmd_v1p2p4.xsd.
+
+Using XML Schemas and a Validating XML Editor
+=============================================
+
+In the process of writing software that exports eduCommons supported IMS Content
+Packages, it is highly recommended to use a validating XML editor and associated
+schema files to check manifests for validity. eduCommons in some circumstances 
+will expect import manifests to meet validity standards, and the chances of 
+creating content packages that will work with eduCommons will be greatly increased. 
+eduCommons provides XML schema files on export for this purpose.
+
+An XML schema file for eduCommons specific metadata can be found both online
+(http://cosl.usu.edu/xsd/eduCommonsv1.1.xsd) and in eduCommons IMS Content
+Packages.
+
+To use the IMS Content Package XML schemas along with the eduCommons schema, make
+sure your manifest specifies these packages and the relevant XML schema informtation
+in the header. Below is an example of attributes which you may want to set on the 
+*manifest* tag.
+
+::
+
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" 
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.1" 
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd 
+                        http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p4.xsd 
+                        http://cosl.usu.edu/xsd/eduCommonsv1.2 eduCommonsv1.2.xsd">
+
+
+
+Specifying and Using eduCommons Namespaces
+==========================================
+
+The IMS CP specification allows content packages to be extended using custom
+metadata fields. eduCommons takes advantage of this to pass information that
+does not fit into the LOM metadata format. Using the eduCommons extensions
+requires the use of the eduCommons namespace in typical XML style.
+
+eduCommons can read values from colon prefixed tags, or by using an *xmlns*
+attribute on the top level eduCommons tag as shown below. Although both methods
+are acceptable, the latter is preferred due to the fact that it makes the
+corresponding XML more readable. Examples in the rest of the document will
+be given in this format.
+
+::
+
+   <manifest xmlns="....
+             xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+             ...
+             >
+
+       ...
+
+       <eduCommons:eduCommons>
+           <eduComons:objectType>
+               Course
+           </eduCommons:objectType>
+       </eduCommons:eduCommons>
+
+       ...
+    </manifest>
+
+::
+
+    <eduCommons xmlns="http://cosl.usu.edu/xsd/eduCommonsv1.2">
+        <objectType>
+            Course
+        </objectType>
+    </eduCommons> 
+
+
+How to Make Items Appear in the Left Hand Navigation
+====================================================
+
+eduCommons will add links to objects in the left hand navigation of a course
+view through the use of the *organizations* section in an IMS content package.
+Becuase IMS CP standards support multiple organizations within a manifest,
+eduCommons will use the default organization if it is specified. If no default
+is specified eduCommons will read from the first *organization* tag listed
+in the organizations section.
+
+eduCommons gets its left hand navigation information from the *isVisible* attribute
+on items. If this attribute is present and set to true, eduCommons will mark
+this object as displayable in the left hand navigation. eduCommons will order 
+left hand navigation items based on the ordering of *item* tags within the 
+organization section.
+
+An example of how to write an organizations section that eduCommons can read is
+given below. Notice how the default organization section is set, and how unique
+identifiers are used to link the item to the resource in the resources section.
+
+The IMS CP specification requires that any id value use be unique to the manifest,
+otherwise anything can be used.
+
+::
+
+   <oganizations default="ORG1234">
+       <organization identifier="ORG1234">
+           <item identifier="ITM1234" identifierref="RES1234" isVisible="true">
+               <title>
+                   Hello World
+               </title>
+           </item>
+           ...
+       </organization>
+   </organizations>
+   <resources>
+       <resource identifier="RES1234">
+          ...
+       </resource>
+       ...
+   </resources>
+
+Setting Metadata on eduCommons Enabled IMS Content Packages
+===========================================================
+
+eduCommons stores metadata for every content object entered into its repository.
+In order to write a content package that eduCommons can process, it is necessary
+to include a metadata section for every resource specified in the manifest.
+
+It is also important to note that eduCommons currently will not read top level
+metadata sections, nor will it support nested manifests within IMS Content
+Packages. Support for nested manifests, and non eduCommons content packages
+are currently listed as future eduCommons features.
+
+An example of how to lay out your manifest section to be eduCommons friendly is
+given below.
+
+::
+
+    <manifest>
+        <organizations>
+            <organization>
+            </organization>
+        </organizations>
+        <metadata>
+            ... any metadata specified here is ignored by eduCommons ...
+        </metadata>
+        <resources>
+            <resource>
+                <metadata>
+                   ... metadata specified here is used to apply metadata
+                       to content objects ...
+                </metadata>
+                <file href=" ... used by eduCommons to name the content object
+                                 and find it within the package ..."/>
+            </resource>
+            ...
+        </resources>
+        <manifest>
+            ... nested manifests are not currently supported by eduCommons,
+                but may be at a future date ...
+        </manifest>            
+    </manifest>
+
+
+The eduCommons Course Object
+============================
+
+The eduCommons course object is different to other content objects in that
+it has extra requirements. eduCommons represents courses as both a document
+and a container for content objects. This means in an IMS Manifest it will
+appear as a content object that is connected to an HTML file (used to 
+render the front course page) and is also a folder which contains  all content
+related to the course. It appears in the manifest as both.
+
+Courses also have additional metadata associated with them in the eduCommons 
+specific metadata section. This extra metadata is specified in a further section
+below.
+
+Each manifest should specify a course object as the initial resource.
+
+
+LOM Metadata Fields Read By eduCommons on Import
+================================================
+
+eduCommons uses Dublin Core fields to store metadata internally. In order to
+be able to support IEEE LOM metadata standards in IMS Content Packages, some
+mapping between metadata standards must be done. Not all LOM metadata fields
+are supported, and although eduCommons may populate some of these extra fields
+on output, it only supports reading data from the following fields:
+
+1. General
+----------
+
+1.2 Title
+~~~~~~~~~
+
+eduCommons uses this field to set the title on an object. This field is 
+required.
+
+1.3 Language
+~~~~~~~~~~~~
+
+eduCommons uses the language setting to set the language of the content object
+and its metadata. eduCommons does not support setting language values on metadata
+or individual metadata fields. All LOM language attributes in "langstring" nodes
+are ignored by eduCommons. This field is optional, but recommended.
+
+1.4 Description
+~~~~~~~~~~~~~~~
+
+eduCommons sets descriptions on content objects using this field. This field is
+optional, but recommended.
+
+1.5 Keyword
+~~~~~~~~~~~
+
+eduCommons supports the use of keywords for search purposes over content. It 
+uses this LOM field. This field is optional.
+
+
+2. Lifecycle
+------------
+
+2.3 Contribute
+~~~~~~~~~~~~~~
+
+eduCommons supports a number of fields based on the LOM Contribute node.
+
+When the role in a contribute node is set to "creator", eduCommons will
+set the eduCommons creator field to the name value in the VCARD of this
+section. When the role is set to "creator" it will also use the date field
+to set the creation date on the eduCommons content object.
+
+eduCommons will set its contributors field with the names listed in any other
+LOM based contribute nodes. The roles defined in additional LOM based contribute
+nodes are not read or stored by eduCommons.
+
+eduCommons also supports a number of eduCommons specific contribute nodes
+which are detailed in the next section.
+
+Other
+-----
+
+eduCommons may support a larger number of LOM fields in the future. The current 
+supported set is likely to be expanded. However, attempts will be made to remain
+compatible with the above listed fields.
+
+
+LOM Based eduCommons Metadata Fields
+====================================
+
+The *rights holder* field
+-------------------------
+
+eduCommons supports setting a rights holder for every content object. However, it
+also supports setting content to use a site wide default, making it possible to
+set a default rights holder over the whole eduComomns site. To use the site wide
+default setting, use "(site default)" as the rights holder name.
+
+eduCommons will read an write the rights holder information in a *contribute*
+section in the LOM metadata section of an IMS content package. The *source*
+tag in this contribute section is set to "eduCommonsv1.1" signifying that this
+role is defined by eduCommons and is not a standard LOM role. An example of how
+the rights holder is given below. The date field can be set to a publication or 
+creation date. It does not matter, as eduCommons does not use the date field in
+this section. 
+
+::
+
+    <contribute>
+        <role>
+            <source>
+                <langstring xml:lang="en">
+                    eduCommonsv1.2
+                </langstring>
+            </source>
+            <value>
+                <langstring xml:lang="en">
+                    rights holder
+                </langstring>
+            </value>
+        </role>
+        <centity>
+            <vcard>
+                BEGIN:VCARD
+                FN: John Smith
+                END:VCARD
+            </vcard>
+        </centity>
+        <date>
+            <datetime>
+                2006-08-07 15:59:23
+            </datetime>
+        </date>
+    </contribute>
+
+Note
+  The VCARD Section In The Xml File Should Be Left Aligned, With No Whitespace In
+  Order To Comply With VCARD Standards.
+
+
+The *Instructor* and *InstructorEmail* fields
+---------------------------------------------
+
+The instructor field is also encoded in a LOM contribute node, similar to the 
+rights holder field above. Things to note here are that eduCommons will read both
+the *FN:* and *EMAIL;INTERNET:* fields out of the VCARD, and use them to set
+the *Instructor* and *InstructorEmail* settings accordingly.
+
+::
+
+    <contribute>
+        <role>
+            <source>
+                eduCommonsv1.2
+            </source>
+            <value>
+                instructor
+            </value>
+        </role>
+        <centity>
+            <vcard>
+                BEGIN:VCARD
+                FN: John Smith
+                EMAIL;INTERNET: johnsmith@somewhere.com
+                END:VCARD
+            </vcard>
+        </centity>
+        <date>
+            <datetime>
+                2006-08-07 15:59:23
+            </datetime>
+        </date>
+    </contribute>
+
+Note
+  The VCARD Section In The Xml File Should Be Left Aligned, With No Whitespace In
+  Order To Comply With VCARD Standards.
+
+
+
+eduCommons Specific Metadata
+============================
+
+This section details eduCommons metadata that does not appear within the LOM
+metadata section. Instead it appears in a section following the LOM metadata as
+follows.
+
+::
+
+    <metadata>
+        <lom xmlns="http://www.imsglobal.org/xsd/imsmd_v1p2">
+            <general>
+            </general>
+            <lifecycle>
+            </lifecycle>
+            ...
+        </lom>
+        <eduCommons xmlns="http://cosl.usu.edu/xsd/eduCommonsv1.2">
+           <objectType>
+           </objectType>
+           ...
+        </eduCommons>
+    </metadata>
+
+
+The following section describes the tags supported by eduCommons in detail.
+
+eduCommons Metadata Tags
+========================
+
+The *objectType* tag
+--------------------
+
+The *objectType* tag is used to signify what type of content object eduCommons
+should create for the given resource. Possible values are Course, Document, 
+File, Image, or Link. This field is required. HTML or plain text resources
+should use the document setting. Images should use the image setting. All other
+resources should use the File setting, unless they are an external link. If
+a resource is in HTML format and represents a course home page, use the Course
+setting and make sure the resource appears first in the manifest resources 
+section.
+
+::
+
+    <objectType>
+        Course
+    </objectType>
+
+The *copyright* tag
+-------------------
+
+The *copyright* tag is used by eduCommons to license content objects. It also uses
+the field to render copyright bylines for objects. The field should specify both
+the copyright and the date. e. g. "Copyright 2006". This field is optional. If 
+it is not included, the site default copyright string will be used instead.
+
+::
+
+    <copyright>
+        Copyright 2006
+    </copyright>
+
+The *license* tag
+-----------------
+
+The license tag is used to assign a copyright license to a content object. It
+is also used to render a copyright byline for an object.
+
+The license field supports four parameters:
+
+- License Cateogory
+- License Name
+- License URL
+- License Icon URL
+
+The category field appears as an attribute in the *license* tag, and must be
+set to one of the following: 
+
+- (site default) 
+- All Rights Reserved 
+- GNU Free Document License
+- Creative Commons License 
+- Other
+
+The category field is also used as a label by eduCommons to allow a user to
+select a copyright license for a content object. It is a required field.
+
+The *licenseName* tag is used to identify the name of the license. This name 
+will be used in the copyright byline, and should slot into the following sentence:
+This resource is licensed under a ____________. This is an optional field only 
+if "(site default)" is chosen. Otherwise it must be specified.
+
+The *licenseUrl* tag is used to specify a public web site where the legal definition
+of the license is displayed. It allows the license name in the copyright byline to
+be linked directly to the definition. It is optional.
+
+The *licenseIconUrl* tag is used to specify a public icon image that represents
+the content license. This field is optional, and likely not to be included, unless
+the license includes a representative icon. An example where you would want 
+to include this field would be to specify a creative commons icon along with
+the license.
+
+Below is an example of how the license field would be encoded within the eduCommons
+metadata.
+
+::
+
+    <license category="Creative Commons License">
+        <licenseName>
+            Attribution 2.5
+        </licenseName>
+        <licenseUrl>
+            http://creativecommons.org
+        </licenseUrl>
+        <licenseIconUrl>
+            http://creativecommons.org
+        </licenseIconUrl>
+    </license>
+
+The *clearedCopyright* tag
+--------------------------
+
+The *clearedCoypright* field is used by eduCommons to keep track of whether or not
+a content object has been cleared for publication in an open content environment. 
+It can be set to either "true" or "false". This field is optional, and is set to
+"false" by default.
+
+::
+
+    <clearedCopyright>
+        true
+    </clearedCopyright>
+
+Course related metadata
+=======================
+
+The following metadata is only applicable when the *objectType* field is set
+to Course. It contains metadata that is specific to course objects.
+
+The *courseId* tag
+------------------
+
+The *courseId* tag is used to identify the course catalog number at an institution.
+It is used by eduComomns to render a full title of a course. Although this tag not
+required, is highly recommended.
+
+::
+
+    <courseId>
+        INST7000
+    </courseId>
+
+The *term* tag
+--------------
+
+The *term* tag is used by eduCommons to specify which term, or semester the course
+was taught in. It is used by eduCommons to render a full title of a course. Although
+this tag is not required, it is highly recommended.
+
+::
+ 
+    <term>
+        Fall 2005
+    </term>
+
+The *displayInstructorEmail* tag
+--------------------------------
+
+The *displayInstructorEmail* tag is used to specify whether or not an Instructor's
+Email address should be published or not. It can be set to "true" or "false".
+This tag is optional and defaults to "false".
+
+::
+
+    <displayInstructorEmail>
+        false
+    </displayInstructorEmail>
+
+
+Example IMS Content Packages
+============================
+
+You can create example IMS packages by building content in eduCommons and then
+use the IMS export functionality to export them. This feature can be useful
+in figuring out how to write compatible packages.
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/INSTALL.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/INSTALL.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/INSTALL.txt	(revision 126)
@@ -0,0 +1,481 @@
+===================================
+eduCommons 3.1.1-final Installation
+===================================
+
+-------------------------
+Installation Instructions
+-------------------------
+
+Installation
+============
+
+This section describes how to install a server based instance of eduCommons on 
+a UNIX based platform (linux, OSX). 
+
+Installation involves the following packages:
+
+   * Python-2.4.4.tar.gz (http://python.org/2.4.4/) 
+   * Zope-2.10.5-final.tar.gz (http://www.zope.org/Products/Zope/2.10.5)
+
+Python library packages:
+
+   * Imaging-1.1.6.tar.gz (http://www.pythonware.com/products/pil/)
+   * PyXML-0.8.4.tar.gz (http://sourceforge.net/project/showfiles.php?group_id=6473)
+   * elementtree-1.2.6.tar.gz (http://effbot.org/downloads/#elementtree)
+   * libxml2-python-2.6.15.tar.gz (ftp://xmlsoft.org/libxml2/python/)
+   * Beautiful Soup 3.0.4 (http://www.crummy.com/software/BeautifulSoup/download/)
+
+Plone package:
+
+   * Plone-3.0.6.tar.gz (http://plone.org/products/plone/releases/3.0.6)
+
+eduCommons-related Packages:
+
+(Correct versions of these products are shipped in the eduCommons archive unless ohterwise noted)
+
+   * eduCommons (3.1.0-final)
+   * leftskin (1.0.2-final)
+   * ContentLicensing (2.0.0)
+   * ZipFileTransport (2.0.1)
+   * IMSTransport (2.0.1)
+   * PloneBookmarklets (2.0.0)
+   * ProxyIndex (1.2.1)
+   * FileSystemStorage (2.6.2)
+   * LinguaPlone (2.0)
+   * easy_install (download here: http://peak.telecommunity.com/dist/ez_setup.py)
+   * collective.captcha (installed via easy_install)
+
+I. Installation Steps
+---------------------
+
+1. Installing Python:
+
+   It is likely that the Python programming language is already installed on 
+   your server. Try typing:
+   ::
+
+      $ python
+
+   on the command line to see what version you have installed (Ctrl-D will exit). 
+   You should see something like the following:
+   ::
+
+      Python 2.4.4 (#1, Oct  7 2006, 21:17:24) 
+      [GCC 3.4.6 20060404 (Red Hat 3.4.6-3)] on linux2
+      Type "help", "copyright", "credits" or "license" for more information.
+      >>>
+
+   eduCommons and its supporting software requires version 2.4.4. If your server 
+   does not have Python, or if the version of Python installed is not 2.4.4, you 
+   will have to install a new version.
+
+   Some platforms may have an updated version of Python available through their
+   package managers (yum, apt, fink). If you can not find a suitable version, or 
+   if you prefer to build Python from source, simply download the source package
+   and use a command line interface to type in the following instructions:
+   ::
+
+      tar -zxvf Python-2.4.4.tar.gz
+      cd Python-2.4.4
+      ./configure
+      make
+      sudo make install
+
+   By default this will install a new version of Python in the /usr/local directory
+   on your server.
+
+2. Installing Python library packages
+
+   Once you have Python installed it will be necessary to include a number of
+   libraries that extend the functionality of your Python installation. If you 
+   have installed Python using a package manager, it may be likely that some
+   (or all) of these packages may also be available for installation. As long
+   as suitable library versions can be found, it should be fine to use them. In
+   cases where it is not possible to load prebuilt packages, use the following
+   instructions below:
+
+   a. Installing Python Imaging Libary (PIL)
+
+      PIL is now a required package for the latest version of Plone.
+
+      Unpack and install Imaging-1.1.6:
+      ::
+
+         tar -zxvf Imaging-1.1.6.tar.gz
+         cd Imaging
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+      You may require additional packages to build the imaging library. See
+      the PIL website for additional installation instructions.
+
+   b. Installing PyXML
+
+      Unpack and install PyXML:
+      ::
+
+         tar -zxvf PyXML-0.8.4.tar.gz
+         cd PyXML-0.8.4
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+   c. Installing elementtree
+
+      elementtree is now a required dependency for the latest version of Plone.
+
+      Unpack and install elementtree:
+      ::
+
+         tar -zxvf elementtree-1.2.6.tar.gz
+         cd elementtree-1.2.6
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+   d. Installing libxml2-python
+
+      If your target platform includes binary only distributions of libxml2 and
+      libxslt, you may need to also include the development packages in order for
+      the following to work. 
+
+      Unpack and install libxml2-python:
+      ::
+
+         tar -zxvf libxml2-python-2.6.15.tar.gz
+         cd libxml2-python-2.6.15
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+   e. Install Beautiful Soup
+
+      Unpack and install Beautiful Soup 3.0.4 into your python library.
+      ::
+
+         tar -zxvf BeautifulSoup-3.0.4.tar.gz
+         cd BeautifulSoup-3.0.4
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+  f. Install Easy Install
+
+      Easy Install (easy_install) is a python module bundled with setuptools
+      that lets you automatically download, build, install, and manage Python packages.
+
+      Download http://peak.telecommunity.com/dist/ez_setup.py and install it using the 
+      correct version of python:
+      ::
+
+         /usr/local/bin/python ez_setup.py
+
+   g. Install collective.captcha
+
+      collective.captcha is a Python package that is installable via Easy Install
+      ::
+
+         /usr/local/bin/easy_install collective.captcha
+
+3. Installing Zope
+
+   Unpack, build and install Zope:
+   ::
+
+      tar -zxvf Zope-2.10.5-final.tar.gz 
+      cd Zope-2.10.5-final
+      ./configure --with-python=/usr/local/bin/python --prefix /opt/Zope-2.10.5
+      make
+      sudo make install
+
+4. Create a Zope instance
+
+   Create an instance in your Zope install:
+   ::
+
+      sudo /opt/Zope-2.10.5/bin/mkzopeinstance.py
+
+   When prompted for a directory enter in the following:
+   ::
+ 
+      /opt/Zope-2.10.5/web
+
+   You can substitute the *web* directory for a name that better describes your site. 
+   The documentation will assume that you have chosen web as your instance directory.
+
+   When prompted for a username and password, enter in the username/password you will 
+   use for managing your Zope instance.
+
+5. Install Zope Products
+
+   eduCommons relies on several Zope products in order to run. You will need to install
+   the following packages in the following order. The commands listed below assume that
+   you have the source tarballs in the root of your home account:
+
+   a. Plone-3.0.6
+
+      Install Plone into your Zope instance Products folder.lib/python directory 
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         sudo tar -zxvf ~/Plone-3.0.6.tar.gz
+
+      Once you have unpacked Plone you need to move the products back up to the Products 
+      directory as follows:
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         sudo su
+         cd Plone-3.0.6
+         mv * ..
+         cd ..
+         sudo rm -rf Plone-3.0.6
+      
+      The Plone tarball came with a lib/python directory. The contents of it need to go 
+      up one level, into the lib/python of your Zope install.
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         cp -r lib/* ../lib/
+         sudo rm -rf /opt/Zope-2.10.5/web/Products/lib
+
+      The Plone tarball also contains a Products directory. The contents of it need to go
+      up one level, into the web/Products directory of your Zope install.
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         cp -r Products/* ../Products/
+         sudo rm -rf /opt/Zope-2.10.5/web/Products/Products
+
+   b. eduCommons
+
+      This is the eduCommons product source package. To install use the following:
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         sudo tar -zxvf ~/eduCommons-3.1.1-final.tar.gz
+
+      eduCommons includes a number of products which need to be put in the root
+      of the Products folder. To do this use the following:
+      ::
+         
+         cd /opt/Zope-2.10.5/web/Products
+	 sudo mv eduCommons-3.1.1-final/* .
+         sudo rm -rf eduCommons-3.1.1-final
+
+      The products that now ship with eduCommons are as follows:
+         
+      1. eduCommons
+
+         A Plone product which implements the core functionality of eduCommons.
+
+      2. leftskin
+
+         A Plone product which customizes the Plone layout.
+
+      3. ContentLicensing
+
+         A Plone product that adds the ability to set copyright licenses on content
+         objects. Auto installed with the eduCommons product.
+
+      4. ZipFileTransport
+
+         A Plone product that adds the ability to import and export content via
+         ZIP archives. Auto installed with the eduCommons product.
+
+      5. IMSTransport
+
+         A Plone product that imports and exports contents in IMS content packages. 
+         Auto installed with the eduCommons product.
+
+      6. PloneBookmarklets
+
+         A Plone product that adds the ability to integrate documents with popular social
+         bookmarking sites.
+
+      7. ProxyIndex
+
+         ProxyIndex is a plugin to zope catalog index.
+
+      8. FileSystemStorage
+
+         FileSystemStorage is a product that provides the framework for content types to store data
+         directly on the filesystem, rather than in the ZODB.  
+
+      9. LinguaPlone
+
+         A tool to manage and maintain multilingual Plone content.
+
+6. Configure your Zope site
+
+   Now that all the necessary Zope products are installed it is time to clean up and
+   configure the site. The first task is to create a zope user and group in which 
+   zope can run under. This can be done via the following:
+   ::
+
+      sudo /usr/sbin/groupadd zope
+      sudo /usr/sbin/adduser -g zope -s /bin/false -d /opt/Zope-2.10.5 zope
+
+   Once that is done we can now set the proper permissions needed for Zope to run
+   securely. This can be done via the following:
+   ::
+
+      cd /opt/Zope-2.10.5/web/Products
+      sudo chgrp -R zope *
+      sudo chmod go-w *
+
+   FileSystemStorage comes with its own documentation and we recommend you read it 
+   (/opt/Zope-2.10.5/web/Products/FileSystemStorage/README.txt). Create folders for
+   storage and backup. We suggest setting things up in the following way:
+   ::
+
+      cd /opt/Zope-2.10.5/web/var
+      mkdir fss_storage
+      mkdir fss_backup
+
+   Now edit the filesystemstorage.conf.in configuration file for FileSystemStorage located 
+   in /opt/Zope-2.10.5/web/Products/FileSystemStorage/etc. There are several configuration 
+   options here (see README.txt), but most can be left at the default. We suggest a 
+   hierarchical file structure, which can be set up by uncommenting and editing this line:
+   ::
+
+      # storage-strategy flat
+      change to:
+      storage-strategy site1
+
+   Zope needs to be able to write to the log directory, and its database files. To
+   enable this enter the following:
+   ::
+
+      cd /opt/Zope-2.10.5/web
+      sudo chgrp -R zope log var
+      sudo chmod -R g+w log var
+
+   The last bit of configuration that needs to be done is to edit the zope.conf file.
+   found in the *etc/* directory of your Zope Instance. Uncomment and edit the 
+   following settings:
+   ::
+
+      effective-user zope
+
+   And set the default port you want the Zope server to run on:
+   ::
+
+      <http-server>
+        # valid keys are "address and "force-connection-close"
+        address 8080
+        # force-connection-close on
+      </http-server>
+
+7. Apply Security Patch
+
+   Plone's Security Panel is broken for Products that add Roles that come alphabetically
+   before 'Anonymous'. eduCommons adds the Administrator Role, which breaks the Security 
+   Panel.  This is a documented bug (http://dev.plone.org/plone/ticket/7690).
+
+   In order to remedy this problem, apply the patch found in the eduCommons/extras folder.
+   Copy the patch to /opt/Zope-2.10.5/web/lib/python/plone/app/controlpanel. 
+   ::
+
+      cd /opt/Zope-2.10.5/web/lib/python/plone/app/controlpanel
+      cp /opt/Zope-2.10.5/web/Products/eduCommons/extras/plone.app.controlpanel.security.py.patch .
+
+   Apply the patch by running the following command:
+   ::
+
+      patch -p0 < plone.app.controlpanel.security.py.patch
+
+   You may get this message: "can't find file to patch at input line 1 Perhaps you used 
+   the wrong -p or --strip option? File to patch:" Enter the following:
+   ::
+
+      security.py
+
+8. Overwrite Kupu's html2captioned transform
+
+   Kupu allows for dynamically generated captions on inserted images. eduCommons utilizes
+   this feature to provide license and copyright holder information for embedded images 
+   in documents.  In order for this functionality to occur, the default transformation 
+   must be customized
+   ::
+
+      cp /opt/Zope-2.10.5/web/Products/eduCommons/extras/html2captioned.py /opt/Zope-2.10.5/web/Products/kupu/plone
+
+
+II. Configuration Steps
+-----------------------
+
+1. Launch Zope
+
+   Once Zope has been properly configured it can then be launched via the following
+   commands:
+   ::
+
+      cd /opt/Zope-2.10.5/web
+      sudo bin/zopectl start
+
+   You should now be able to open a browser and go to the ZMI with the following URL
+   (assuming that you configured Zope to run on port 8080)
+   ::
+
+      http://<server name>:8080/manage
+
+   You should then get a dialog prompt asking for your Zope admin username and password.
+
+2. Install eduCommons Product
+
+   Once you have logged into the ZMI via the management interface, you are now ready 
+   to create the site. Start by creating a plone site with the pull down menu in the 
+   top right corner. Give the plone site an ID and title. The ID will be used in the 
+   URL to access the site, so name it appropriately. The title will appear several 
+   places within the eduCommons install, and should be based on your group or institution.
+
+   Under "Extension Profiles" you need to do a multi-select (hold down the CTRL or the 
+   Apple key). Select Working Copy Support (Iterate), ContentLicensing, IMSTransport, LinguaPlone,
+   PloneBookmarklets, Zip File Transport, eduCommons, and Left Skin so they are all highlighted.
+   Then click "Add Plone Site."
+
+   Once the eduCommons instance has been created, you will need to QuickInstall the FileSystemStorage Product.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_quickinstaller
+       3. Select the checkbox to the left of FileSystemStorage
+       4. Click Install
+
+   If you wish to localize content in other languages you will need to QuickInstall install LinguaPlone.
+   This can be done either now from the ZMI or later, via Site Setup --> Add-on Products.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_quickinstaller
+       3. Select the checkbox to the left of LinguPlone
+       4. Click Install
+
+   If you have installed LinguaPlone you will also need to select your supported languages.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_languages
+       3. Select one or more Allowed languages (use the control or apple key to multi-select)
+       4. Click Save 
+
+   Additional instructions for localizing content using LinguaPlone are available in LOCALIZATION.txt.
+
+   Finally, you need to reorder the Layers in your eduCommons Skins Selections.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_skins
+       3. Click on the Properties tab
+       4. Under the Skins Selections, in the Layers textbox for LeftSkin, cut the LinguaPlone entry 
+          and paste it one a new line below the eduCommons entry 
+       5. Click Save (be sure to click the Save button for the Skins selection section)
+
+3. Configure eduCommons
+
+   Additional configuration information is provided in SETUP.txt (or online at
+   http://cosl.usu.edu/projects/educommons/documentation/how-to/educommons-setup-instructions).
+   This will help you to further customize eduCommons.
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/LOCALIZATION.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/LOCALIZATION.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/LOCALIZATION.txt	(revision 126)
@@ -0,0 +1,165 @@
+====================================
+LinguaPlone Translation Instructions
+====================================
+
+In the context of Department, Course, and ECObjects, translations must occur in a 'top down'
+manner.  A Department must be translated prior to translating a Course, which must be
+translated prior to any objects in the Course being translated.
+
+By default, LinguaPlone will tag newly created content objects in the default language setting 
+for the instance. Objects that exist in the ZODB prior to LinguaPlone being installed will be 
+'neutral', in terms of their language setting. In order to maintain the correct relationships 
+between languages, existing objects must have their language 'set'. 
+
+To set an existing object's language, click translate into on the management toolbar, and then 
+click manage translations.... This interface will allow you to change the content language 
+setting from neutral to the appropriate setting for your instance.  
+
+
+========================================
+Localization with eduCommons 3.1.1-final
+========================================
+
+Overview
+--------
+If you want to translate eduCommons into your language, here are instructions on how to get 
+started, as well as some guidelines that you should follow when performing a translation. You do
+not need to know anything about programming to create an eduCommons translation. This 
+has been adapted for eduCommons from the `plone translator guidelines 
+<http://plone.org/development/teams/i18n/translators-guidelines>`__. Please see our `eduCommons
+Localization Team page <./educommons-localization-team>`__ for a list of our volunteer translators.
+
+Introduction
+------------
+Since eduCommons is customized from Plone, it has built-in support for internationalization. As of 
+June 2006 Plone has 56 different translations. eduCommons requires some additional 
+translation work, but follows the same process as Plone. Adding an eduCommons translation is much 
+less time consuming because most of the translation work has already been done in Plone.
+
+There are about 400 strings needed for a translation of eduCommons (compared to about 1600 strings 
+for a Plone translation). Some of these are sentences or paragraphs, but the major part are one or 
+two words. These strings are scattered around in Plone, for example in page templates. Other items 
+to translate are widget labels, and workflow states. All those strings are collected in master 
+files. Currently eduCommons contains six .pot files. Each language requires its own .po files that
+corresponds to the strings or message ids declared in the .pot files. The .pot is the blueprint for
+the .po files.
+
+
+Tools
+-----
+When creating the .po files, we strongly recommend using a specialized tool called poEdit 
+(http://www.poedit.net). This makes the translation process very easy. But a normal 
+text editor work fine if you prefer that (both vim and emacs are great for this, and have special 
+modes for PO files). poEdit exists for both Linux and Windows, and Mac OS X.
+
+If you use a plain text editor instead of a dedicated tool, you should make sure you use utf-8 
+as your charset, even if your country usually uses iso-8859-* or similar. The reason for this is 
+that Plone uses a few characters (like the ellipsis) that don't have representations in other 
+charsets.
+
+
+Step-by-step guide
+------------------
+    1. Check if somebody is working on your language already. Even if they do, contact them and 
+    offer to help with testing. There's no way the eduCommons team can know what is a high-quality 
+    translation in a language they don't know, so your input is very valuable to us. We want 
+    good translations, not just a translation. So if you think something is badly done, tell us. 
+    Give polite feedback if something feels wrong with the translation to your language. A 
+    translation can always be made better.
+    
+    2. Be sure that you have used eduCommons enough to grasp the general concepts and how they 
+    interact. eduCommons is an advanced system, so be sure you know enough before you start 
+    translating key concepts like workflow. Check the language specific terms for your language, 
+    or create one if it doesn't exist. This will help you keep consistent translations for your 
+    language.
+    
+    3. Download the files to base your translation on. We recommend that you always use the 
+    English language files as your starting point, both because they are always the most current 
+    ones (other translations will usually lag a bit behind), and because you should try to match 
+    the original text. Translating between similar languages may be tempting (like Danish and 
+    Norwegian), but will usually result in a lower quality translation. Of course, if the only 
+    language you understand is Italian, and you want to provide a Chinese translation, we prefer 
+    this translation compared to not getting one at all :)
+    
+    4. Here is a link to the most recent translation files available for eduCommons (plone.po and 
+    eduCommons.po). Remember, unless there is already an existing translation available, you need 
+    to grab the .pot files.
+ 
+	http://cosl.usu.edu/svndev/eduCommons3/trunk/i18n/
+	
+	Here are links to the latest translations for each of the eduCommons products on the Plone 
+	Collective site (these links may change, so check back for the most accurate information): 
+
+	http://svn.plone.org/svn/collective/ZipFileTransport/branches/cosl-plone3/i18n/ 
+
+	http://svn.plone.org/svn/collective/IMSTransport/branches/cosl-plone3/i18n/ 
+
+	http://svn.plone.org/svn/collective/ContentLicensing/branches/cosl-plone3/i18n/
+
+        http://svn.plone.org/svn/collective/PloneBookmarklets/branches/plone3/i18n/
+    
+    
+    5. Open poEdit or your editor of choice and load the first of the master files. In poEdit 
+    select File --> Open (for existing .po translation files) or File --> New catalog from POT file. 
+    (to create a new translation from a .pot file). Be sure to set the language and language code in 
+    Catalog --> Settings. With poEdit or other editors you will need to save your new translation files 
+    as <product>-<language-code>.po (e.g. for a French translation: plone-fr.po, eduCommons-fr.po, etc). 
+    Have a look at http://www.i18nguy.com for the correct language code.
+
+    6. In poEdit, the first line shows the exact string that you have to translate. Your translation is 
+    entered in the area below the original string. It's easy. This is why we recommend poEdit.
+    
+    7. In other text editors things will look a little different. An example section can look like this:
+
+      |   #. Default: "Export"
+      |	  #: ../skins/eduCommons/Export_form.cpt
+      |	  msgid "Export"
+      |	  msgstr ""
+      |
+      
+      The first line (marked with Default) shows the exact string that you have to translate. 
+      Message attributes in the form ${foo} have to be included in the translated string exactly 
+      as they are. These are variables that will be filled in the rendering process. Do not touch 
+      this.
+    
+      The next lines (marked with :) list which templates inside eduCommons use this string. There 
+      might be several templates re-using the same string, but it is normally in the same context. 
+      Do not touch this.
+    
+      The next to last line (starting with msgid) holds the unique identifier for the string. Do 
+      not touch this.
+    
+      Finally, the last line is where your job starts. Enter the text in your language, be careful 
+      to keep the same casing (where appropriate, some languages have different rules that should 
+      be applied).
+    
+    8. If there is programming code in a string, only translate the string, not the code. For example in, 
+    Default: "${number} items matching your criteria." you would only translate "items matching your 
+    criteria." The code in the first part should be left as it is, so the translation will look like this:  
+    ${number} TRANSLATION.
+
+    9. Keep translating (but take breaks, this isn't done in one sitting - it's repetetive (but 
+    rewarding) work. After you have translated all of plone.pot, you should start on eduCommons.pot. 
+    Don't worry, you have already completed the biggest part.
+    
+    10. If you can, test your files. Get other people from your own country to test. This means having other 
+    people check your file and putting your file in an eduCommons test instance, browsing it in 
+    your language.
+    
+    11. If you are unsure about the best translation of a message, you can set it to fuzzy, so 
+    others can look at these. Setting a message to fuzzy means adding a "#, fuzzy"-line directly 
+    above the line starting with msgid (poEdit has a button for this).
+    
+    12. Since some of the translation files are hosted on the Plone Collective, if you know how SVN
+    works, you can get an account with Plone (Here's how to request write access to the Collective.)
+    and maintain the files in SVN yourself (see next section). If not, no problem, just e-mail your
+    translation to us at eduCommons [at] cosl [dot] usu [dot] edu, and we will add it for you and put it into the
+    eduCommons distribution in the next release. We will also add you to our our `eduCommons
+    Localization Team page. <./educommons-localization-team>`__
+    
+    13. Please check on your translations periodically to keep them updated as new versions are 
+    released. A quick find for "" will reveal any new or missing stings that need to be translated.
+    
+    14. If you have other questions or about contributing a translation to eduCommons please contact
+    us at educommons [at] cosl [dot] usu [dot] edu. Thank you for you help!
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/MIGRATION.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/MIGRATION.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/MIGRATION.txt	(revision 126)
@@ -0,0 +1,82 @@
+===================================
+Migrating to eduCommons 3.1.1-final
+===================================
+
+
+Preparation
+-----------
+A few things you should do before beginning the migration:
+
+  1. VERY IMPORTANT: SAVE A BACKUP OF YOUR Data.fs FILE, which is located in the [old instance home]/var directory of your eduCommons site. This file contains all of the content for your site. (This way you will able to restore your file from this Data.fs file if anything goes wrong.)
+
+  2. Using the Zope Management Interface (ZMI), export any customizations you have made in your [old site] --> portal_skins --> custom folder and then delete all files in the custom folder. You can re-import these customizations once you have migrated the site.
+
+  3. Verify that your current instance is eduCommons-3.0.2-final.
+
+
+Migration of eduCommons 3.0.2-final to 3.1.1-final
+--------------------------------------------------
+
+The migration eduCommons from version 3.0.2-final to version 3.1.1-final
+includes the following:
+
+  1. Movement of Data.fs file to a new 3.1.1-final instance
+
+  2. Migration to Plone 3.0.6
+
+  3. Migration to the eduCommons 3.1.1-final instance
+
+  4. Final steps
+
+Movement of Data.fs file to a new 3.1.1-final instance
+------------------------------------------------------
+
+For the first step, you will move the Data.fs file from the old instance to
+the new instance. First of all, install an eduCommons-3.1.1-final
+instance using the installations instructions found in [new instance home]/eduCommons/docs/. Stop both sites. Then
+copy the Data.fs file from the var directory of the old site to the
+var directory of the new site:
+::
+
+  sudo cp -rvfp [old instance home]/var/Data.fs [new instance home]/var/
+
+
+Migration of Plone
+------------------
+The following steps need to be performed in the ZMI, as eduCommons-3.1.1-final utlizes Plone 3.0.6, instead of 3.0.4:
+
+  1. Open your 3.1.1-final eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)
+
+  2. Run portal_migration migration (click the upgrade button on the migrate tab)
+
+
+Installation of FileSystemStorage Product
+-----------------------------------------
+At this point in time, we need to ensure that the FileSystemStorage AddOn Product is installed:
+
+  1. Open your 3.1.1-final eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)
+
+  2. Navigate to portal_quickinstaller
+ 
+  3. Select FileSystemStorage
+
+  4. Press Install
+
+Migration of the eduCommons 3.1.1-final instance
+------------------------------------------------
+eduCommons 3.1.1-final uses the portal_setup tool to perform the necessary upgrade from 3.0.2 to 3.1.1-final:
+
+  1. Open your 3.1.1-final eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)
+  2. Navigate to portal_setup
+  3. Press the 'Upgrades' tab
+  4. From the drop down menu, select 'Products.eduCommons:default' and click Choose Profile button.
+  5. Choose the 'Migration :: 3.0.2 to 3.1.0' option
+  6. Press Upgrade
+
+
+Final Steps
+-----------
+
+  Your site should now be migrated. Navigate to your site in the browser and ensure it has migrated.
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/MIGRATIONS_OLD.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/MIGRATIONS_OLD.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/MIGRATIONS_OLD.txt	(revision 126)
@@ -0,0 +1,133 @@
+===================================
+Migrating to eduCommons 3.0.2
+===================================
+
+
+Preparation
+-----------
+A few things you should do before beginning the migration:
+
+  1. VERY IMPORTANT: SAVE A BACKUP OF YOUR Data.fs FILE, which is located in the [old instance home]/var directory of your eduCommons site. This file contains all of the content for your site. (This way you will able to restore your file from this Data.fs file if anything goes wrong.)
+
+  2. Using the Zope Management Interface (ZMI), export any customizations you have made in your [old site] --> portal_skins --> custom folder and then delete all files in the custom folder. You can re-import these customizations once you have migrated the site.
+
+  3. Verify that your current instance is eduCommons-2.3.1-final.
+
+
+Migration of eduCommons 2.3.1-final to 3.0.2
+--------------------------------------------------
+
+The migration eduCommons from version 2.3.1-final to version 3.1.1-final
+includes the following:
+
+  1. Pre-migration of Data.fs in version 2.3.1-final
+
+  2. Movement of Data.fs file to a new 3.0.2 instance
+
+  3. Migration of Plone 3.0.4
+
+  4. Migration of the eduCommons 3.1.1-final instance
+
+  5. Final steps
+
+Pre-migration of Data.fs in version 2.3.1-final
+-----------------------------------------------
+
+For this step, you will need to copy the migration source code found in version 3.1.1-final.  The file is located at eduCommons/extras/PreMigrate.py .
+Copy this into [old instance]/Products/eduCommons/Extensions.
+
+Run the migration script by following these steps:
+
+  1. Open your 2.3.1-final eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)
+
+  2. From the drop down menu, select "External method" and click the Add button.
+
+  3. Enter the following parameters:
+
+     * Id: Pre_Migrate_eduCommons3.0.2
+     * Title: Pre_Migrate_eduCommons3.0.2
+     * Module Name: eduCommons.Migrate
+     * Function Name: pre_migrate_2_3_1_to_3_0_2
+
+  4. Click Add
+
+  5. Click on the Pre_Migrate_eduCommons3.0.2 script you just added
+
+  6. Click the test tab.
+
+  7. Verify that the method ran successfully. (It should give you feedback.)
+
+
+Movement of Data.fs file to a new 3.0.2 instance
+------------------------------------------------------
+
+For the next step you will move the Data.fs file from the old instance to
+the new instance. First of all, install an eduCommons-3.0.2
+instance using the installations instructions found in [new instance home]/eduCommons/docs/. Stop both sites. Then
+copy the Data.fs file from the var directory of the old site to the
+var directory of the new site:
+::
+
+  sudo cp -rvfp [old instance home]/var/Data.fs [new instance home]/var/
+
+
+Migration of Plone
+------------------
+The following steps need to be performed in the ZMI, as eduCommons-3.1.1-final utlizes Plone 3.0.4, instead of 2.5.x:
+
+  1. Open your 3.0.2 eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)
+
+  3. Run portal_migration migration (click the upgrade button on the migrate tab)
+
+
+Migration of the eduCommons 3.0.2 instance
+------------------------------------------------
+Run the migration script included with the 3.1.1-final instance by following these steps:
+
+  1. Copy the migration script found in Products/eduCommons/extras/Migrate.py to [new_instance]/Extensions/
+  2. Open your 3.1.1-final eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)
+  3. Navigate to the root of the ZMI (click the Root Folder link located in the upper left portion of the page)
+  4. From the drop down menu, select "External method" and click the Add button.
+  5. Enter the following parameters:
+
+     * Id: Migrate_eduCommons3.0.2
+     * Title: Migrate_eduCommons2.0.2
+     * Module Name: Migrate
+     * Function Name: migrate_2_3_1_to_3_0_2
+
+  4. Click Add
+  5. Click on the Migrate_eduCommons3.0.2 script you just added
+  6. Click the test tab.
+  7. Verify that the method ran successfully. (It should give you feedback.)
+
+
+Final Steps
+-----------
+
+  Your site should now be migrated. Navigate to your site in the browser and ensure it has migrated.
+  Based on the nature of the changes from Plone 2.5.x to Plone 3.0.4, if you performed major customizations, you may or may not need to refactor those changes to work properly in a Plone 3 environment.
+
+  Here are some additional steps you may need to follow after migration, depending on how you have customized your site:
+
+  1. Check Course Homepage and About the Professor pages to see if the images render. In past versions of eduCommons, some of these image links may be broken, but rendered due to acquisition. The course folder appears twice in the link (i.e. department/course/course/page).
+
+  2. The Site homepage links to the Courses List, Frequently Asked Questions, and Help will need to be modified as follows:
+
+     * OLD: <a title="List of Courses" href="/Courses_listing/">list of courses</a>.
+     * NEW: <a title="List of Courses" href="/courselist/">list of courses</a>.
+     * OLD: <a title="Frequently Asked Questions" href="/Help/">Frequently Asked Questions</a>
+     * NEW: <a title="Frequently Asked Questions" href="/help/">Frequently Asked Questions</a>
+     * OLD: <a title="Feedback" href="/Feedback/">feedback</a>
+     * NEW: <a title="Feedback" href="/feedback/">feedback</a>
+
+  3. The Site's About page links to the Terms of Use and Privacy Policy will need to be modified as follows:
+
+     * OLD: <a title="Terms of Use" href="../About/terms_of_use">Terms of Use</a>
+     * NEW: <a title="Terms of Use" href="../about/terms_of_use">Terms of Use</a>
+     * OLD: <a title="Privacy Policy" href="../About/privacy_policy">Privacy Policy</a>
+     * NEW: <a title="Privacy Policy" href="../about/privacy_policy">Privacy Policy</a>
+
+  4. The top banner, portal logo, and top nav color setting can be checked and adjusted by managers and administrators via Site Setup --> Left Skin Settings. Any changes made to these settings must be done after having checked the Development Mode box. In order to change the background color in the top nav color, a 1px x 1px transparent gif needs to be loaded first to hide the top nav background image. Be sure to uncheck the Development Mode box after Left Skin changes have been saved to improve site performance.
+
+  5. In order to restore the "Join" link, login to the site as manager and click Site Setup --> Security. Then check the "Enable self-registration" box and click save.
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/PORTLETS.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/PORTLETS.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/PORTLETS.txt	(revision 126)
@@ -0,0 +1,202 @@
+Adding Portlets To eduCommons
+------------------------------
+
+A portlet is a user-interface component that can be "plugged-in" to the architecture of Plone, the framework upon which eduCommons is based. There are several portlets that are natively available when you install eduCommons: the Course Info portlet that appears in the right navigation is an example, the Course Builder portlet is another. This tutorial will explain how portlets can be added and removed and how you can create your own portlet from scratch.
+
+- `Adding and Removing Existing Portlets`_
+
+- `Creating Your Own Portlet`_.
+
+- `Customizing Portlets`_.
+
+- `OerRecommender Portlet`_.
+
+- `CourseBuilder Portlet`_.
+
+- `CourseInfo Portlet`_.
+
+- `Additional Resources`_.
+
+.. _Adding and Removing Existing Portlets:
+
+Adding and Removing Existing Portlets
+-------------------------------------
+If a portlet already exists that you either want to remove or add, follow these steps.
+
+- navigate to the site as an administrator.
+- click on the *manage portlets* link. 
+
+The *manage portlets* page allows you to add and remove portlets. 
+
+- To add a portlet click on the *Add portlet...* drop down menu and select the portlet to add. 
+- To delete a portlet click on the small red *x* next to the portlet to remove.
+
+You can also change the order that the portlets appear by using the small blue arrows next to the porlets.
+
+.. _Creating Your Own Portlet:
+
+Creating Your Own Portlet
+-------------------------
+One of the simplest ways to create a portlet is to use the ZopeSkel tool to create a skeleton product that you can then modify for your own purposes. The Plone site has an `excellent article describing how to install and use the ZopeSkel tool`_. Once you have ZopeSkel installed you can create a new portlet package using the plone3_portlet template.
+
+.. _excellent article describing how to install and use the ZopeSkel tool: http://plone.org/documentation/how-to/use-paster/
+
+::
+
+  paster create -t plone3_portlet
+
+Enter the information, as prompted, for the portlet you are creating. To select the defaults, just press enter.
+
+::
+
+  Enter project name: SamplePortletProject
+  Variables:
+    egg:      SamplePortletProject
+    package:  sampleportletproject
+    project:  SamplePortletProject
+  Enter namespace_package (Namespace package (like plone)) ['collective']: sample_portlet_project 
+  Enter namespace_package2 (Nested namespace package (like app)) ['portlet']: 
+  Enter package (The package contained namespace package (like example)) ['example']: 
+  Enter zope2product (Are you creating a Zope 2 Product?) [True]: 
+  Enter version (Version) ['0.1']: 
+  Enter description (One-line description of the package) ['']: This is a sample portlet product
+  Enter long_description (Multi-line description (in reST)) ['']: 
+  Enter author (Author name) ['Plone Foundation']: 
+  Enter author_email (Author email) ['plone-developers@lists.sourceforge.net']: 
+  Enter keywords (Space-separated keywords/tags) ['']: 
+  Enter url (URL of homepage) ['http://plone.org']: 
+  Enter license_name (License name) ['GPL']: 
+  Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: 
+  Enter portlet_name (Portlet name (human readable)) ['Example portlet']: Sample Portlet
+  Enter portlet_type_name (Portlet type name (should not contain spaces)) ['ExamplePortlet']: SamplePortlet
+
+A portlet package will be created in the folder where you ran the script. Follow the directions in the Plone article to install the new portlet package using easy_install. Another option is to tell the paster script to create a Plone 2 product and then copy this product into the Products directory of your plone instance (the Plone 2 product is buried down a few levels in the package). In either case, after you restart your Plone instance and navigate to the *Add-on Products* page of your Plone site you will see the new product listed. After installing the product into your Plone site you will be able to manage it as you do the other portlets in your site.
+
+
+.. _Customizing Portlets:
+
+Customizing Portlets
+----------------------
+
+If you look at the code, generated in the last section, you will see that this new product is relatively simple. It contains a configure.zcml file, a template file, a python file, a profile folder, and a tests folder. Often the only places that will need to be changed to customize the portlet will be the template file and the renderer within the python file. Here are some examples of portlets that do just that:
+
+.. _OerRecommender Portlet:
+
+OerRecommender Portlet
+======================
+This is the oerrecommender.pt_ template file for the oerrecommender. The file consists of a script tag that retrieves a series of recommendations from oerrecommender.org. 
+
+::
+    
+  <div id="recommendations">
+    <script language="JavaScript"
+            tal:define="url here/absolute_url"
+            tal:attributes="src string:http://www.oerrecommender.org/recommendations.pjs?educommons=true&u=${url}&title=true;"
+            type="text/javascript">
+    </script>
+  </div>
+
+.. _oerrecommender.pt: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/oerrecommender.pt
+
+Here is the renderer for the oerrecommenderportlet.py_ file.
+
+::
+
+  class Renderer(base.Renderer):
+      """ Render the OER Portlet """
+      render = ViewPageTemplateFile('oerrecommender.pt')
+
+      def __init__(self, context, request, view, manager, data):
+          super(Renderer, self).__init__(context, request, view, manager, data)
+          self.props = self.context.portal_properties.educommons_properties
+
+      @property
+      def available(self):
+          return self.props.oerrecommender_enabled
+
+.. _oerrecommenderportlet.py: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/oerrecommenderportlet.py
+
+You'll notice that the renderer is where we define which page template to use when rendering the template. This file also contains a property that allows the portlet to be conditionally displayed based on whether the oerrecommender is enabled.
+
+.. _CourseBuilder Portlet:
+
+CourseBuilder Portlet
+======================
+The Course Builder tool allows users to quickly create a course with its associated files and departments.  In this coursebuilder.pt_ template file you can see the portlet displaying a link to the Course Builder form (the '@@' symbol signifies that the resource is a view).
+
+.. _coursebuilder.pt: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/coursebuilder.pt 
+
+::
+
+  <dl class="portlet portletCourseBuilder"
+      i18n:domain="eduCommons">
+
+    <dt class="portletHeader"
+        i18n:translate="box_course_builder">
+      Course Builder
+    </dt>
+
+    <dd class="portletItem even">
+      <a href=""
+           i18n:translate="text_build_course"
+           tal:attributes="href string:${here/portal_url}/@@coursebuilderform">Build a Course</a>
+    </dd>
+
+  </dl>
+
+.. _CourseInfo Example:
+
+CourseInfo Portlet
+======================
+The CourseInfo portlet displays course statistics for the objects within each course. Methods are defined with the python file that are then used with the template file. For example, the renderer for the portlet in the courseinfoportlet.py_ file contains several methods
+
+.. _courseinfoportlet.py: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/courseinfoportlet.py 
+
+::
+
+  ...
+  def statePercent(self, state=''):
+    """ return the percent value for a given state """
+
+    if 0 == self.total:
+      return '0%'
+    else:
+      width = float(self.stateCounts[state])/float(self.total) * 100.0
+      return '%d%%' %int(width)
+  ...
+
+that are then used in the courseinfo.pt_ template file.
+
+::
+
+  ...
+      <img alt="barchart" class="statecolumnimage"
+                   tal:attributes="width python:view.statePercent(item);
+                   src string:bargraphic.gif" />
+  ...
+
+
+.. _courseinfo.pt: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/courseinfo.pt 
+
+.. _Additional Resources:
+
+Additional Resources
+--------------------
+
+There are some great resources to help you in customizing existing portlets and for adding functionality to portlets that you've created using the ZopeSkel product.
+
+If you would like to do some quick and dirty customization through-the-web you'll probably want to `use the portal_view_customizations tool`_ in the ZMI. It's similar to portal_skins but for view, viewlets, and portlets.
+
+.. _use the portal_view_customizations tool: http://plone.org/documentation/tutorial/customization-for-developers/tutorial-all-pages
+
+Martin Aspeli has a whole tutorial on customizing a plone site which includes a section on `customizing portlet renderers`_.
+
+.. _customizing portlet renderers: http://plone.org/documentation/tutorial/customization-for-developers/portlet-renderers
+
+The Plone site also has a tutorial that shows how to `override existing portlets`_.
+
+.. _override existing portlets: http://plone.org/documentation/how-to/override-the-portlets-in-plone-3.0/?searchterm=add%20new%20portlet
+
+
+
+ 
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/__init__.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/__init__.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/__init__.py	(revision 126)
@@ -0,0 +1,28 @@
+from Products.CMFCore.utils import ContentInit
+from config import PROJECTNAME, GLOBALS
+from Products.CMFCore.permissions import AddPortalContent
+from Products.Archetypes.atapi import process_types, listTypes
+from Products.CMFCore.DirectoryView import registerDirectory
+from AccessControl import allow_module, allow_class
+from collective.captcha.browser.captcha import Captcha
+from zope.i18nmessageid import MessageFactory
+
+allow_module('collective.captcha.browser.captcha')
+allow_class(Captcha) 
+
+def initialize(context):
+
+    import content
+
+    content_types, constructors, ftis = process_types(listTypes(PROJECTNAME), PROJECTNAME)
+
+    ContentInit(PROJECTNAME + ' Content',
+                content_types=content_types,
+                permission=AddPortalContent,
+                extra_constructors=constructors,
+                fti=ftis,
+                ).initialize(context)
+
+eduCommonsMessageFactory = MessageFactory('eduCommons')
+
+registerDirectory('skins', GLOBALS)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/__pkginfo__.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/__pkginfo__.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/__pkginfo__.py	(revision 126)
@@ -0,0 +1,78 @@
+##################################################################################
+#    Copyright (C) 2004-2007 Utah State University, All rights reserved.          
+#                                                                                 
+#    This program is free software; you can redistribute it and/or modify         
+#    it under the terms of the GNU General Public License as published by         
+#    the Free Software Foundation; either version 2 of the License, or            
+#    (at your option) any later version.                                          
+#                                                                                 
+#    This program is distributed in the hope that it will be useful,              
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of               
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                
+#    GNU General Public License for more details.                                 
+#                                                                                 
+#    You should have received a copy of the GNU General Public License            
+#    along with this program; if not, write to the Free Software                  
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    
+#                                                                                 
+##################################################################################
+
+__author__ = 'Brent Lambert, David Ray, Jon Thomas'
+__docformat__ = 'restructuredtext'
+__version__ = "$Revision: 1 $"[11:-2]
+
+modname = 'eduCommons'
+version = '3.2.0-pre'
+numversion = (3,2,0)
+at_versions = ('3.2.0 pre',)
+
+
+license = "GNU Public"
+license_text = \
+"""This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+MA 02111-1307 USA"""
+
+copyright = \
+"""This software is Copyright (C) 2004-2006 Utah State University. 
+All rights reserved."""
+
+author = "Brent Lambert, David Ray, Jon Thomas"
+author_email = "educommons@cosl.usu.edu"
+
+short_desc = \
+"""eduCommons is an OpenCourseware management system that is an
+   an extention to the Plone content management system (www.plone.org) and is 
+   developed by the COSL group (http://cosl.usu.edu) at
+   Utah State University. Development of EduCommons is funded by the William and
+   Flora Hewlett Foundation."""
+
+long_desc = \
+"""eduCommons is server software designed to provide last-mile support for open 
+access initiatives like Utah State University OpenCourseWare or MIT OpenCourseWare. 
+Many institutions already deliver digital educational materials via a closed access 
+learning management system like WebCT or Blackboard. With this existing collection 
+of digitized educational materials, such an institution is very close to being 
+able to launch its own open access collection initiative. eduCommons begins here, 
+providing the remaining functionality necessary to successfully develop and 
+manage the collection, including a workflow process that steps users through 
+uploading materials into the repository, the copyright clearance process, 
+reassembly of materials into courses, a quality assurance process, and final 
+publication of the materials. Powered by Python, Zope, and Plone, eduCommons 
+is open source software that runs on Linux, Mac OS X, and Windows platforms."""
+
+web = "http://cosl.usu.edu/projects/educommons/"
+ftp = ""
+mailing_list = ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/__init__.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/__init__.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/__init__.py	(revision 126)
@@ -0,0 +1,537 @@
+########################################################################
+#
+#    Copyright (C) 2006 Utah State University, All rights reserved.
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+##################################################################################
+
+__author__  = '''Brent Lambert, David Ray, Jon Thomas'''
+__docformat__ = 'plaintext'
+__version__   = '$ Revision 0.0 $'[11:-2]
+
+from zope.publisher.browser import BrowserView
+from zope.component import getUtility
+from zope.annotation.interfaces import IAnnotations
+from collective.contentlicensing.browser import RSSView as DefaultRSSView
+from collective.contentlicensing.browser import CopyrightBylineView as DefaultCopyrightBylineView
+from Products.CMFPlone.utils import getToolByName
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from collective.contentlicensing.utilities.interfaces import IContentLicensingUtility
+from Products.Five.formlib.formbase import EditForm
+from urlparse import urlsplit
+from xml.dom import minidom
+from string import split, find
+import urllib
+from Acquisition import aq_base, aq_inner, aq_parent
+
+
+class ClearCopyrightField(BrowserView):
+    """ Render the additional cleared copyright field in the edit form  """
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getClearedCopyright(self):
+        """ Get the clear copyright value from the object  """
+        annotations = IAnnotations(self.context)
+	if annotations.has_key('eduCommons.clearcopyright'):
+            return annotations['eduCommons.clearcopyright']
+        else:
+	    return
+
+class ChangeCopyrightForm(BrowserView):
+    """ Test  """
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+class AccessibilityCompliantField(BrowserView):
+    """ Render the additional accessibility compliant field in the edit form  """
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+    def getAccessibilityCompliant(self):
+        """ Get the Accessibility Compliant value from the object  """
+        annotations = IAnnotations(self.context)
+	if annotations.has_key('eduCommons.accessible'):
+            return annotations['eduCommons.accessible']
+        else:
+	    return
+
+class ChangeAccessibleCompliantForm(BrowserView):
+    """ Test  """
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+
+
+class SkinlessView(BrowserView):
+    """ Render a view without the CMS chrome  """
+
+    def getSkinlessView(self):
+        """ Set Titles based on type and get body  """
+       
+        if self.context.Type() in ['Page', 'Division']:
+            title = self.context.Title()
+            content = self.context.getText()
+        else:
+            #Get Full Course Title
+            portal_catalog = self.context.portal_catalog
+            brain = portal_catalog(Title=self.context.Title())[0]
+            self.ecutil = getUtility(IECUtility)
+            title = self.ecutil.getFullCourseTitle(brain)
+            content = self.context.getText()
+
+        return title, content
+
+class SortedCourseListingView(BrowserView):
+    """ Return Courses in the Dept sorted by full course name  """
+
+    def getSortedCourses(self):
+        """ Get Sorted Courses  """
+    
+        self.ecutil = getUtility(IECUtility)
+        portal_catalog = self.context.portal_catalog
+        brains = portal_catalog(path= {'query':'/'.join(self.context.getPhysicalPath())+'/', 'depth':2}, portal_type='Course')
+
+        brains = list(brains)
+        brains.sort(lambda x, y : cmp(self.ecutil.getFullCourseTitle(x),self.ecutil.getFullCourseTitle(y)))
+
+        return brains
+
+class SortedCrossCourseListingView(BrowserView):
+    """ Return Cross listed Courses in the Dept sorted by full course name  """
+
+    def getSortedCrossCourses(self):
+        """ Get Sorted Cross Listed Courses  """
+    
+        self.ecutil = getUtility(IECUtility)
+        portal_catalog = self.context.portal_catalog
+        portal = self.context.portal_url.getPortalObject()
+        brains = portal_catalog(path= {'query':'/'.join(portal.getPhysicalPath())+'/'}, portal_type='Course')
+
+        crosslisted_courses = []
+        for brain in brains:
+            obj = brain.getObject()
+            if self.context.id in obj.crosslisting:
+                crosslisted_courses += [brain]
+        crosslisted_courses = list(crosslisted_courses)
+        crosslisted_courses.sort(lambda x, y : cmp(self.ecutil.getFullCourseTitle(x),self.ecutil.getFullCourseTitle(y)))
+
+        return crosslisted_courses
+
+class SortedResourceListingView(BrowserView):
+    """ Return Non-Course objects in the Dept sorted by name  """
+
+    def getSortedResources(self):
+        """ Get Sorted Resources  """
+        resources = []
+        brains = self.context.getFolderContents()
+        for brain in brains:
+            if 'Course' != brain.portal_type and brain.getObject().getExcludeFromNav() == False:
+                resources += [brain]
+            
+        resources = list(resources)
+
+        resources.sort(lambda x, y : cmp(x.id, y.id))
+
+        return resources
+
+
+class PositionView(BrowserView):
+
+    def __call__(self):
+        context = self.context
+        position = self.request['position']
+        id = self.request['id']
+        url = self.request['url']
+        
+        if position == 'up':
+            self.moveUp(context, position, id, url)
+        elif position == 'down':
+            self.moveDown(context, position, id, url)
+        else:
+            return
+
+
+    def moveUp(self, context, position, id, path):
+        objs = self.getNavObjects(context)
+
+        if len(objs) <= 1:
+            return
+
+        if objs[0].getPath() == path:
+            return
+
+        prev_obj = objs[0]
+
+        for obj in objs[1:]:
+            if path == obj.getPath():
+                self.swapPosition(obj.getObject(), prev_obj.getObject())
+                break
+
+            prev_obj = obj
+
+        context.request.response.redirect('order_courseobjs')
+                
+
+    def moveDown(self, context, position, id,path):
+        objs = self.getNavObjects(context)
+        
+        if len(objs) <= 1:
+            return
+
+        prev_obj = None
+        index = 0
+        for obj in objs:
+
+            if len(objs) == index:
+                return
+
+            if prev_obj:
+                self.swapPosition(obj.getObject(), prev_obj.getObject())
+                break
+            if path == obj.getPath():
+                prev_obj = obj
+
+            index += 1
+
+        context.request.response.redirect('order_courseobjs')
+
+    def swapPosition(self, cur_obj, swp_obj):
+        tmp_pos = IAnnotations(cur_obj)['eduCommons.objPositionInCourse']
+        IAnnotations(cur_obj)['eduCommons.objPositionInCourse'] = IAnnotations(swp_obj)['eduCommons.objPositionInCourse']
+        IAnnotations(swp_obj)['eduCommons.objPositionInCourse'] = tmp_pos
+        cur_obj.reindexObject()
+        swp_obj.reindexObject()
+        
+    def getNavObjects(self, context):
+        contentFilter={'path':{'query':'/'.join(context.getPhysicalPath())+'/'},'sort_on':'getObjPositionInCourse'}
+        brains = context.portal_catalog.searchResults(contentFilter)
+        return [brain for brain in brains if not getattr(brain.aq_explicit, 'exclude_from_nav', True)]
+
+class RSSView(DefaultRSSView):
+    """ Implements eduCommons RSS view """
+
+    def getRSSObjects(self):
+        """ Get RSS objects. """
+        if self.context.Type() in ['Division', 'Course']:
+            syn = self.context.portal_syndication
+            objs = list(syn.getSyndicatableContent(self.context))
+            objs.reverse()
+
+        else:
+            objs = self.context.portal_catalog.searchResults(portal_type='Course',
+                                                             sort_on='modified',
+                                                             sort_order='reverse')
+        return objs
+
+
+def unicode_sanitize(text):
+    """
+    Intended to be used to correct the inconsistency of plone when you call
+    methods such as Title or Publisher which should ALLWAYS return a unicode
+    object if the output is text.
+    """
+    if isinstance(text,list):
+        sanit_list = []
+        for item in text:
+            if isinstance(item, str):
+                sanit_list += item.decode('utf-8')
+            else:
+                sanit_list += item
+        text = sanit_list          
+    elif isinstance(text, str):
+        text = text.decode('utf-8')
+    return text
+
+
+class CopyrightBylineView(BrowserView):
+    """ Implements eduCommons Citation view for customized Creator information """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.props = self.context.portal_url.portal_properties.content_licensing_properties
+        self.clutil = getUtility(IContentLicensingUtility)
+        self.ecutil = getUtility(IECUtility)
+
+    def getLicenseByline(self):
+        """ Get the license byline fields for an object. """
+
+        copyright = self.context.Rights()
+        if not copyright:
+            copyright = self.props.DefaultSiteCopyright
+        holder, license = self.clutil.getLicenseAndHolderFromObject(self.context)
+        if '(site default)' == holder:
+            holder = self.props.DefaultSiteCopyrightHolder
+        if 'Site Default' == license[0]:
+            license = self.props.DefaultSiteLicense
+        license_name = license[1]
+        if not license_name or 'None' == license_name:
+            license_name = ''
+        if 'Creative Commons License' == license[0]:
+            license_name = license[0]
+        license_url = license[2]
+        if not license_url or 'None' == license_url:
+            license_url = ''
+        license_button = license[3]
+        if not license_button or 'None' == license_button:
+            license_button = ''
+        return copyright, holder, license_name, license_url, license_button
+
+
+
+    def getCitationInfo(self):
+        """ Gets the citation information """
+
+        # Title
+        title = self.context.title
+        title = title.replace('--', '-')
+
+        # Creators
+        creator = ''
+        index = 1
+
+        parent = self.ecutil.FindECParent(self.context)
+        parentType = parent.Type()
+        names = []
+        if '(course_default)' in self.context.Creators() and parentType == 'Course':
+            if parent.instructorAsCreator == True:
+                instr_name = parent.instructorName
+                names = [instr_name.strip()]
+                names += [name.strip() for name in parent.Creators()]
+                if len(self.context.Creators()) > 1:
+                    names += [name.strip() for name in self.context.Creators()[1:]]
+        elif self.context.Type() == 'Course':
+            if self.context.instructorAsCreator == True:
+                instr_name = self.context.instructorName
+                names = [instr_name.strip()]
+            names += [name.strip() for name in self.context.Creators()]
+        else:
+            names += [name.strip() for name in self.context.Creators()]
+            
+        for cr in names:
+            inits = ''
+            crs = []
+
+            crs = cr.split(' ')
+            
+
+            for part in crs[:-1]:
+                inits += ' ' + part[0] + '.'   
+        
+            creator += crs[-1]
+            if inits:
+                creator += "," + inits
+            creator += ', '
+            index += 1
+            
+        if creator:
+            creator = creator[:-2]
+            if creator:
+                if creator[-1] != '.':
+                    creator += '.'
+         
+        id = self.context.getId()
+        
+        portal_url = getToolByName(self.context, 'portal_url')
+        portal_name = portal_url.getPortalObject().title
+        
+        create_date = self.context.creation_date.strftime('%Y, %B %d')
+        
+          
+        url = self.context.absolute_url()
+
+        import datetime
+        date = datetime.date.today().strftime('%B %d, %Y')
+ 
+        
+        if creator:
+            prompt_text = "%s (%s). %s. Retrieved %s, from %s Web site: %s." %(unicode_sanitize(creator),create_date,unicode_sanitize(title),date,unicode_sanitize(portal_name),url)
+        else:
+            prompt_text = "%s. (%s). Retrieved %s, from %s Web site: %s." %(unicode_sanitize(title),create_date,date,unicode_sanitize(portal_name),url)
+
+        return prompt_text.replace('\'','\\\'').replace('\"','\\\'')
+  
+
+
+
+class RDFMetadataView(BrowserView):
+    """ Express Dublin Core As Rdf  """
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.document = minidom.Document()
+        self.clutil = getUtility(IContentLicensingUtility)
+        self.ecutil = getUtility(IECUtility)
+        self.props = self.context.portal_url.portal_properties.content_licensing_properties
+        self.holder, self.license = self.clutil.getLicenseAndHolderFromObject(context)
+
+    def writeRDF(self):
+        """ Write RDF metadata """
+        parent = self.ecutil.FindECParent(self.context)
+        if 'Creative Commons License' == self.license[0] or ('Creative Commons License' == self.props.DefaultSiteLicense[0] and 'Site Default' == self.license[0]):
+            if self.license[0] == 'Site Default':
+                self.license = self.props.DefaultSiteLicense
+            data = self.getCCLicenseRDF(parent)
+        else:
+            data = self.getRDFMetadata(parent)
+        # Remove the XML header
+        index = find(data, '\n')
+        if (index > -1):
+            data = data[index + 1:]
+	return data
+
+    def getRDFMetadata(self, parent):
+        """ Write metadata fields as RDF. """
+        rdf_node = self._createNode(self.document, 'rdf:RDF',
+                       attrs=[('xmlns:rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'),
+                              ('xmlns:dc', 'http://purl.org/dc/elements/1.1/'),
+                              ('xmlns:dcterms', 'http://purl.org/dc/terms')])
+        desc_node = self._createNode(rdf_node, 'rdf:Description',
+                        attrs=[('rdf:about', self.context.renderBase())])
+        self._writeDCMetadata(desc_node, parent)
+        return self.document.toprettyxml()        
+                                
+
+    def getCCLicenseRDF(self, parent):
+        """ Write into RDF CC License elements. """
+        holder, license = self.clutil.getLicenseAndHolderFromObject(self.context)
+        licenseId = ''
+        if len(self.license) >= 3:
+            lid = urlsplit(self.license[2])
+            if len(lid) >= 3:
+                lid = lid[2].split('/')
+                if len(lid) >= 3:
+                    licenseId = lid[2]
+
+        if licenseId and self.clutil.hasCCLicenseInfo(licenseId):
+
+            cc_rdf = self.clutil.getCCLicenseInfo(licenseId)
+        
+            rdf_node = self._createNode(self.document, 'rdf:RDF',
+                           attrs=[('xmlns', 'http://web.resource.org/cc/'),
+                                  ('xmlns:dc', 'http://purl.org.dc/elements/1.1/'),
+                                  ('xmlns:rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#')])
+            work_node = self._createNode(rdf_node, 'Work', attrs=[('rdf:about',
+                                                                   self.context.renderBase())])
+            self._writeDCMetadata(work_node, parent)
+            self._createNode(work_node, 'license', attrs=[('rdf:resource', self.license[2])])
+            return self.document.toprettyxml()
+        else:
+            return ''
+
+    def _writeDCMetadata(self, node, parent):
+        """ Write the dublin core metadata in RDF. """
+
+        # Identifier
+        self._createNode(node, 'dc:identifier', self.context.renderBase())
+
+        # Title
+        self._createNode(node, 'dc:title', self.context.Title())
+
+        # Language
+        lang = self.context.Language()
+        if not lang:
+            po = self.context.portal_url.getPortalObject()
+            lang = po.portal_properties.site_properties.getProperty('default_language')
+        self._createNode(node, 'dc:language', lang) 
+
+        # Description
+        desc = self.context.Description()
+        if desc:
+            self._createNode(node, 'dc:description', self.context.Description()) 
+
+        # Subject
+        self._renderList(node, 'dc:subject', self.context.Subject())
+
+        # Type
+        self._createNode(node, 'dc:type', self.context.Type()) 
+
+        #Creators
+        parent = self.ecutil.FindECParent(self.context)
+        parentType = parent.Type()
+        course_creators = '',
+
+
+        if '(course_default)' in self.context.Creators() and parentType == 'Course':
+            if parent.instructorAsCreator == True:
+                cres = parent.instructorName
+                course_creators = cres,
+            for creator in parent.Creators():
+                course_creators += creator,
+            if len(self.context.Creators()) > 1:
+                course_creators += self.context.Creators()[1:]
+            self._renderList(node, 'dc:creator', course_creators)
+        elif self.context.Type() == 'Course':
+            if self.context.instructorAsCreator == True:
+                cres = self.context.instructorName
+                course_creators = cres,
+            for creator in self.context.Creators():
+                course_creators += creator,
+            self._renderList(node, 'dc:creator', course_creators)
+        else:
+            for creator in self.context.Creators():
+                course_creators += creator,
+            self._renderList(node, 'dc:creator', course_creators)
+
+
+        # Contributors
+        self._renderList(node, 'dc:contributor', self.context.Contributors())
+
+        # Publisher
+        self._createNode(node, 'dc:publisher', self.context.portal_url.getPortalObject().Publisher()) 
+
+        # Format
+        self._createNode(node, 'dc:format', self.context.Format()) 
+
+        # Rights
+        rights = self.context.Rights()
+        if not rights:
+            rights = self.props.DefaultSiteCopyright
+        self._createNode(node, 'dc:rights', rights) 
+
+    def _renderList(self, node, element, value):
+        """ Render a list of items in RDF. """
+        if value:
+            if len(value) > 1:
+                value_node = self._createNode(node, element)
+                bag_node = self._createNode(value_node, 'rdf:Bag')
+                for x in value:
+                    self._createNode(bag_node, 'rdf:li', x)
+            else:
+                self._createNode(node, element, value[0])
+        
+
+    def _createNode(self, parent, ename, value=None, attrs=None):
+        """ Create a node in the document. """
+        newNode = self.document.createElement(ename)
+        parent.appendChild(newNode)
+        if value:
+            value = value.replace('--','-')
+            newNode.appendChild(self.document.createTextNode(unicode_sanitize(value)))
+        if attrs:
+            for x in attrs:
+                newNode.setAttribute(x[0], unicode_sanitize(x[1]))
+        return newNode
+
+
+
+
+        
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/accessibility_compliant.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/accessibility_compliant.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/accessibility_compliant.pt	(revision 126)
@@ -0,0 +1,37 @@
+<div metal:define-macro="accessibility_compliant_fields" tal:omit-tag="">
+
+
+  <div class="field"
+       tal:define="accessibilitycompliant view/getAccessibilityCompliant;">
+
+    <input type="checkbox"
+	   id="accessibilitycompliant"
+	   name="accessibilitycompliant:boolean"
+	   tal:attributes="checked accessibilitycompliant" />
+
+    <input value="False" name="accessibilitycompliant:boolean:default" type="hidden" />
+
+    <label for="accessibilitycompliant"
+	   i18n:domain="eduCommons"
+	   i18n:translate="">Accessible</label>
+
+
+    <div class="formHelp" id="accessibilitycompliant_help"
+	 i18n:domain="eduCommons"
+	 i18n:translate="">
+      Set the accessibility flag if your content meets the criteria outlined 
+      <span i18n:name="link_accessibility">
+	<a href="" 
+	   tal:attributes="href string:./help/accessibility-guidelines" 
+	   i18n:translate=""
+	   target="blank">here</a>
+      </span>.
+    </div>
+    <div>
+    </div>
+
+
+  </div>
+
+
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/accessibilityview.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/accessibilityview.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/accessibilityview.py	(revision 126)
@@ -0,0 +1,23 @@
+from zope.publisher.browser import BrowserView
+from zope.annotation.interfaces import IAnnotations
+from enpraxis.educommons.interfaces import IAccessibilityCompliantable
+from enpraxis.educommons import eduCommonsMessageFactory as _
+
+
+class AccessibilityCompliantView(BrowserView):
+    """ Provides view of object with access to annotations in placeless environments"""
+    def changeAccessibility(self, value):
+        """ Provides annotation to placeless script """
+        context = self.context
+        message = ''        
+        if IAccessibilityCompliantable.providedBy(context):
+            anno = IAnnotations(context)
+            if value == 'True':
+                anno['eduCommons.accessible'] = True
+                message=_(u'Accessibility Compliant set to True')
+            elif value == 'False':
+                anno['eduCommons.accessible'] = False
+                message=_(u'Accessibility Compliant set to False')
+        return message
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/ada_compliant.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/ada_compliant.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/ada_compliant.pt	(revision 126)
@@ -0,0 +1,31 @@
+<div metal:define-macro="ada_compliant_fields" tal:omit-tag="">
+
+
+  <div class="field"
+       tal:define="adacompliant view/getADACompliant;">
+
+    <input type="checkbox"
+	   id="adacompliant"
+	   name="adacompliant:boolean"
+	   tal:attributes="checked adacompliant" />
+
+    <input value="False" name="adacompliant:boolean:default" type="hidden">
+
+    <label for="adacompiant"
+	   i18n:domain="eduCommons"
+	   i18n:translate="">Accessible</label>
+
+
+    <div class="formHelp" id="adacompliant_help"
+	 i18n:domain="eduCommons"
+	 i18n:translate="">
+      Set the accessibility flag if your content meets the criteria outlined *LINK HERE*
+    </div>
+    <div>
+    </div>
+
+
+  </div>
+
+
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/adaview.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/adaview.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/adaview.py	(revision 126)
@@ -0,0 +1,23 @@
+from zope.publisher.browser import BrowserView
+from zope.annotation.interfaces import IAnnotations
+from enpraxis.educommons.interfaces import IAccessibilityCompliantable
+
+
+class ADACompliantView(BrowserView):
+    """ Provides view of object with access to annotations in placeless environments"""
+    def changeADA(self, value):
+        """ Provides annotation to placeless script """
+        context = self.context
+        message = ''        
+        if IAccessibilityCompliantable.providedBy(context):
+            anno = IAnnotations(context)
+            if value == 'True':
+                anno['eduCommons.ADA'] = True
+                message=_(u'ADA Compliant set to True')
+            elif value == 'False':
+                anno['eduCommons.ADA'] = False
+                message=_(u'ADA Compliant set to False')
+        return message
+
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/cc_table.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/cc_table.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/cc_table.pt	(revision 126)
@@ -0,0 +1,180 @@
+<div id="folderlisting-main-table"
+     i18n:domain="plone">
+  <input type="hidden" name="sort_on"
+         tal:attributes="value request/sort_on|string:getObjPositionInParent"
+         />
+  <input type="hidden" name="pagenumber" tal:attributes="value view/batch/pagenumber"/>
+  <input type="hidden" name="orig_template" tal:attributes="value view/viewname"/>
+  <tal:block condition="view/selectall">
+    <input type="hidden" name="paths:list"
+           tal:repeat="item view/batch/items_not_on_page"
+           tal:attributes="value item/path"/>
+  </tal:block>
+
+  <!-- <div metal:use-macro="context/document_actions/macros/document_actions">
+      Document actions (print, sendto etc)
+  </div> -->
+  <p class="discreet"
+     tal:condition="not: view/batch"
+     i18n:translate="description_no_visible_items_add_paste">
+     This folder has no visible items. To add content, press the
+     add button, or paste content from another location.
+  </p>
+
+  <metal:listing define-macro="folder_listing"
+                 tal:define="nosortclass view/get_nosort_class">
+                             
+  <div class="visualClear" id="clear-space-before-navigation"><!-- --></div>
+
+    <div tal:replace="structure view/batching"/>
+    <table class="listing"
+           id="listing-table"
+           summary="Content listing"
+	   i18n:domain="eduCommons"
+           i18n:attributes="summary"
+           tal:condition="view/items">
+      <div i18n:domain="plone">
+      <thead>
+          <tr tal:condition="not:view/selectcurrentbatch">
+            <th colspan="6" class="nosort">Select: <a tal:attributes="href view/selectscreen_url" id="foldercontents-selectall">All</a></th>
+          </tr>
+          <tr tal:condition="view/show_select_all_items">
+            <th colspan="6" class="nosort">
+              All <tal:block replace="view/batch/items_on_page"/> items on this
+              page are selected. 
+              <a tal:attributes="href view/selectall_url" 
+                 id="foldercontents-selectall-completebatch">Select all 
+                 <tal:block replace="view/batch/size"/> items in this folder.</a>
+            </th>
+          </tr>
+          <tr tal:condition="view/selectall">
+            <th colspan="6" class="nosort">
+              All <tal:block replace="view/batch/size"/> items in this folder
+              are selected. 
+              <a tal:attributes="href view/selectnone_url" 
+                 id="foldercontents-clearselection">Clear selection</a>
+            </th>
+          </tr>
+
+          <tr>
+            <th class="nosort">&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-title-column">&nbsp;<tal:title i18n:translate="listingheader_title"
+                >Title</tal:title>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-size-column">&nbsp;<tal:size i18n:translate="listingheader_size"
+                >Size</tal:size>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-modified-column">&nbsp;<tal:modified i18n:translate="listingheader_modified"
+                >Modified</tal:modified>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-status-column">&nbsp;<tal:state i18n:translate="listingheader_status"
+                >State</tal:state>&nbsp;</th>
+            <th class="nosort" 
+                id="foldercontents-cc-column">
+              &nbsp;<tal:cc i18n:domain="eduCommons" i18n:translate="">Flags</tal:cc>&nbsp;</th>
+          </tr>
+      </thead>
+      <tfoot>
+	<tr>
+          <th colspan="6" align="right">
+	    <span i18n:domain="eduCommons" i18n:translate="">Flags:</span>&nbsp;<span style="color: green">c</span> - <span i18n:domain="eduCommons" i18n:translate="">Cleared Copyright</span><br />
+	           <span style="color: blue">a</span> - <span i18n:domain="eduCommons" i18n:translate="">Accessible</span>
+
+	  </th>
+        </tr>
+
+
+      </tfoot>
+
+      <metal:block tal:condition="view/batch"> <tbody>
+          <tal:items tal:repeat="item view/batch">
+              <tr tal:attributes="class item/table_row_class;
+                                  id string:folder-contents-item-${item/id};" >
+
+                 <tal:comment replace="nothing">
+                      * We have to check if the browserDefault stuff is really necessary
+                      * Create title_or_id metadata in the catalog (why not just use item.Title or item.getId? (alecm))
+                 </tal:comment>
+
+                 <td class="notDraggable">
+                     <input type="checkbox"
+                            class="noborder"
+                            name="paths:list" id="#"
+                            value="#"
+                            tal:attributes="value   item/path;
+                                            id      string:cb_${item/id};
+                                            checked item/checked;
+                                            alt     string:Select ${item/title_or_id};
+                                            title   string:Select ${item/title_or_id}" />
+                <input type="hidden" name="selected_obj_paths:list" value="#"
+                       tal:attributes="value item/relative_url" />
+                <label tal:content="item/title_or_id"
+                       tal:attributes="for string:cb_${item/id}" 
+                       class="hiddenStructure">
+                  Item Title
+                </label>
+              </td>
+              <td>
+                  <span tal:attributes="class item/type_class">
+                      <img tal:replace="structure item/icon" />
+                      <a href="#" tal:attributes="href  item/view_url;
+                                                title string: ${item/obj_type}: ${item/description};
+                                                class item/state_class;">
+                        <strong tal:omit-tag="not: item/is_browser_default"
+                            tal:content="item/title_or_id"/>
+                      </a>
+                  </span>
+
+                  <span class="state-expired"
+                        tal:condition="item/is_expired"
+                        i18n:translate="time_expired">expired</span>
+              </td>
+
+              <td>
+                <span tal:condition="not: item/size"> &nbsp; </span>
+                <span tal:condition="item/size"
+                      tal:content="item/size"
+                      tal:attributes="class item/state_class"> size </span>
+              </td>
+              <td tal:content="item/modified"
+                  tal:attributes="class item/state_class">
+                  08/19/2001 03:01 AM
+              </td>
+              <td>
+                  <span i18n:translate=""
+                        tal:condition="item/state_title"
+                        tal:content="item/state_title"
+                        tal:attributes="class item/state_class" />
+                  <span tal:condition="not: item/state_title">&nbsp;</span>
+              </td>
+              <td tal:define="copyright_status item/cc_status;
+			      access_status item/accessibility_status" 
+		  width="15px" 
+		  align="center">
+		<span tal:condition="copyright_status" style="color: green;">c</span>
+		<span tal:condition="access_status" style="color: blue;">a</span>
+              </td>
+             </tr>
+          </tal:items>
+      </tbody>
+    </metal:block>
+    </div>
+  </table>
+  <div tal:replace="structure view/batching"/>
+  <tal:buttons tal:repeat="button view/buttons">
+    <input class="context"
+           type="submit"
+           name=""
+           value=""
+           i18n:attributes="value"
+           tal:attributes="value button/title; name button/url; class button/cssclass" />
+  </tal:buttons>
+  <tal:import tal:condition="python: not view.buttons">
+    <input class="context" 
+	   type="submit"
+           name="@@import_form:method" 
+	   value="Import" />
+  </tal:import>
+  </metal:listing>
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/clear_copyright.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/clear_copyright.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/clear_copyright.pt	(revision 126)
@@ -0,0 +1,31 @@
+<div metal:define-macro="clear_copyright_fields" tal:omit-tag="">
+
+
+  <div class="field"
+       tal:define="clearedCopyright view/getClearedCopyright;">
+
+    <input type="checkbox"
+	   id="clearedCopyright"
+	   name="clearedCopyright:boolean"
+	   tal:attributes="checked clearedCopyright" />
+
+    <input value="False" name="clearedCopyright:boolean:default" type="hidden" />
+
+    <label for="cleared_copyright"
+	   i18n:domain="eduCommons"
+	   i18n:translate="">Cleared Copyright</label>
+
+
+    <div class="formHelp" id="cleared_copyright_help"
+	 i18n:domain="eduCommons"
+	 i18n:translate="">
+      Set cleared copyright if content object has been correctly licensed from the author, and is free from copyright violations.
+    </div>
+    <div>
+    </div>
+
+
+  </div>
+
+
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/configure.zcml
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/configure.zcml	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/configure.zcml	(revision 126)
@@ -0,0 +1,389 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+	   xmlns:browser="http://namespaces.zope.org/browser"
+	   xmlns:xmlrpc="http://namespaces.zope.org/xmlrpc"
+	   xmlns:view="http://namespaces.zope.org/view"
+	   i18n_domain="eduCommons">
+
+  <include package=".templates" />
+  <include package="plone.app.contentmenu" />
+
+
+  <browser:page
+     name="order_courseobjs"
+     for="Products.CMFCore.interfaces.IFolderish"
+     class=".foldercontents.OrderContentsView"
+     template="./order_objs.pt"
+     permission="zope2.View"
+     />
+
+
+  <browser:page
+     name="Course_Nav_position"
+     for="*"
+     class=".PositionView"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="rss"
+     for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+     class=".RSSView"
+     template="rss.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="rss"
+     for="enpraxis.educommons.interfaces.ICoursesTopic"
+     class=".RSSView"
+     template="rss.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="rss"
+     for="enpraxis.educommons.interfaces.IDivision"
+     class=".RSSView"
+     template="rss.pt"
+     permission="zope2.View"
+     />
+  
+  <browser:page
+     name="rss"
+     for="enpraxis.educommons.interfaces.ICourse"
+     class=".RSSView"
+     template="rss.pt"
+     permission="zope2.View"
+     />
+  
+  <browser:page
+     name="rss_feeds"
+     for="*"
+     template="rss_questions.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="rss_template"
+     for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+     template="rss_template.pt"
+     permission="zope2.View"
+     />
+
+
+  <browser:page
+     name="rss_template"
+     for="enpraxis.educommons.interfaces.ICoursesTopic"
+     template="rss_template.pt"
+     permission="zope2.View"
+     />
+
+  
+  <browser:page
+     name="rss_template"
+     for="enpraxis.educommons.interfaces.IDivision"
+     template="rss_template.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="rss_template"
+     for="enpraxis.educommons.interfaces.ICourse"
+     template="rss_template.pt"
+     permission="zope2.View"
+     />
+
+
+  <browser:page
+     name="rss_all"
+     for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+     class=".RSSView"
+     template="rss_all.pt"
+     permission="zope2.View"
+     />
+  
+  <browser:page
+     name="rss_all_template"
+     for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+     template="rss_all_template.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     for="*"
+     class=".summarycontents.SummaryContentsView"
+     name="summary_contents"
+     template="foldercontents.pt"
+     permission="cmf.ListFolderContents"
+     />
+
+  <browser:page
+     for="*"
+     name="search_view"
+     class=".searchview.SearchView"
+     allowed_attributes="generateEmailList copyrightClearedOnObj changeStateEvent notifyDeleteObjectEvent changeNav"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     for="*"
+     name="change_copyright_view"
+     class=".copyrightview.CopyrightView"
+     allowed_attributes="changeCopyright"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     for="*"
+     name="change_accessibility_view"
+     class=".accessibilityview.AccessibilityCompliantView"
+     allowed_attributes="changeAccessibility"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     for="*"
+     name="package_course_view"
+     class=".packagecourseview.PackageCourseView"
+     allowed_attributes="createIMSFile"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     for="*"
+     name="courseexportform"
+     class=".reusecourse.CourseExportForm"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     for="*"
+     name="importPackage"
+     class=".reusecourse.XMLRPC"
+     attribute="importPackage"
+     permission="zope2.View"
+     />
+
+
+  <browser:page
+     for="*"
+     name="retrieveDivisions"
+     class=".reusecourse.XMLRPC"
+     attribute="retrieveDivisions"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="courses_listing"
+     title="Courses Listing"
+     menu="plone_displayviews"
+     for="..interfaces.ICoursesTopic"
+     template="courseslisting.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="profs_listing"
+     title="Courses by Professor"
+     menu="plone_displayviews"
+     for="..interfaces.ICoursesTopic"
+     class=".coursestopic.ProfCourseListView"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="division_courses"
+     for="..interfaces.IDivision"
+     class=".coursestopic.DivisionCourseListView"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="feedback_view"
+     title="Feedback"
+     menu="plone_displayviews"
+     for="*"
+     class=".feedbackform.FeedbackForm"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="report_content"
+     for="*"
+     class=".reportcontentform.ReportContentForm"
+     permission="zope2.View"
+     />
+
+
+  <browser:page
+     name="template_view"
+     for="*"
+     class=".templatechooser.TemplateForm"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="skinless_byline_view"
+     for="collective.contentlicensing.DublinCoreExtensions.interfaces.ILicensable"
+     class=".CopyrightBylineView"
+     template="skinless_byline_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="skinless_view"
+     for="*"
+     class=".SkinlessView"
+     template="skinless_view.pt"
+     allowed_attributes="getSkinlessView"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="clear_copyright"
+     for="..interfaces.IClearCopyrightable"
+     class=".ClearCopyrightField"
+     allowed_attributes="getClearedCopyright"
+     template="clear_copyright.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="accessibility_compliant"
+     for="..interfaces.IAccessibilityCompliantable"
+     class=".AccessibilityCompliantField"
+     allowed_attributes="getAccessibilityCompliant"
+     template="accessibility_compliant.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="sorted_course_listing"
+     for="..interfaces.IDivision"
+     class=".SortedCourseListingView"
+     template="sorted_course_listing.pt"
+     allowed_attributes="getSortedCourses"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="sorted_cross_course_listing"
+     for="..interfaces.IDivision"
+     class=".SortedCrossCourseListingView"
+     template="sorted_cross_course_listing.pt"
+     allowed_attributes="getSortedCrossCourses"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="sorted_resource_listing"
+     for="..interfaces.IDivision"
+     class=".SortedResourceListingView"
+     template="sorted_resource_listing.pt"
+     allowed_attributes="getSortedResources"
+     permission="zope2.View"
+     />
+
+
+  <browser:resourceDirectory
+     name="images"
+     directory="images"
+     />
+
+  <!-- Add the lock icon after the title -->
+
+  <browser:viewletManager
+     name="eduCommons.aftertitle"
+     provides=".interfaces.IAfterTitle"
+     permission="cmf.ManagePortal"
+     class="plone.app.viewletmanager.manager.OrderedViewletManager"
+     />
+
+  <browser:viewlet
+     name="eduCommons.lock"
+     manager=".interfaces.IAfterTitle"
+     permission="cmf.ManagePortal"
+     class=".viewlets.LockViewlet"
+     />
+
+  <!-- Revert back to icons for document actions -->
+
+  <browser:viewlet
+     name="eduCommons.icondocumentactions"
+     manager="plone.app.layout.viewlets.interfaces.IBelowContentTitle"
+     permission="zope2.View"
+     class=".viewlets.IconDocumentActionsViewlet"
+     />
+
+
+  <browser:viewlet
+     name="eduCommons.footer"
+     manager="plone.app.layout.viewlets.interfaces.IPortalFooter"
+     template="footer.pt"
+     permission="zope2.View"
+     />
+
+    <browser:viewlet  
+        name="eduCommons.nextprevious"
+        manager="plone.app.layout.viewlets.interfaces.IAboveContentBody"
+        class=".nextprev.view.NextPreviousViewlet"
+        permission="zope2.View" 
+        />
+
+
+
+  <browser:menu
+     id="plone_contentmenu_templates"
+     title="The 'template' menu - allows the user to apply a template to an object"
+     class=".menu.TemplateMenu"
+     />
+
+  <adapter for="* *"
+	   name="plone.contentmenu.templates"
+	   factory=".menu.TemplatesSubMenuItem"
+	   provides="plone.app.contentmenu.interfaces.IContentMenuItem"
+	   />
+
+  <utility provides="zope.schema.interfaces.IVocabularyFactory"
+  	   component=".templatechooser.templateVocabulary"
+	   name="Template Choices"
+	   />
+
+  <adapter factory=".controlpanel.eduCommonsControlPanelAdapter" />
+
+  <browser:page
+     name="eduCommons-controlpanel"
+     for="Products.CMFPlone.interfaces.IPloneSiteRoot"
+     class=".controlpanel.eduCommonsControlPanel"
+     permission="cmf.ManagePortal"
+     />
+
+  <utility
+     provides="zope.schema.interfaces.IVocabularyFactory"
+     component=".reusecourse.remotedivisionsvocab"
+     name="eduCommons.remotedivisionsvocab"
+     />
+
+ 
+    <!-- Local roles managed in the @@sharing view -->
+    <utility
+        name="Producer"
+        factory=".localroles.ProducerRole"
+        />
+        
+    <utility
+        name="Publisher"
+        factory=".localroles.PublisherRole"
+        />
+
+    <utility
+        name="QA"
+        factory=".localroles.QARole"
+        />
+
+    <utility
+        name="Viewer"
+        factory=".localroles.ViewerRole"
+        />
+
+</configure>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/controlpanel.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/controlpanel.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/controlpanel.py	(revision 126)
@@ -0,0 +1,118 @@
+##################################################################################
+#    Copyright (C) 2004-2007 Utah State University, All rights reserved.          
+#                                                                                 
+#    This program is free software; you can redistribute it and/or modify         
+#    it under the terms of the GNU General Public License as published by         
+#    the Free Software Foundation; either version 2 of the License, or            
+#    (at your option) any later version.                                          
+#                                                                                 
+#    This program is distributed in the hope that it will be useful,              
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of               
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                
+#    GNU General Public License for more details.                                 
+#                                                                                 
+#    You should have received a copy of the GNU General Public License            
+#    along with this program; if not, write to the Free Software                  
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    
+#                                                                                 
+##################################################################################
+
+__author__ = 'Brent Lambert, David Ray, Jon Thomas'
+__docformat__ = 'restructuredtext'
+__version__ = "$Revision: 1 $"[11:-2]
+
+from zope.interface import Interface, implements
+from zope.component import adapts, getUtility
+from zope.formlib.form import FormFields
+from zope.schema import TextLine, Bool
+from Products.CMFDefault.formlib.schema import SchemaAdapterBase
+from Products.CMFPlone.interfaces import IPloneSiteRoot
+from Products.CMFCore.interfaces import IPropertiesTool
+from plone.app.controlpanel.form import ControlPanelForm
+from enpraxis.educommons import eduCommonsMessageFactory as _
+
+class IeduCommonsSchema(Interface):
+    
+    division_descriptor = TextLine(title=_(u'Division Descriptor'),
+                                   description=_(u"A descriptor that describes how your "
+                                                 "academic institution is divided. Typically "
+                                                 "this will be 'Departments' or 'Divisions.'"),
+                                   required=True)
+
+    course_descriptor = TextLine(title=_(u'Course Descriptor'),
+                                 description=_(u'A descriptor that describes courses '
+                                               'in your institution.'),
+                                 required=True)
+
+    oerrecommender_enabled = Bool(title=_(u'OER Recommender'),
+                                  description=_(u'Enable the display of the OER Recommender Portlet for Course objects and sub-objects.'),
+                                  default=False,
+                                  required=True)
+
+    reusecourse_enabled = Bool(title=_(u'Allow Reuse Course Export'),
+                                  description=_(u'Enable the display of the course export link for Course objects and sub-objects.'),
+                                  default=False,
+                                  required=True)
+
+
+    reusecourse_instance = TextLine(title=_('Reuse Course Portal'),
+                                    description=_(u'The URL to the eduCommons instance utilized by the Reuse Course portlet.'),
+                                    required=True)
+
+
+class eduCommonsControlPanelAdapter(SchemaAdapterBase):
+    """ Control Panel Adapter """
+
+    adapts(IPloneSiteRoot)
+    implements(IeduCommonsSchema)
+
+    def __init__(self, context):
+        super(eduCommonsControlPanelAdapter, self).__init__(context)
+        self.props = getUtility(IPropertiesTool)
+        self.ecprops = self.props.educommons_properties
+
+    def get_division_descriptor(self):
+        return self.ecprops.getProperty('division_descriptor')
+
+    def set_division_descriptor(self, descriptor):
+        self.ecprops.manage_changeProperties(division_descriptor=descriptor)
+
+    def get_course_descriptor(self):
+        return self.ecprops.getProperty('course_descriptor')
+
+    def set_course_descriptor(self, descriptor):
+        self.ecprops.manage_changeProperties(course_descriptor=descriptor)
+
+    def get_oerrecommender_enabled(self):
+        return self.ecprops.getProperty('oerrecommender_enabled')
+
+    def set_oerrecommender_enabled(self, oerrecommender):
+        self.ecprops.manage_changeProperties(oerrecommender_enabled=oerrecommender)
+
+    def get_reusecourse_enabled(self):
+        return self.ecprops.getProperty('reusecourse_enabled')
+
+    def set_reusecourse_enabled(self, reusecourse_enable):
+        self.ecprops.manage_changeProperties(reusecourse_enabled=reusecourse_enable)
+
+    def get_reusecourse_instance(self):
+        return self.ecprops.getProperty('reusecourse_instance')
+
+    def set_reusecourse_instance(self, reusecourse):
+        self.ecprops.manage_changeProperties(reusecourse_instance=reusecourse)
+
+
+
+    course_descriptor = property(get_course_descriptor, set_course_descriptor)
+    division_descriptor = property(get_division_descriptor, set_division_descriptor)
+    oerrecommender_enabled = property(get_oerrecommender_enabled, set_oerrecommender_enabled)
+    reusecourse_enabled = property(get_reusecourse_enabled, set_reusecourse_enabled)
+    reusecourse_instance = property(get_reusecourse_instance, set_reusecourse_instance)
+
+class eduCommonsControlPanel(ControlPanelForm):
+
+    form_fields = FormFields(IeduCommonsSchema)
+    
+    label = _(u'eduCommons Settings')
+    description = _(u'Settings which control how eduCommons looks and functions.')
+    form_name = _(u'eduCommons Settings')
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/copyrightview.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/copyrightview.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/copyrightview.py	(revision 126)
@@ -0,0 +1,23 @@
+from zope.publisher.browser import BrowserView
+from zope.annotation.interfaces import IAnnotations
+from enpraxis.educommons.interfaces import IClearCopyrightable
+from enpraxis.educommons import eduCommonsMessageFactory as _
+
+
+class CopyrightView(BrowserView):
+    """ Provides view of object with access to annotations in placeless environments"""
+    def changeCopyright(self, value):
+        """ Provides annotation to placeless script """
+        context = self.context
+        message = ''        
+        if IClearCopyrightable.providedBy(context):
+            anno = IAnnotations(context)
+            if value == 'True':
+                anno['eduCommons.clearcopyright'] = True
+                message= _(u'Copyright Cleared')
+            elif value == 'False':
+                anno['eduCommons.clearcopyright'] = False
+                message= _(u'Copyright Revoked')
+        return message
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/courseslisting.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/courseslisting.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/courseslisting.pt	(revision 126)
@@ -0,0 +1,89 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en"
+      metal:use-macro="here/main_template/macros/master"
+      i18n:domain="plone">
+
+<body>
+
+<div metal:fill-slot="main">
+<metal:main_macro define-macro="main">
+    <metal:body define-macro="body_macro"
+                tal:define="kssClassesView context/@@kss_field_decorator_view;
+                            getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;
+                            templateId template/getId">
+
+
+        <div tal:replace="structure provider:plone.abovecontenttitle" />
+
+        <h1 tal:content="here/title_or_id" class="documentFirstHeading">
+            Title or id
+        </h1>
+
+        <div class="documentDescription" tal:content="structure here/Description">
+            description
+        </div>
+
+        <div tal:replace="structure provider:plone.abovecontentbody" />
+
+	<div id="rss_info">
+	  <a href="@@rss_feeds"><img src="rss_icon.gif" /></a>
+	  <a href="@@rss_feeds">RSS Feeds</a>
+	</div>
+
+        <div metal:define-macro="text-field-view"
+             id="parent-fieldname-text" class="stx"
+             tal:define="kss_class python:getKssClasses('text',
+                         templateId=templateId, macro='text-field-view');
+                         text here/getText|nothing"
+             tal:condition="text">
+            <div metal:define-slot="inside" tal:replace="structure text">The body</div>
+        </div>
+
+
+        <metal:listingmacro define-macro="listing">
+        <tal:topiccontents define="topicContents python:here.queryCatalog(batch=True);
+                                   batch topicContents;">
+
+            <tal:listing condition="topicContents">
+            <a style='text-align: right' href="#"
+               tal:condition="nocall: here/asPDF|nothing"
+               tal:attributes="href string:${here_url}/asPDF/atct_topic_pdf_template/atct_topic_pdf"
+               i18n:translate="label_download_as_pdf"
+               i18n:domain="atcontenttypes">
+                Download PDF
+            </a>
+            
+	    <!-- Start of report entry -->
+
+
+	    <div tal:repeat="obj topicContents">
+	      <div tal:define="robj obj/getObject"
+		   tal:replace="structure robj/@@division_courses" />
+	    </div>
+
+	    <!-- end of report entry -->
+
+            </tal:listing>
+
+            <p class="discreet"
+               tal:condition="python: not topicContents and here.listCriteria()"
+               i18n:domain="atcontenttypes"
+               i18n:translate="description_no_items_in_topic">
+                There are currently no results for this search.
+            </p>
+
+            <!-- Navigation -->
+            <div metal:use-macro="here/batch_macros/macros/navigation" />
+
+        </tal:topiccontents>
+        </metal:listingmacro>
+    </metal:body>
+
+    <div tal:replace="structure provider:plone.belowcontentbody" />
+
+</metal:main_macro>
+
+</div>
+
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/coursestopic.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/coursestopic.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/coursestopic.py	(revision 126)
@@ -0,0 +1,102 @@
+from Products.Five.browser import BrowserView
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from enpraxis.educommons.interfaces import IOpenOCWSite
+from zope.component import getUtility
+
+class CoursesView(BrowserView):
+    """ A course listing view """
+
+class DivisionCourseListView(BrowserView):
+    """ A course listing view for a division """
+
+    __call__ = ViewPageTemplateFile('divisioncourses.pt')
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.ecutil = getUtility(IECUtility)
+
+    def getCourses(self):
+        path = {'query':'/'.join(self.context.getPhysicalPath()) + '/'}
+        results = self.context.portal_catalog.searchResults(path=path, portal_type='Course')
+        results = list(results)
+        results.sort(lambda x, y : cmp(self.ecutil.getFullCourseTitle(x), self.ecutil.getFullCourseTitle(y)))
+        return results
+
+    def getFullCourseTitle(self, brain):
+        """ Returns the title with term and ID information  """
+        full_title = self.ecutil.getFullCourseTitle(brain)
+        return full_title
+
+        
+class ProfCourseListView(BrowserView):
+    """ A course listing view for a professor """
+
+    __call__ = ViewPageTemplateFile('profslisting.pt')
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.ecutil = getUtility(IECUtility)
+        self.current_instructor = ''
+
+    def getCoursesByInstructor(self, brains):
+        """ Aggregates Courses by Instructor Name  """
+        iname = ''
+        courselist = []
+        tlist = None
+
+        for x in brains:
+            if x.portal_type == 'Course':
+                if iname != x.getInstructorName:
+                    if tlist:
+                        courselist.append((iname, tlist))
+                    tlist = [x]
+                    iname = x.getInstructorName 
+                else:
+                    if tlist:
+                        tlist.append(x)
+                        #Sort by full Course title
+                        tlist = list(tlist)
+                        tlist.sort(lambda x, y : cmp(self.ecutil.getFullCourseTitle(x),self.ecutil.getFullCourseTitle(y)))
+                    else:
+                        tlist = [x]
+            
+        if tlist:
+            courselist.append((iname, tlist))
+
+        return courselist
+
+    def getProfName(self, name):
+        """ Returns the professor's name, or default string if none exists """
+        if name == '':
+            return 'No Professor Listed'
+        return name
+
+    def getFullCourseTitle(self, brain):
+        """ Returns the title with term and ID information  """
+        full_title = self.ecutil.getFullCourseTitle(brain)
+        return full_title
+
+    def getOddEvenClass(self, oddrow=None):
+        """ assigns a css class based on odd even in the tal repeat  """
+        cssclass = 'course-listing odd'
+        if oddrow:
+            cssclass = 'course-listing even'
+        return cssclass
+        
+
+class DivisionPageView(BrowserView):
+    """ A default divison page view """
+
+    __call__ = ViewPageTemplateFile('templates/division_view.pt')
+
+    def isOpenOCW(self):
+        return IOpenOCWSite.providedBy(self.context.portal_url.getPortalObject())
+        
+
+class CoursePageView(BrowserView):
+    """ A default course page view """
+
+    __call__ = ViewPageTemplateFile('templates/course_view.pt')
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/dashboard.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/dashboard.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/dashboard.py	(revision 126)
@@ -0,0 +1,32 @@
+from zope.interface import implements
+from zope.component import adapts, queryUtility
+
+from zope.app.container.interfaces import INameChooser
+
+from Products.PluggableAuthService.interfaces.authservice import IPropertiedUser
+
+from plone.portlets.interfaces import IPortletManager
+from plone.portlets.constants import USER_CATEGORY
+
+from plone.app.portlets.interfaces import IDefaultDashboard
+from plone.app.portlets import portlets
+
+from plone.app.portlets.storage import UserPortletAssignmentMapping
+    
+class DefaultDashboard(object):
+    """The default default dashboard.
+    """
+    
+    implements(IDefaultDashboard)
+    adapts(IPropertiedUser)
+    
+    def __init__(self, principal):
+        self.principal = principal
+    
+    def __call__(self):
+        return {
+            'plone.dashboard1' : (portlets.news.Assignment(), portlets.events.Assignment(),),
+            'plone.dashboard2' : (portlets.recent.Assignment(),),
+            'plone.dashboard3' : (),
+            'plone.dashboard4' : (),
+        }
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/divisioncourses.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/divisioncourses.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/divisioncourses.pt	(revision 126)
@@ -0,0 +1,28 @@
+<style>
+
+</style>
+
+<div class="division-listing">
+    <p class="division-title">
+    <a href=""
+       tal:attributes="href context/absolute_url"
+       tal:content="context/Title">Division Title</a>
+    </p>
+
+  <tal:block tal:repeat="item view/getCourses">
+    <p tal:define="oddrow repeat/item/odd;
+		   full_title python:view.getFullCourseTitle(item);"
+       tal:attributes="class python:oddrow and 'course-listing even' or 'course-listing odd'">
+      <a href=""
+	 tal:attributes="href item/getURL"
+	 tal:content="full_title">Full Course Title</a> 
+    </p>
+  </tal:block>
+  <tal:block tal:condition="python:not view.getCourses()">
+    <p class="course-listing">There are no published courses in this department.</p>
+  </tal:block>
+
+</div>
+<p class="link-top">
+  <a href="#top" title="Return to Top">Return to Top</a>
+</p>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/feedbackform.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/feedbackform.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/feedbackform.py	(revision 126)
@@ -0,0 +1,83 @@
+##################################################################################
+#    Copyright (C) 2007 Utah State University, All rights reserved.          
+#                                                                                 
+#    This program is free software; you can redistribute it and/or modify         
+#    it under the terms of the GNU General Public License as published by         
+#    the Free Software Foundation; either version 2 of the License, or            
+#    (at your option) any later version.                                          
+#                                                                                 
+#    This program is distributed in the hope that it will be useful,              
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of               
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                
+#    GNU General Public License for more details.                                 
+#                                                                                 
+#    You should have received a copy of the GNU General Public License            
+#    along with this program; if not, write to the Free Software                  
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    
+#                                                                                 
+##################################################################################
+
+__author__ = 'Brent Lambert'
+__docformat__ = 'restructuredtext'
+__version__ = "$Revision: 1 $"[11:-2]
+
+
+from zope.formlib.form import FormFields, action
+from plone.app.form.base import AddForm
+from zope.app.form.interfaces import WidgetInputError
+from zope.component import getMultiAdapter
+from Products.PageTemplates import PageTemplateFile
+from enpraxis.educommons import eduCommonsMessageFactory as _
+from Products.MailHost.MailHost import MailHostError
+from Products.statusmessages.interfaces import IStatusMessage
+from interfaces import IFeedbackForm
+from Products.SecureMailHost.mail import Mail
+
+
+def validate_feedback(form, action, data):
+    """ Validate the from email address, if it exists. """
+    errors = form.validate(action, data)
+    if errors:
+        return errors
+    if data.has_key('email') and data['email']:
+        email = data['email'].encode('ascii')
+        if not form.context.MailHost.validateSingleEmailAddress(email):
+            ew = form.widgets.get('email')
+            ew._error = WidgetInputError(form.context.__name__, ew.label, _('Invalid email address'))
+            return ew._error
+    
+
+class FeedbackForm(AddForm):
+    """ A form for getting feedback from end users. """
+
+    form_fields = FormFields(IFeedbackForm)
+    label = u'Feedback'
+    description = _(u'We appreciate your feedback. If you find this site useful, or think it could be better, or are having problems using it, please feel free to use the form below to let us know about it.')
+
+    @action(_(u'Submit'), 
+            validator=validate_feedback,
+            name=u'Submit')
+    def action_submit(self, action, data):
+        # Convert post variables into email fields
+        mto = self.context.email_from_address
+        if data.has_key('email') and data['email']:
+            mfrom='%s<%s>' % (data['name'], data['email'].encode('ascii'))
+        else:
+            # If no return email is provided, use the TO address.
+            # Do this so that the from field will pass validation.
+            mfrom = mto
+        subject = data['subject']
+        message = data['body']
+        # Post the message
+        try:
+            self.context.MailHost.secureSend(message, mto=mto, mfrom=mfrom, subject=subject, charset='utf8')
+        except MailHostError, e:
+            IStatusMessage(self.request).addStatusMessage(_(u'Feedback request failed.'), type='error')
+            url = getMultiAdapter((self.context, self.request), name='absolute_url')()
+            self.request.response.redirect(url)
+            return ''
+
+        self.request.response.redirect('thanks')
+        return ''
+
+    
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/foldercontents.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/foldercontents.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/foldercontents.pt	(revision 126)
@@ -0,0 +1,70 @@
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xml:lang="en" lang="en"
+      i18n:domain="plone"
+      metal:use-macro="here/main_template/macros/master">
+
+  <head>
+      <metal:block fill-slot="top_slot">
+        <tal:insert tal:replace="nothing"
+              tal:define="dummy python:request.set('enable_border', 1)" />
+      </metal:block>
+  </head>
+
+  <body>
+
+    <div metal:fill-slot="main">
+      <div tal:replace="structure provider:plone.abovecontenttitle" />
+
+      <h1 class="documentFirstHeading"> 
+          <tal:block condition="exists:here/widget">
+              <metal:field use-macro="python:here.widget('title', mode='view')">
+              Title
+              </metal:field>
+          </tal:block>
+          <tal:block condition="not:exists:here/widget">
+              <tal:block replace="structure view/icon" /> 
+              <span tal:content="view/title" tal:omit-tag="">Directory Id</span>
+          </tal:block>
+      </h1>
+
+      <div tal:replace="structure provider:plone.belowcontenttitle" />
+
+      <a href=""
+         class="link-parent"
+         tal:define="parent_url view/parent_url"
+         tal:condition="parent_url"
+         tal:attributes="href string:${parent_url}/folder_contents"
+         i18n:translate="go_to_parent_url">
+          Up one level
+      </a>
+
+      <p class="documentDescription" tal:condition="exists:here/widget">
+          <metal:field use-macro="python:here.widget('description', mode='view')">
+              Description
+          </metal:field>
+      </p>
+
+      <tal:block condition="not:exists:here/widget">
+          <p class="documentDescription" 
+                     tal:content="context/Description" 
+                     tal:condition="context/Description"> 
+              Description
+          </p>
+      </tal:block>
+
+      <form name="folderContentsForm"
+            method="post"
+            action="folder_object"
+            tal:attributes="action context/absolute_url"
+            class="kssattr-serveraction-foldercontents_update_table">
+        <div tal:replace="structure view/contents_table"></div>
+        <input tal:replace="structure context/@@authenticator/authenticator" />
+      </form>
+    </div>
+
+
+  </body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/foldercontents.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/foldercontents.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/foldercontents.py	(revision 126)
@@ -0,0 +1,320 @@
+
+from zope.component import getMultiAdapter
+from zope.interface import implements
+
+from AccessControl import Unauthorized
+from Acquisition import aq_parent, aq_inner
+from OFS.interfaces import IOrderedContainer
+from Products.ATContentTypes.interface import IATTopic
+from Products.CMFCore.utils import getToolByName
+from Products.Five import BrowserView
+
+from plone.memoize import instance
+from plone.app.content.browser.interfaces import IFolderContentsView
+from plone.app.content.browser.tableview import Table
+from kss.core import KSSView
+from zope.component import getUtility
+from enpraxis.educommons.utilities.interfaces import IECUtility
+
+from Products.CMFPlone.interfaces import IPloneSiteRoot
+
+from zope.app.pagetemplate import ViewPageTemplateFile
+from plone.app.content.batching import Batch
+from plone.memoize import instance
+
+from plone.app.content.browser.foldercontents import FolderContentsTable as DefaultTable
+from plone.app.content.browser.foldercontents import FolderContentsView as DefaultView
+
+from zope.annotation import IAnnotations
+
+import urllib
+
+NOT_ADDABLE_TYPES = ('Favorite',)
+
+class OrderContentsView(DefaultView):
+    """
+    """
+    
+    def contents_table(self):
+	parent = getUtility(IECUtility).FindECParent(self.context)
+        table = OrderContentsTable(self.context, self.request, contentFilter={'path':{'query':'/'.join(parent.getPhysicalPath())+'/'},'getExcludeFromNav':False,'sort_on':'getObjPositionInCourse'})
+        return table.render()
+
+
+class OrderContentsTable(DefaultTable):
+    """   
+    The foldercontents table renders the table and its actions.
+    """                
+
+    def __init__(self, context, request, contentFilter={}):
+        self.context = context
+        self.request = request
+        self.contentFilter = contentFilter
+
+        url = self.context.absolute_url()
+        view_url = url + '/@@order_courseobjs'
+        self.table = OrderTable(request, url, view_url, self.items,
+                           show_sort_column=self.show_sort_column,
+                           buttons=self.buttons)
+
+    @property
+    @instance.memoize
+    def items(self):
+        """
+        """
+        plone_utils = getToolByName(self.context, 'plone_utils')
+        plone_view = getMultiAdapter((self.context, self.request), name=u'plone')
+        portal_workflow = getToolByName(self.context, 'portal_workflow')
+        portal_properties = getToolByName(self.context, 'portal_properties')
+        site_properties = portal_properties.site_properties
+        
+        use_view_action = site_properties.getProperty('typesUseViewActionInListings', ())
+        browser_default = self.context.browserDefault()
+                
+        if IATTopic.providedBy(self.context):
+            contentsMethod = self.context.queryCatalog
+        else:
+            contentsMethod = self.context.portal_catalog.searchResults
+	
+        results = []
+
+        brains = self.context.portal_catalog.searchResults(self.contentFilter)
+
+        i = 0
+        for obj in [brain for brain in brains if not getattr(brain.aq_explicit, 'exclude_from_nav', True) and brain.portal_type != 'Course']:
+
+            if (i + 1) % 2 == 0:
+                table_row_class = "draggable even"
+            else:
+                table_row_class = "draggable odd"
+            
+            if getattr(obj.aq_explicit, 'exclude_from_nav', True):
+                continue
+
+            url = obj.getURL()
+            path = obj.getPath or "/".join(obj.getPhysicalPath())
+            icon = plone_view.getIcon(obj);
+            
+            type_class = 'contenttype-' + plone_utils.normalizeString(
+                obj.portal_type)
+
+            review_state = obj.review_state
+            state_class = 'state-' + plone_utils.normalizeString(review_state)
+            relative_url = obj.getURL(relative=True)
+            obj_type = obj.portal_type
+
+            modified = plone_view.toLocalizedTime(
+                obj.ModificationDate, long_format=1)
+            
+            if obj_type in use_view_action:
+                view_url = url + '/view'
+            elif obj.is_folderish:
+                view_url = url + "/folder_contents"              
+            else:
+                view_url = url
+
+            is_browser_default = len(browser_default[1]) == 1 and (
+                obj.id == browser_default[1][0])
+                                
+            results.append(dict(
+                url = url,
+                id  = obj.getId,
+                quoted_id = urllib.quote_plus(obj.getId),
+                path = path,
+                title_or_id = obj.pretty_title_or_id(),
+                description = obj.Description,
+                obj_type = obj_type,
+                size = obj.getObjSize,
+                modified = modified,
+                icon = icon.html_tag(),
+                type_class = type_class,
+                wf_state = review_state,
+                state_title = portal_workflow.getTitleForStateOnType(review_state,
+                                                           obj_type),
+                state_class = state_class,
+                is_browser_default = is_browser_default,
+                folderish = obj.is_folderish,
+                relative_url = relative_url,
+                view_url = view_url,
+                table_row_class = table_row_class,
+                is_expired = self.context.isExpired(obj),
+            ))
+
+            i += 1
+
+        return results
+
+    @property
+    def buttons(self):
+        buttons = []
+        portal_actions = getToolByName(self.context, 'portal_actions')
+        button_actions = portal_actions.listActionInfos(object=aq_inner(self.context), categories=('folder_buttons', ))
+
+        # Do not show buttons if there is no data, unless there is data to be
+        # pasted
+        if not len(self.items):
+            return []
+
+        for button in button_actions:
+            # Make proper classes for our buttons
+            if button['id'] not in ['paste','cut','copy','import']:
+                buttons.append(self.setbuttonclass(button))
+        return buttons
+
+
+
+class OrderTable(Table):
+    """   
+    The table renders a table with sortable columns etc.
+
+    It is meant to be subclassed to provide methods for getting specific table info.
+    """                
+    @property
+    @instance.memoize
+    def batch(self):
+        ba = Batch(self.items,pagesize=len(self.items),)
+        map(self.set_checked, ba)
+        return ba
+
+    render = ViewPageTemplateFile("table.pt")
+
+
+
+
+class FolderContentsCCView(DefaultView):
+    """
+    """
+    def contents_table(self):
+        table = FolderContentsCCTable(self.context, self.request)
+        return table.render()
+
+
+
+class FolderContentsCCTable(DefaultTable):
+    """   
+    The foldercontents table renders the table and its actions.
+    """                
+
+    def __init__(self, context, request, contentFilter={}):
+        self.context = context
+        self.request = request
+        self.contentFilter = contentFilter
+
+        url = self.context.absolute_url()
+        view_url = url + '/folder_contents'
+        self.table = CCTable(request, url, view_url, self.items,
+                           show_sort_column=0,
+                           buttons=self.buttons)
+
+    @property
+    @instance.memoize
+    def items(self):
+        """
+        """
+        plone_utils = getToolByName(self.context, 'plone_utils')
+        plone_view = getMultiAdapter((self.context, self.request), name=u'plone')
+        portal_workflow = getToolByName(self.context, 'portal_workflow')
+        portal_properties = getToolByName(self.context, 'portal_properties')
+        site_properties = portal_properties.site_properties
+        
+        use_view_action = site_properties.getProperty('typesUseViewActionInListings', ())
+        browser_default = self.context.browserDefault()
+                
+        if IATTopic.providedBy(self.context):
+            contentsMethod = self.context.queryCatalog
+        else:
+            contentsMethod = self.context.getFolderContents
+	
+        results = []
+        for i, obj in enumerate(contentsMethod(self.contentFilter)):
+            if (i + 1) % 2 == 0:
+                table_row_class = "draggable even"
+            else:
+                table_row_class = "draggable odd"
+
+            url = obj.getURL()
+            path = obj.getPath or "/".join(obj.getPhysicalPath())
+            icon = plone_view.getIcon(obj);
+            
+            type_class = 'contenttype-' + plone_utils.normalizeString(
+                obj.portal_type)
+
+            review_state = obj.review_state
+            state_class = 'state-' + plone_utils.normalizeString(review_state)
+            relative_url = obj.getURL(relative=True)
+            obj_type = obj.portal_type
+
+            modified = plone_view.toLocalizedTime(
+                obj.ModificationDate, long_format=1)
+            
+            if obj_type in use_view_action:
+                view_url = url + '/view'
+            elif obj.is_folderish:
+                view_url = url + "/folder_contents"              
+            else:
+                view_url = url
+
+            is_browser_default = len(browser_default[1]) == 1 and (
+                obj.id == browser_default[1][0])
+            #Refactor :: determine why ProxyIndex not accessible here
+            if IAnnotations(obj.getObject()).has_key('eduCommons.clearcopyright'):
+                cc_status = IAnnotations(obj.getObject())['eduCommons.clearcopyright']
+            else:
+                cc_status = False
+
+            if IAnnotations(obj.getObject()).has_key('eduCommons.accessible'):
+                accessibility_status = IAnnotations(obj.getObject())['eduCommons.accessible']
+            else:
+                accessibility_status = False
+
+            results.append(dict(
+                url = url,
+                id  = obj.getId,
+                quoted_id = urllib.quote_plus(obj.getId),
+                path = path,
+                title_or_id = obj.pretty_title_or_id(),
+                description = obj.Description,
+                obj_type = obj_type,
+                size = obj.getObjSize,
+                modified = modified,
+                icon = icon.html_tag(),
+                type_class = type_class,
+                wf_state = review_state,
+                state_title = portal_workflow.getTitleForStateOnType(review_state,
+                                                           obj_type),
+                state_class = state_class,
+                is_browser_default = is_browser_default,
+                folderish = obj.is_folderish,
+                relative_url = relative_url,
+                view_url = view_url,
+                table_row_class = table_row_class,
+                is_expired = self.context.isExpired(obj),
+                #Refactor :: determine why ProxyIndex not accessible here
+                cc_status = cc_status,
+                accessibility_status = accessibility_status
+            ))
+        return results
+
+
+
+class CCTable(Table):
+    """   
+    The table renders a table with sortable columns etc.
+
+    It is meant to be subclassed to provide methods for getting specific table info.
+    """                
+    render = ViewPageTemplateFile("cc_table.pt")
+
+class FolderContentsCCKSSView(KSSView):
+    def update_table(self, pagenumber='1', sort_on='getObjPositionInCourse'):
+        self.request.set('sort_on', sort_on)
+        self.request.set('pagenumber', pagenumber)
+        table = FolderContentsCCTable(self.context, self.request,
+                                    contentFilter={'sort_on':sort_on})
+        return self.replace_table(table)
+
+    def replace_table(self, table):
+        core = self.getCommandSet('core')
+        core.replaceInnerHTML('#folderlisting-main-table', table.render())
+        return self.render()
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/footer.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/footer.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/footer.pt	(revision 126)
@@ -0,0 +1,18 @@
+<div id="portal-footer" 
+     metal:define-macro="portal_footer" 
+     xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+     i18n:domain="eduCommons">
+  <p id="portal-footer-items">
+    <a href=""
+       tal:attributes="href string:${view/context/portal_url}/feedback" i18n:translate="">feedback</a> ::
+    <a href=""
+       tal:attributes="href string:${view/context/portal_url}/sitemap" i18n:translate="">site map</a> ::
+    <a href=""
+       tal:attributes="href string:${view/context/portal_url}/accessibility-info" i18n:translate="">accessibility</a> ::
+    <a href=""
+       tal:attributes="href string:${view/context/portal_url}/about/terms-of-use" i18n:translate="">terms of use</a> ::
+    <a href=""
+       tal:attributes="href string:${view/context/portal_url}/about/privacy-policy" i18n:translate="">privacy policy</a> ::
+    <a href="http://cosl.usu.edu/projects/educommons" i18n:translate="">powered by eduCommons</a>
+  </p>
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/icon_document_actions.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/icon_document_actions.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/icon_document_actions.pt	(revision 126)
@@ -0,0 +1,65 @@
+<div class="visualClear"><!-- --></div>
+<div i18n:domain="plone"
+     class="documentActions">
+    <tal:docactions tal:condition="view/actions">
+
+    <h5 class="hiddenStructure" i18n:translate="heading_document_actions">Document Actions</h5>
+
+    <script type="text/javascript" src="jquery.js"></script>
+
+    <ul tal:define="normalizeString nocall: context/@@plone/normalizeString">
+    <tal:actions repeat="daction view/actions">
+        <tal:condition tal:condition="python:daction['id'] != 'bookmarklets'">
+        <li tal:attributes="id python:'document-action-' + normalizeString(daction['id'])">
+            <a href=""
+               tal:attributes="href daction/url;">
+	        <img tal:attributes="alt daction/title;
+				     title daction/title;
+				     src daction/icon;" />
+            </a>
+        </li>
+	</tal:condition>
+        <tal:condition tal:condition="python:daction['id'] == 'bookmarklets'">
+            <script language="javascript">
+            	$(document).ready(function() {
+             	    $('#toggleBookmarks').click(function() {
+	                if ($('#toggledBookmarks').is(":hidden"))
+	         	{
+               	     	    $('#toggledBookmarks').fadeIn("slow");
+	          	} else {
+	             	    $('#toggledBookmarks').fadeOut("slow");
+	         	}
+                    });
+		});
+     		</script>
+
+         <li i18n:domain="PloneBookmarklets">
+            <a style="cursor:pointer;"
+	       href="javascript:void(0);"
+	       id="toggleBookmarks"
+               tal:define="title daction/title;
+                           icon daction/icon"
+               tal:condition="icon">
+
+                <img i18n:attributes="title" src="" alt="" title=""
+                     tal:attributes="src    daction/icon;
+                                     id     string:icon-${daction/id};
+                                     title  title;
+                                     alt    title;" />
+            </a>
+
+            <span id="toggledBookmarks"> 
+              <div tal:replace="structure here/@@bookmarklets" />
+            </span>
+        </li>
+
+	</tal:condition>
+    </tal:actions>
+
+
+    </ul>
+    </tal:docactions>
+
+    <div tal:replace="structure provider:plone.documentactions" />
+
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/interfaces.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/interfaces.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/interfaces.py	(revision 126)
@@ -0,0 +1,89 @@
+##################################################################################
+#    Copyright (C) 2007 Utah State University, All rights reserved.          
+#                                                                                 
+#    This program is free software; you can redistribute it and/or modify         
+#    it under the terms of the GNU General Public License as published by         
+#    the Free Software Foundation; either version 2 of the License, or            
+#    (at your option) any later version.                                          
+#                                                                                 
+#    This program is distributed in the hope that it will be useful,              
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of               
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                
+#    GNU General Public License for more details.                                 
+#                                                                                 
+#    You should have received a copy of the GNU General Public License            
+#    along with this program; if not, write to the Free Software                  
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    
+#                                                                                 
+##################################################################################
+
+__author__ = 'David Ray, Jon Thomas, Brent Lambert'
+__docformat__ = 'restructuredtext'
+__version__ = "$Revision: 1 $"[11:-2]
+
+
+from zope.publisher.interfaces.browser import IBrowserView
+from zope.viewlet.interfaces import IViewletManager
+from zope.interface import Interface
+from zope import schema
+from zope.schema import Iterable
+
+class ITemplateForm(Interface):
+    """ Template form. """
+
+    template = schema.Choice(title=u'Template Selector',
+                           description=u'Choose a template to apply to your object.',
+                           required=True,
+                           vocabulary="Template Choices")
+
+class IFeedbackForm(Interface):
+    """ Feedback form for end users. """
+
+    name = schema.TextLine(title=u'Name',
+                           description=u'Please Provide us with your name so we know who you are.',
+                           required=False)
+
+    email = schema.TextLine(title=u'Email',
+                            description=u'Please provide us with your email so that we can contact you if necessary.',
+                            required=False)
+
+    subject = schema.TextLine(title=u'Subject',
+                              description=u'A simple statement indicating the nature of your feedback.',
+                              required=False)
+
+    body = schema.Text(title=u'Comments',
+                       description=u'Please include any comments you would like us to hear.',
+                       required=True)
+
+class IReportContentForm(Interface):
+    """ Report Content form for end users. """
+
+    name = schema.TextLine(title=u'Name',
+                           description=u'Please provide us with your name so we know who you are.',
+                           required=False)
+
+    email = schema.TextLine(title=u'Email',
+                            description=u'Please provide us with your email so that we can contact you if necessary.',
+                            required=False)
+
+    body = schema.Text(title=u'Comments',
+                       description=u'Please provide comments regarding the nature of the inappropriate content.',
+                       required=True)
+
+
+
+class IAfterTitle(IViewletManager):
+    """ Marker interface for after title viewlet manager. """
+
+
+class IeduCommonsSharingPageRole(Interface):
+    """A named utility providing information about roles that are managed
+    by the sharing page.
+    
+    Utility names should correspond to the role name.
+    """
+    
+    title = schema.TextLine(title=u"A friendly name for the role")
+    
+    required_permission = schema.TextLine(title=u"Permission required to manag this local role",
+                                          required=False)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/languageselector.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/languageselector.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/languageselector.pt	(revision 126)
@@ -0,0 +1,47 @@
+<tal:language
+    tal:define="available view/available;
+                languages view/languages;
+                showFlags view/showFlags;">
+    <ul id="portal-languageselector"
+        tal:condition="python:available and len(languages)>=2">
+
+        <li tal:condition="showFlags"
+            tal:repeat="lang languages">
+            <span tal:define="code lang/code;
+                              selected lang/selected"
+                  tal:omit-tag="selected">
+
+                <a href=""
+                   tal:define="flag lang/flag;
+                               name lang/name"
+                   tal:attributes="href lang/url;
+                                   title name">
+                    <tal:flag condition="flag">
+                        <img width="14"
+                             height="11"
+                             alt=""
+                             tal:attributes="src string:${view/portal_url}${flag};
+                                             title python: name;
+                                             class python: selected and 'currentItem' or '';" />
+                    </tal:flag>
+                    <tal:nonflag condition="not: flag">
+                        <span tal:replace="code">language code</span>
+                    </tal:nonflag>
+                </a>
+
+            </span>
+        </li>
+
+        <li tal:condition="not: showFlags">
+            <select style="font-size: 94%;"
+                    onchange=""
+                    tal:attributes="onchange string:window.location=this.options[this.selectedIndex].value">
+                <option tal:repeat="lang languages"
+                        tal:content="lang/name"
+                        tal:attributes="selected lang/selected;
+                                        value lang/url">Language</option>
+            </select>
+        </li>
+
+    </ul>
+</tal:language>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/localroles.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/localroles.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/localroles.py	(revision 126)
@@ -0,0 +1,31 @@
+from zope.interface import implements
+from plone.app.workflow.interfaces import ISharingPageRole
+from enpraxis.educommons.browser.interfaces import IeduCommonsSharingPageRole
+
+from enpraxis.educommons import eduCommonsMessageFactory as _
+
+# These are for everyone
+
+class ProducerRole(object):
+    implements(IeduCommonsSharingPageRole)
+    
+    title = _(u"Producer")
+    required_permission = None
+    
+class QARole(object):
+    implements(IeduCommonsSharingPageRole)
+    
+    title = _(u"QA", default=u"QA")
+    required_permission = None
+    
+class PublisherRole(object):
+    implements(IeduCommonsSharingPageRole)
+    
+    title = _(u"Publisher")
+    required_permission = None
+
+class ViewerRole(object):
+    implements(IeduCommonsSharingPageRole)
+
+    title = _(u"Viewer")
+    required_permission = None
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/lock.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/lock.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/lock.pt	(revision 126)
@@ -0,0 +1,2 @@
+<span tal:condition="view/show" 
+      id="lock-icon"><img tal:replace="structure view/locked_icon" /></span>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/menu.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/menu.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/menu.py	(revision 126)
@@ -0,0 +1,272 @@
+from urllib import quote_plus
+
+from zope.interface import implements
+from zope.component import getMultiAdapter, queryMultiAdapter, getAdapters, queryUtility
+from zope.app.component.hooks import getSite
+
+from zope.component.interfaces import IFactory
+from zope.i18n import translate
+from zope.app.container.constraints import checkFactory
+from zope.app.publisher.interfaces.browser import AddMenu
+
+from zope.app.publisher.browser.menu import BrowserMenu
+from zope.app.publisher.browser.menu import BrowserSubMenuItem
+
+from plone.i18n.normalizer.interfaces import IIDNormalizer
+from plone.memoize.instance import memoize
+
+from Acquisition import aq_inner
+
+from Products.CMFCore.utils import getToolByName
+
+from Products.CMFDynamicViewFTI.interface import ISelectableBrowserDefault
+
+from Products.CMFPlone.interfaces.structure import INonStructuralFolder
+from Products.CMFPlone.interfaces.constrains import IConstrainTypes
+from Products.CMFPlone.interfaces.constrains import ISelectableConstrainTypes
+
+from plone.app.contentmenu.interfaces import IActionsSubMenuItem
+from plone.app.contentmenu.interfaces import IWorkflowSubMenuItem
+
+from plone.app.contentmenu.interfaces import IActionsMenu
+from plone.app.contentmenu.interfaces import IWorkflowMenu
+
+from enpraxis.educommons import eduCommonsMessageFactory as _
+from Products.CMFPlone import PloneMessageFactory
+from Products.CMFPlone import utils
+from Products.CMFCore.WorkflowCore import WorkflowException
+
+
+class TemplatesSubMenuItem(BrowserSubMenuItem):
+    implements(IActionsSubMenuItem)
+    
+    title = _(u'Apply Template', default=u'Apply Template')
+    description = _(u'Templates for the current content item.')
+    submenuId = 'plone_contentmenu_templates'
+    
+    order = 11
+    extra = {'id' : 'plone-contentmenu-templates'}
+    
+    def __init__(self, context, request):
+        BrowserSubMenuItem.__init__(self, context, request)
+        self.context_state = getMultiAdapter((context, request), name='plone_context_state')
+    
+    def getToolByName(self, tool):
+        return getToolByName(getSite(), tool)
+
+    @property
+    def action(self):
+        folder = self.context
+        if not self.context_state.is_structural_folder():
+            folder = utils.parent(self.context)
+	return folder.absolute_url()
+
+    @memoize
+    def available(self):
+        actions_tool = self.getToolByName("portal_actions")
+        editActions = actions_tool.listActionInfos(object=aq_inner(self.context), categories=('template_buttons', ), max=1)
+        wf_tool = self.getToolByName("portal_workflow")
+
+        try:
+            if self.context.Type() != 'Plone Site' and 'Published' != wf_tool.getInfoFor(self.context, 'review_state'):
+                return len(editActions) > 0
+            else:
+                return False
+        except WorkflowException:
+            return False
+
+
+
+
+    def selected(self):
+        return False
+
+class TemplateMenu(BrowserMenu):
+    implements(IActionsMenu)
+    
+    
+    def getMenuItems(self, context, request):
+        """Return menu item entries in a TAL-friendly form."""
+        results = []
+
+        portal_state = getMultiAdapter((context, request), name='plone_portal_state')
+
+        actions_tool = getToolByName(aq_inner(context), "portal_actions")
+        editActions = actions_tool.listActionInfos(object=aq_inner(context), categories=('template_buttons', ))
+
+        if not editActions:
+            return []
+
+        plone_utils = getToolByName(context, 'plone_utils')
+        portal_url = portal_state.portal_url()
+
+        for action in editActions:
+            if action['allowed']:
+                cssClass = 'actionicon-template_buttons-%s' % action['id']
+                icon = plone_utils.getIconFor('template__buttons', action['id'], None)
+                if icon:
+                    icon = '%s/%s' % (portal_url, icon)
+
+                results.append({ 'title'        : action['title'],
+                                 'description'  : '',
+                                 'action'       : action['url'],
+                                 'selected'     : False,
+                                 'icon'         : icon,
+                                 'extra'        : {'id' : action['id'], 'separator' : None, 'class' : cssClass},
+                                 'submenu'      : None,
+                                 })
+
+        return results
+
+
+# CUSTOMIZE ONLY to implement kssIgnore for workflows actions.  Refactor to KSS when applicable #
+
+class WorkflowSubMenuItem(BrowserSubMenuItem):
+    implements(IWorkflowSubMenuItem)
+    
+    MANAGE_SETTINGS_PERMISSION = 'Manage portal'
+    
+    title = PloneMessageFactory(u'label_state',default=u'State:')
+    submenuId = 'plone_contentmenu_workflow'
+    order = 40
+
+    def __init__(self, context, request):
+        BrowserSubMenuItem.__init__(self, context, request)
+        self.tools = getMultiAdapter((context, request), name='plone_tools')
+        self.context = context
+        self.context_state = getMultiAdapter((context, request), name='plone_context_state')
+
+    @property
+    def extra(self):
+        state = self.context_state.workflow_state()
+        stateTitle = self._currentStateTitle()
+        return {'id'         : 'plone-contentmenu-workflow', 
+                'class'      : 'state-%s' % state,
+                'state'      : state, 
+                'stateTitle' : stateTitle,}
+    
+    @property
+    def description(self):
+        if self._manageSettings() or len(self._transitions()) > 0:
+            return PloneMessageFactory(u'title_change_state_of_item',default=u'Change the state of this item')
+        else:
+            return u''
+
+    @property
+    def action(self):
+        if self._manageSettings() or len(self._transitions()) > 0:
+            return self.context.absolute_url() + '/content_status_history'
+        else:
+            return ''
+    
+    @memoize
+    def available(self):
+        return (self.context_state.workflow_state() is not None)
+
+    def selected(self):
+        return False
+
+    @memoize
+    def _manageSettings(self):
+        return self.tools.membership().checkPermission(WorkflowSubMenuItem.MANAGE_SETTINGS_PERMISSION, self.context)
+
+    @memoize
+    def _transitions(self):
+        wf_tool = getToolByName(aq_inner(self.context), "portal_workflow")
+        return wf_tool.listActionInfos(object=aq_inner(self.context), max=1)
+
+    @memoize
+    def _currentStateTitle(self):
+        state = self.context_state.workflow_state()
+        workflows = self.tools.workflow().getWorkflowsFor(self.context)
+        if workflows:
+            for w in workflows:
+                if w.states.has_key(state):
+                    return w.states[state].title or state
+    
+class WorkflowMenu(BrowserMenu):
+    implements(IWorkflowMenu)
+    
+    # BBB: These actions (url's) existed in old workflow definitions
+    # but were never used. The scripts they reference don't exist in
+    # a standard installation. We allow the menu to fail gracefully
+    # if these are encountered.
+    
+    BOGUS_WORKFLOW_ACTIONS = (
+        'content_hide_form',
+        'content_publish_form',
+        'content_reject_form',
+        'content_retract_form',
+        'content_show_form',
+        'content_submit_form',
+    )
+
+    def getMenuItems(self, context, request):
+        """Return menu item entries in a TAL-friendly form."""
+        results = []
+        context = aq_inner(context)
+        
+        wf_tool = getToolByName(context, "portal_workflow")
+        workflowActions = wf_tool.listActionInfos(object=context)
+
+        for action in workflowActions:
+            if action['category'] != 'workflow':
+                continue
+
+        locking_info = getMultiAdapter((context, request), name='plone_lock_info')
+        if locking_info and locking_info.is_locked_for_current_user():
+            return []
+
+        for action in workflowActions:
+            if action['category'] != 'workflow':
+                continue
+            
+            actionUrl = action['url']
+            if actionUrl == "":
+                actionUrl = '%s/content_status_modify?workflow_action=%s' % (context.absolute_url(), action['id'])
+
+            description = ''
+            
+            transition = action.get('transition', None)
+            if transition is not None:
+                description = transition.description
+            
+            for bogus in self.BOGUS_WORKFLOW_ACTIONS:
+                if actionUrl.endswith(bogus):
+                    if getattr(context, bogus, None) is None:
+                        actionUrl = '%s/content_status_modify?workflow_action=%s' % (context.absolute_url(), action['id'],)
+                    break
+
+            if action['allowed']:
+                results.append({ 'title'        : action['title'],
+                                 'description'  : description,
+                                 'action'       : actionUrl,
+                                 'selected'     : False,
+                                 'icon'         : None,
+                                 'extra'        : {'id' : 'workflow-transition-%s' % action['id'], 'separator' : None, 'class' : 'kssIgnore'},
+                                 'submenu'      : None,
+                                 })
+        
+        url = context.absolute_url()
+        
+        if len(results) > 0:
+            results.append({ 'title'         : _(u'Advanced...'),
+                             'description'   : '',
+                             'action'        : url + '/content_status_history',
+                             'selected'      : False,
+                             'icon'          : None,
+                             'extra'         : {'id' : '_advanced', 'separator' : 'actionSeparator', 'class' : 'kssIgnore'},
+                             'submenu'       : None,
+                            })
+
+        if getToolByName(context, 'portal_placeful_workflow', None) is not None:
+            results.append({ 'title'         : PloneMessageFactory(u'workflow_policy',default=u'Policy...'),
+                             'description'   : '',
+                             'action'        : url + '/placeful_workflow_configuration',
+                             'selected'      : False,
+                             'icon'          : None,
+                             'extra'         : {'id' : '_policy', 'separator' : None, 'class' : 'kssIgnore'},
+                             'submenu'       : None,
+                            })
+
+        return results
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/links.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/links.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/links.pt	(revision 126)
@@ -0,0 +1,21 @@
+<tal:nextPrevious define="enabled view/enabled | nothing;
+                          isViewTemplate view/isViewTemplate | nothing"
+                  condition="python:enabled and isViewTemplate">
+
+    <link rel="previous"
+          href=""
+          title="Go to previous item"
+          tal:define="previous view/previous"
+          tal:condition="previous"
+          i18n:attributes="title title_previous_item"
+          tal:attributes="href previous/url" />
+
+    <link rel="next"
+          href=""
+          title="Go to next item"
+          tal:define="next view/next"
+          tal:condition="next"
+          i18n:attributes="title title_next_item"
+          tal:attributes="href next/url" />
+
+</tal:nextPrevious>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/nextprevious.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/nextprevious.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/nextprevious.pt	(revision 126)
@@ -0,0 +1,40 @@
+<tal:nextPrevious define="enabled view/enabled|nothing;
+                          isViewTemplate view/isViewTemplate | nothing"
+                  condition="python:enabled and isViewTemplate">
+
+    <tal:block define="portal_url view/portal_url;">
+
+        <div class="listingBar"
+             tal:define="next view/next; 
+                         previous view/previous"
+             tal:condition="python:previous is not None or next is not None">
+
+          <tal:previous condition="previous">
+            <a class="listingPrevious" href="" 
+               title="Go to previous item"
+               i18n:attributes="title title_previous_item"
+               tal:attributes="href previous/url">
+                <span i18n:translate="label_previous_item"
+                      tal:omit-tag="">
+                Previous</span> 
+            </a>
+          </tal:previous>
+
+
+            <a class="listingNext" href="" 
+               title="Go to next item"
+               i18n:attributes="title title_next_item"
+               tal:condition="next"
+               tal:attributes="href next/url">
+               <span>Next</span> 
+   
+            </a>
+
+
+          &nbsp;
+
+       </div>
+
+   </tal:block>
+
+</tal:nextPrevious>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/view.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/view.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprev/view.py	(revision 126)
@@ -0,0 +1,62 @@
+from zope.component import getMultiAdapter
+
+from plone.app.layout.viewlets import ViewletBase
+from plone.app.layout.nextprevious.interfaces import INextPreviousProvider
+from plone.memoize import view, instance
+
+from Products.Five.browser import BrowserView
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
+from Acquisition import aq_inner, aq_parent
+
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from zope.component import getUtility
+
+class NextPreviousView(BrowserView):
+    """Information about next/previous navigation
+    """
+
+    @view.memoize
+    def next(self):
+        provider = self._provider()
+        if provider is None:
+           return None
+        return provider.getNextItem(aq_inner(self.context))
+    
+    @view.memoize
+    def previous(self):
+        provider = self._provider()
+        if provider is None:
+            return None
+        return provider.getPreviousItem(aq_inner(self.context))
+
+    @view.memoize
+    def enabled(self):
+        provider = self._provider()
+        if provider is None:
+            return False
+        return provider.enabled
+
+    @instance.memoize
+    def _provider(self):
+        # Note - the next/previous provider is the container of this object!
+        # This may not support next/previous navigation, so code defensively
+        ecutil = getUtility(IECUtility)
+        ecparent = ecutil.FindECParent(self.context)
+
+        if 'Course' == ecparent.Type():
+            return INextPreviousProvider(ecparent)
+        else:
+            return INextPreviousProvider(aq_parent(aq_inner(self.context)), None)
+
+    @view.memoize
+    def isViewTemplate(self):
+        plone = getMultiAdapter((self.context, self.request), name=u'plone_context_state')
+        return plone.is_view_template()
+
+
+class NextPreviousViewlet(ViewletBase, NextPreviousView):
+    render = ZopeTwoPageTemplateFile('nextprevious.pt')
+
+
+class NextPreviousLinksViewlet(ViewletBase, NextPreviousView):
+    render = ZopeTwoPageTemplateFile('links.pt')
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprevious.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprevious.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/nextprevious.py	(revision 126)
@@ -0,0 +1,117 @@
+from zope.interface import implements
+from zope.component import adapts
+from zope.annotation.interfaces import IAnnotations
+from zope.component import getUtility
+
+from plone.app.layout.nextprevious.interfaces import INextPreviousProvider
+from Products.ATContentTypes.interface.folder import IATFolder
+
+
+from plone.memoize.instance import memoize
+
+from Acquisition import aq_base
+from Products.CMFCore.utils import getToolByName
+from enpraxis.educommons.utilities.interfaces import IECUtility
+
+
+
+class ATFolderNextPrevious(object):
+    """Let a folder act as a next/previous provider. This will be 
+    automatically found by the @@plone_nextprevious_view and viewlet.
+    """
+
+
+    implements(INextPreviousProvider)
+    adapts(IATFolder)
+
+    def __init__(self, context):
+        self.context  = context
+        
+        sp = getToolByName(self.context, 'portal_properties').site_properties
+        self.view_action_types = sp.getProperty('typesUseViewActionInListings', ())
+
+        self.ecutil = getUtility(IECUtility)
+        self.ecparent = self.ecutil.FindECParent(context)
+
+
+    def getNextItem(self, obj):
+        relatives = self.itemRelatives(obj)
+        return relatives["next"]
+        
+    def getPreviousItem(self, obj):
+        relatives = self.itemRelatives(obj)
+        return relatives["previous"]
+
+    @property
+    def enabled(self):
+        return self.context.getNextPreviousEnabled()
+
+    @memoize
+    def itemRelatives(self, obj):
+        """Get the relative next and previous items
+        """
+        folder = self.context
+        cur_item   = obj
+        catalog  = getToolByName(self.context, 'portal_catalog')
+
+        previous = None
+        next     = None
+
+        if cur_item.exclude_from_nav() == True:
+            return {'next':next, 'previous':previous}
+
+        # Get course objs in nav 
+        path = {'path':{'query':'/'.join(self.ecparent.getPhysicalPath())+'/'},
+                'getExcludeFromNav':False,
+                'sort_on':'getObjPositionInCourse'}
+        brains = self.context.portal_catalog.searchResults(path)
+        nav_objs = [nobj for nobj in brains if not getattr(nobj.aq_explicit, 'exclude_from_nav', True)]
+
+        #determine item 'position' in nav_objs
+        position = 0
+        for n_obj in nav_objs:
+            if n_obj.id != cur_item.id:
+                position += 1
+            elif n_obj.id == cur_item.id:
+                break
+
+        # Get the previous item
+        if (position - 1) >= 0:
+            prev_brain = nav_objs[position - 1]
+            if prev_brain and len(prev_brain) > 0:
+                previous = self.buildNextPreviousItem(prev_brain)
+
+
+        # Get the next item
+        if (position + 1) < len(nav_objs):
+            next_brain = nav_objs[position + 1]
+            if next_brain and len(next_brain) > 0:
+                next   = self.buildNextPreviousItem(next_brain)
+
+
+        nextPrevious = {
+            'next'      : next,
+            'previous'  : previous,
+            }
+
+        return nextPrevious
+        
+
+
+    def buildNextPreviousItem(self, brain):
+        return {'id'          : brain.getId,
+                'url'         : self.getViewUrl(brain),
+                'title'       : brain.Title,
+                'description' : brain.Description,
+                'portal_type' : brain.portal_type,
+                }
+
+    def getViewUrl(self, brain):
+        """create link and support contents that requires /view 
+        """
+        item_url = brain.getURL()
+    
+        if brain.portal_type in self.view_action_types:
+            item_url += '/view'
+    
+        return item_url
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/order_objs.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/order_objs.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/order_objs.pt	(revision 126)
@@ -0,0 +1,46 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en"
+      i18n:domain="plone"
+      metal:use-macro="here/main_template/macros/master">
+
+  <head>
+      <metal:block fill-slot="top_slot">
+        <tal:insert tal:replace="nothing"
+              tal:define="dummy python:request.set('enable_border', 1)" />
+      </metal:block>
+  </head>
+
+  <body>
+
+    <div metal:fill-slot="main">
+      <h1 class="documentFirstHeading">
+        <tal:block replace="structure view/icon" />
+        <span tal:content="view/title" tal:omit-tag="">Directory Id</span>
+      </h1>
+
+      <a href=""
+         class="link-parent"
+         tal:define="parent_url view/parent_url"
+         tal:condition="parent_url"
+         tal:attributes="href string:${parent_url}/folder_contents"
+         i18n:translate="go_to_parent_url">
+          Up one level
+      </a>
+
+      <p class="documentDescription"
+         tal:content="context/Description"
+         tal:condition="context/Description">
+          Description
+      </p>
+
+      <form name="folderContentsForm"
+            method="post"
+            action="folder_object"
+            tal:attributes="action context/absolute_url">
+        <div tal:replace="structure view/contents_table"></div>
+      </form>
+    </div>
+
+
+  </body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/packagecourseview.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/packagecourseview.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/packagecourseview.py	(revision 126)
@@ -0,0 +1,95 @@
+from zope.publisher.browser import BrowserView
+from Products.CMFPlone import PloneMessageFactory as _
+from zope.component import getUtility, queryUtility
+from collective.zipfiletransport.utilities.interfaces import IZipFileTransportUtility
+from zope.annotation.interfaces import IAnnotations
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from Products.CMFCore.utils import getToolByName
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+
+
+    
+class PackageCourseView(BrowserView):
+    """View to package a published course """
+
+    def __call__(self):
+        self.createIMSFile()
+        message = _('Course has been packaged')
+        url = '%s/folder_contents' % self.context.absolute_url()
+        self.context.plone_utils.addPortalMessage(message)
+        self.request.response.redirect(url)
+
+
+    def createIMSFile(self):
+        """ Package a Published Course. """
+
+        course = self.context
+        file_id = course.id + '.zip'
+
+        pm = course.portal_membership
+        user_id = pm.getAuthenticatedMember().id
+        roles = pm.getAuthenticatedMember().getRoles()
+        if 'Publisher' in roles:
+            roles += ['Administrator']
+            course.manage_setLocalRoles(user_id, roles)
+            course.reindexObjectSecurity()
+
+        #this needs to fire off IMS packaging instead of zip
+        ims_util = getUtility(IIMSTransportUtility)
+        data, file_id= ims_util.exportZipfile(course,file_id)
+
+        if not hasattr(course,file_id):
+            course.invokeFactory("FSSFile",id=file_id, title="Download this Course")
+            fileobj = getattr(course,file_id)
+            wftool = getToolByName(fileobj, 'portal_workflow')
+            wftool.doActionFor(fileobj, 'submit')
+            wftool.doActionFor(fileobj, 'release')
+            wftool.doActionFor(fileobj, 'publish')        
+            fileobj.setTitle("Download This Course")
+        else:
+            fileobj = getattr(course,file_id)            
+            fileobj.setTitle("Download This Course")
+        
+        fileobj.setExcludeFromNav(True)
+        fileobj.setFile(data)
+        appendObjPosition(fileobj)
+
+        course.portal_catalog.reindexObject(fileobj)
+        user_ids = []
+        user_ids += [user_id]
+        course.manage_delLocalRoles(userids=user_ids)
+        course.reindexObjectSecurity()
+
+
+
+
+def appendObjPosition(object):
+    if not object.isTemporary():
+        ecutil = queryUtility(IECUtility)
+        if ecutil:
+            parent = ecutil.FindECParent(object)
+            if parent.Type() == 'Course':
+                path = {'path':{'query':'/'.join(parent.getPhysicalPath())+'/'},}
+                brains = object.portal_catalog.searchResults(path)
+                if brains:
+                    pos = [0,]
+                    for brain in brains:
+                        obj = brain.getObject()
+                        annotations = IAnnotations(obj)
+                        if annotations.has_key('eduCommons.objPositionInCourse'):
+                            pos += [annotations['eduCommons.objPositionInCourse'],]
+                    maxpos = max(pos)
+                    if maxpos > 0:
+                        maxpos += 1
+                    else:
+                        maxpos = 1
+                else:
+                    maxpos = 1
+                
+                annotations = IAnnotations(object)
+                annotations['eduCommons.objPositionInCourse'] = maxpos
+
+                zipobj = getattr(parent, parent.id + '.zip', None)
+                if zipobj:
+                    IAnnotations(zipobj)['eduCommons.objPositionInCourse'] = maxpos + 1
+                    zipobj.reindexObject()
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/position.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/position.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/position.py	(revision 126)
@@ -0,0 +1,120 @@
+from zope.component import getUtility
+from zope.publisher.browser import BrowserView
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from Products.Archetypes.utils import contentDispositionHeader
+
+class SearchView(BrowserView):
+    """
+    """
+    def isInEduContainer(self):
+        """ test to see if the object is in a eduCommons container """
+        parent = self.findEduParent()
+        
+        if parent.Type() in ['Course','Division'] and self.context.Type() not in ['Course','Division']:
+            return True
+        else:
+            return False
+
+    def isInEduCourse(self):
+        """ tests to see if the object is in a Course """
+        parent = self.findEduParent()
+
+        if parent.Type() == 'Course' and self.context.Type() != 'Course':
+            return True
+        else:
+            return False
+
+
+    def isInEduDept(self):
+        """ tests to see if the object is in a Department (but not a course) """
+        parent = self.findEduParent()
+        
+        if parent.Type() == 'Department' and self.context.Type() != 'Department':
+            return True
+        else:
+            return False
+        
+    def isInEduSite(self):
+        """ tests to see if the object is in a Site (but not in a department) """
+        parent = self.findEduParent()
+        
+        if parent.Type() == 'Plone Site' and self.context.Type() != 'Plone Site':
+            return True
+        else:
+            return False
+
+    def isPageInEduContainer(self):
+        """ test to see if the page is in a eduCommons container """
+        if self.isInEduContainer() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+
+    def isPageInEduCourse(self):
+        """ tests to see if the page is in a Course """
+        if self.isInEduCourse() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+
+
+    def isPageInEduDept(self):
+        """ tests to see if the object is in a Department (but not a course) """
+        if self.isInEduDept() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+        
+    def isPageInEduSite(self):
+        """ tests to see if the page is in a Site (but not in a department) """
+        if self.isInEduSite() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+
+        
+    def findEduParent(self):
+        """
+        """
+        ecutil = getUtility(IECUtility)
+        parent = ecutil.FindECParent(self.context)
+        
+        return parent
+       
+    def isEduContainer(self): 
+        """
+	Tests to see if the object is an eduCommons container 
+	"""
+
+        if self.context.Type() in ['Course','Division','Course List'] or self.context.id == 'front-page':
+            return True
+        else:
+            return False
+
+
+    def generateEmailList(self):
+        """ returns a CSV file of users' emails"""
+        email_list = ''
+        pas = self.context.acl_users
+        
+        users = pas.getUsers()    
+
+
+        for user in users:
+            roles = ''
+
+    
+        for portal_role in user.getRoles():
+            roles += portal_role + ','
+                
+            roles = '"%s"' %(roles)                 
+        
+        email_list += unicode(user.getProperty('fullname'),'UTF-8') + ',' + user.getProperty('email') + ',' + user.getUserName() + ',' + roles + '\n'
+
+
+        RESPONSE = self.context.REQUEST.RESPONSE
+        filename = 'email_list.csv'
+        header_value = contentDispositionHeader('attachment', 'UTF-8',filename=filename)
+        RESPONSE.setHeader("Content-disposition", header_value)
+        return email_list        
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/profcourses.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/profcourses.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/profcourses.pt	(revision 126)
@@ -0,0 +1,7 @@
+<style>
+
+</style>
+
+<p class="link-top">
+  <a href="#top" title="Return to Top">Return to Top</a>
+</p>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/profslisting.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/profslisting.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/profslisting.pt	(revision 126)
@@ -0,0 +1,98 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en"
+      metal:use-macro="here/main_template/macros/master"
+      i18n:domain="plone">
+
+<body>
+
+<div metal:fill-slot="main">
+<metal:main_macro define-macro="main">
+    <metal:body define-macro="body_macro"
+                tal:define="kssClassesView context/@@kss_field_decorator_view;
+                            getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;
+                            templateId template/getId">
+
+
+        <div tal:replace="structure provider:plone.abovecontenttitle" />
+
+        <h1 tal:content="here/title_or_id" class="documentFirstHeading">
+            Title or id
+        </h1>
+
+        <div class="documentDescription" tal:content="structure here/Description">
+            description
+        </div>
+
+        <div tal:replace="structure provider:plone.abovecontentbody" />
+	
+	<div id="rss_info">
+	  <a href="@@rss_feeds"><img src="rss_icon.gif" /></a>
+	  <a href="@@rss_feeds">RSS Feeds</a>
+	</div>
+
+        <div metal:define-macro="text-field-view"
+             id="parent-fieldname-text" class="stx"
+             tal:define="kss_class python:getKssClasses('text',
+                         templateId=templateId, macro='text-field-view');
+                         text here/getText|nothing"
+             tal:condition="text">
+            <div metal:define-slot="inside" tal:replace="structure text">The body</div>
+        </div>
+
+
+        <metal:listingmacro define-macro="listing">
+        <tal:topiccontents define="topicContents python:here.queryCatalog(batch=False);
+                                   batch topicContents;">
+
+            <tal:listing condition="topicContents">
+            <a style='text-align: right' href="#"
+               tal:condition="nocall: here/asPDF|nothing"
+               tal:attributes="href string:${here_url}/asPDF/atct_topic_pdf_template/atct_topic_pdf"
+               i18n:translate="label_download_as_pdf"
+               i18n:domain="atcontenttypes">
+                Download PDF
+            </a>
+            
+
+	    <!-- Start of report entry -->
+
+	    <div tal:repeat="courses python:view.getCoursesByInstructor(topicContents)" tal:omit-tag="">
+	      <div class="division-listing">
+		<p class="division-title"
+		   tal:content="python:view.getProfName(courses[0])">Professor Name
+		</p>
+		<tal:repeat tal:repeat="course python:courses[1]">
+		  <p tal:define="full_title python:view.getFullCourseTitle(course);
+			         oddrow repeat/course/odd;"
+		     tal:attributes="class python:oddrow and 'course-listing even' or 'course-listing odd'">
+		    <a href=""
+		       tal:attributes="href course/getURL"
+		       tal:content="full_title">Full Course Title</a> 
+		  </p>
+		</tal:repeat>
+              </div>
+	    </div>
+
+	    <!-- end of report entry -->
+
+            </tal:listing>
+
+            <p class="discreet"
+               tal:condition="python: not topicContents and here.listCriteria()"
+               i18n:domain="atcontenttypes"
+               i18n:translate="description_no_items_in_topic">
+                There are currently no results for this search.
+            </p>
+
+        </tal:topiccontents>
+        </metal:listingmacro>
+    </metal:body>
+
+    <div tal:replace="structure provider:plone.belowcontentbody" />
+
+</metal:main_macro>
+
+</div>
+
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/reportcontentform.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/reportcontentform.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/reportcontentform.py	(revision 126)
@@ -0,0 +1,88 @@
+##################################################################################
+#    Copyright (C) 2007 Utah State University, All rights reserved.          
+#                                                                                 
+#    This program is free software; you can redistribute it and/or modify         
+#    it under the terms of the GNU General Public License as published by         
+#    the Free Software Foundation; either version 2 of the License, or            
+#    (at your option) any later version.                                          
+#                                                                                 
+#    This program is distributed in the hope that it will be useful,              
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of               
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                
+#    GNU General Public License for more details.                                 
+#                                                                                 
+#    You should have received a copy of the GNU General Public License            
+#    along with this program; if not, write to the Free Software                  
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    
+#                                                                                 
+##################################################################################
+
+__author__ = 'Brent Lambert'
+__docformat__ = 'restructuredtext'
+__version__ = "$Revision: 1 $"[11:-2]
+
+
+from zope.formlib.form import FormFields, action
+from plone.app.form.base import AddForm
+from zope.app.form.interfaces import WidgetInputError
+from zope.component import getMultiAdapter
+from Products.PageTemplates import PageTemplateFile
+from enpraxis.educommons import eduCommonsMessageFactory as _
+from Products.MailHost.MailHost import MailHostError
+from Products.statusmessages.interfaces import IStatusMessage
+from interfaces import IReportContentForm
+from Products.SecureMailHost.mail import Mail
+
+
+def validate_report(form, action, data):
+    """ Validate the from email address, if it exists. """
+    errors = form.validate(action, data)
+    if errors:
+        return errors
+    if data.has_key('email') and data['email']:
+        email = data['email'].encode('ascii')
+        if not form.context.MailHost.validateSingleEmailAddress(email):
+            ew = form.widgets.get('email')
+            ew._error = WidgetInputError(form.context.__name__, ew.label, _('Invalid email address'))
+            return ew._error
+    
+
+class ReportContentForm(AddForm):
+    """ A form for getting feedback from end users. """
+
+    form_fields = FormFields(IReportContentForm)
+    label = u'Report Content'
+    description = u'Please complete the following form to send a report to the site administrator.'
+
+    @action(_(u'Submit'), 
+            validator=validate_report,
+            name=u'Submit')
+    def action_submit(self, action, data):
+        # Convert post variables into email fields
+        message = ''
+        mto = self.context.email_from_address
+        if data.has_key('email') and data['email']:
+            mfrom='%s' %data['email'].encode('ascii')
+        else:
+            # If no return email is provided, use the TO address.
+            # Do this so that the from field will pass validation.
+            mfrom = mto
+        if data['name'] != None:
+            name = data['name']
+            message += '%s has reported the following content as inappropriate, please review: \n\n' % name
+        else:
+            message += 'The following content has been reported as inappropriate, please review: \n\n'
+        subject = 'Content Reported as Inappropriate'
+        message += '\t %s \n\n' % self.context.absolute_url()
+        message += data['body']
+        # Post the message
+        try:
+            self.context.MailHost.secureSend(message, mto=mto, mfrom=mfrom, subject=subject, charset='utf8')
+        except MailHostError, e:
+            IStatusMessage(self.request).addStatusMessage(_('Report Content request failed.'), type='error')
+            url = getMultiAdapter((self.context, self.request), name='absolute_url')()
+            self.request.response.redirect(url)
+            return ''
+
+        self.request.response.redirect('content_reported')
+        return ''
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/reusecourse.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/reusecourse.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/reusecourse.py	(revision 126)
@@ -0,0 +1,174 @@
+import string, xmlrpclib, httplib
+
+from StringIO import StringIO
+from base64 import encodestring, decodestring
+
+from Products.CMFCore.utils import getToolByName
+from enpraxis.educommons import eduCommonsMessageFactory as _
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+from enpraxis.educommons.portlet.coursebuilderform import EitherOrWidget
+
+from plone.app.form.base import AddForm
+from zope.app.form.browser import PasswordWidget
+from zope.formlib.form import FormFields, action, applyChanges
+from zope.interface import Interface
+from zope.schema.interfaces import IVocabularyFactory
+from zope.schema.vocabulary import SimpleVocabulary, SimpleTerm
+from zope.schema import TextLine, Choice
+from zope.component import getUtility
+from zope.publisher.browser import BrowserView
+
+
+class BasicAuthTransport(xmlrpclib.Transport):
+    """ taken from http://www.zope.org/Members/Amos/XML-RPC """
+    def __init__(self, username=None, password=None, verbose=0):
+        self.username=username
+        self.password=password
+        self.verbose=verbose
+
+    def request(self, host, handler, request_body, verbose=0):
+        h = httplib.HTTP(host)
+        h.putrequest("POST", handler)
+        h.putheader("Host", host)
+        h.putheader("User-Agent", self.user_agent)
+        h.putheader("Content-Type", "text/xml")
+        h.putheader("Content-Length", str(len(request_body)))
+
+        # basic auth
+        if self.username is not None and self.password is not None:
+            h.putheader("AUTHORIZATION", "Basic %s" % string.replace(
+                    encodestring("%s:%s" % (self.username, self.password)),
+                    "\012", ""))
+        h.endheaders()
+
+        if request_body:
+            h.send(request_body)
+
+        errcode, errmsg, headers = h.getreply()
+
+        if errcode != 200:
+            raise xmlrpclib.ProtocolError(
+                host + handler,
+                errcode, errmsg,
+                headers
+                )
+
+        return self.parse_response(h.getfile())
+
+class XMLRPC(BrowserView):
+    
+    def importPackage(self, div_id, div_title, zip_title, zip_file, pkg_type, rtype):
+        if hasattr(self.context, div_id):
+            div = getattr(self.context, div_id)
+        else:
+            self.context.invokeFactory('Division', id=div_id, title=div_title)
+            div = getattr(self.context, div_id)
+
+        zip_title = self.context.generateUniqueId(zip_title)
+        div.invokeFactory('Course', zip_title)
+        course = getattr(div, zip_title)
+
+        zip_file = StringIO(decodestring(zip_file))
+
+        ims_util = getUtility(IIMSTransportUtility)
+        ims_util.importZipfile(course, zip_file, pkg_type, rtype=rtype)
+
+    def retrieveDivisions(self):
+        """ Returns the ID and Title for each Division in the target instance  """
+        brains = self.context.portal_catalog.searchResults(Type='Division')
+        return [(x.id, x.Title) for x in brains]
+
+        
+
+
+def remotedivisionsvocab(context):
+    """ Get the list of current divisions from OpenOCW and return it as a vocabulary """
+    ecprops = context.portal_url.portal_properties.educommons_properties
+    remote_url = ecprops.reusecourse_instance
+    remote = xmlrpclib.Server(remote_url)
+    try:
+        terms = remote.retrieveDivisions()
+        return SimpleVocabulary([SimpleTerm(x[0], x[1]) for x in terms])
+    except xmlrpclib.Fault:
+        message = _('The remote site is unavailable of configured incorrectly. Please contact an administrator.')
+        url = '%s/folder_contents' % context.absolute_url()
+        context.plone_utils.addPortalMessage(message)
+        context.request.response.redirect(url)
+
+
+
+
+
+class ICourseExportForm(Interface):
+    """ Interface for Course Export Display form """
+
+    remote_division = Choice(title=u'Division',
+                             required=False,
+                             vocabulary="eduCommons.remotedivisionsvocab")
+
+
+    open_ocw_username = TextLine(title=u'OpenOCW User Name',
+                                 description=_(u'Your user name on OpenOCW'),
+                                 required=True)
+
+    open_ocw_password = TextLine(title=u'OpenOCW User Password',
+                                 description=_(u'Your user password on OpenOCW'),
+                                 required=True)
+
+    
+class CourseExportForm(AddForm):
+    """ Renderer for Course Export Form """
+
+    form_fields = FormFields(ICourseExportForm)
+    form_fields['remote_division'].custom_widget = EitherOrWidget
+    form_fields['open_ocw_password'].custom_widget = PasswordWidget
+
+    label = _(u'Export a Course to OpenOCW')
+    description = _(u'Reuse this course on OpenOCW. In order to do so, you must have an account at OpenOCW.org.')
+
+    def __init__(self, context, request):
+        super(CourseExportForm, self).__init__(context, request)
+        self.plone_utils = getToolByName(self.context, 'plone_utils')
+
+    @action(_(u'Reuse'), 
+            name=u'Reuse')
+
+    def action_submit(self, action, data): 
+        """ Reuse a course. """
+        ecprops = self.context.portal_url.portal_properties.educommons_properties
+        remote_url = ecprops.reusecourse_instance
+        rtype = 'eduCommons'
+
+        username = self.request.form['form.open_ocw_username']
+        password = self.request.form['form.open_ocw_password']
+        div_title = self.request.form['form.remote_division']
+        newdivision = self.request.form['form.newdivision']
+
+        remote=xmlrpclib.Server(remote_url,
+                           BasicAuthTransport(username, password) )
+
+        course = self.context.getECParent()
+
+        zip_title = '%s.zip' % course.getId()
+        zip_file = getattr(course, zip_title).data
+        zip_file = encodestring(zip_file)
+        pkg_type = 'Default'
+        
+        if not newdivision:
+            remotedivvocab = getUtility(IVocabularyFactory, name='eduCommons.remotedivisionsvocab')(self.context)
+            div_id = remotedivvocab.getTermByToken(div_title).value
+        else:
+            div_id = self.plone_utils.normalizeString(newdivision)
+            div_title = newdivision
+            
+
+        remote.importPackage(div_id, div_title, zip_title, zip_file, pkg_type, rtype)
+ 
+        del zip_file
+        del remote
+
+        # Redirect to the the login page at the remote instance, with the appropriate came_form var
+        new_course_url = '%s/login_form' % remote_url
+        self.request.RESPONSE.redirect(new_course_url)
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss.pt	(revision 126)
@@ -0,0 +1,27 @@
+<?xml version="1.0"?>
+<rdf:RDF
+  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
+  xmlns:cc="http://web.resource.org/cc/"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+  xmlns:tal="http://xml.zope.org/namespaces/tal"
+  xmlns:metal="http://xml.zope.org/namespaces/metal">
+
+<tal:block define="dummy context/rssAllowed" />
+
+<tal:block 
+    define="
+        syn context/portal_syndication;
+        objectList view/getRSSObjects">
+    <metal:block use-macro="context/@@rss_template/macros/master">
+        <metal:block fill-slot="syndication">
+            <syn:updatePeriod tal:content="python:syn.getUpdatePeriod(context) or default">hourly</syn:updatePeriod>
+            <syn:updateFrequency tal:content="python:syn.getUpdateFrequency(context) or default">2</syn:updateFrequency>
+            <syn:updateBase tal:content="python:syn.getHTML4UpdateBase(context) or default">2000-01-01T12:00+00:00</syn:updateBase>
+        </metal:block>
+    </metal:block>
+</tal:block>
+
+</rdf:RDF>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_all.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_all.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_all.pt	(revision 126)
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<rdf:RDF
+  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
+  xmlns:cc="http://web.resource.org/cc/"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+  xmlns:tal="http://xml.zope.org/namespaces/tal"
+  xmlns:metal="http://xml.zope.org/namespaces/metal">
+
+<tal:block define="dummy context/rssAllowed" />
+rss all
+
+<tal:block 
+    define="
+        syn context/portal_syndication;
+        objectList view/getRSSObjects;">
+    <metal:block use-macro="context/@@rss_all_template/macros/master">
+        <metal:block fill-slot="syndication">
+            <syn:updatePeriod tal:content="python:syn.getUpdatePeriod(context) or default">hourly</syn:updatePeriod>
+            <syn:updateFrequency tal:content="python:syn.getUpdateFrequency(context) or default">2</syn:updateFrequency>
+            <syn:updateBase tal:content="python:syn.getHTML4UpdateBase(context) or default">2000-01-01T12:00+00:00</syn:updateBase>
+        </metal:block>
+    </metal:block>
+</tal:block>
+
+</rdf:RDF>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_all_template.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_all_template.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_all_template.pt	(revision 126)
@@ -0,0 +1,88 @@
+<?xml version="1.0"?>
+<rdf:RDF
+  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
+  xmlns:cc="http://web.resource.org/cc/"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:tal="http://xml.zope.org/namespaces/tal"
+  xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+  xmlns:metal="http://xml.zope.org/namespaces/metal"
+ >
+
+<metal:block 
+    define-macro="master" 
+    tal:define="
+                    syn context/portal_syndication; 
+                    objects python: objectList;
+                    cclicense python: view.getCCLicense(here)"
+    >
+
+<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/xml;;charset='+context.plone_utils.getSiteEncoding())" />
+
+<channel rdf:about="" tal:attributes="rdf:about request/URL" >
+  <title tal:content="context/pretty_title_or_id">The title</title>
+  <link tal:content="context/portal_url">http://url.to.portal</link>
+  
+  <description>
+    <metal:block define-slot="description">
+       <tal:block content="context/Description">
+        Default rss description goes here
+        </tal:block>
+       </metal:block>
+  </description>
+
+  <cc:license tal:condition="cclicense"
+              rdf:resource="http://creativecommons.org/"
+              tal:attributes="rdf:resource python:cclicense[0]"/>
+  
+  <tal:comment replace="nothing">
+    The syndication tool is pretty brain dead and won't let you access the variables
+    you need for this from something like search_rss, unless you've enable site syndication
+    it really needs rewriting.
+  </tal:comment>
+  <metal:block define-slot="syndication" />
+  
+  <image
+    rdf:resource=""
+    tal:attributes="rdf:resource string:${context/portal_url}/${context/base_properties/logoName}" />
+
+  <items>
+    <rdf:Seq>
+        <tal:block repeat="obj_item python: objects">
+            <rdf:li rdf:resource=""
+                tal:attributes="rdf:resource obj_item/getURL|obj_item/absolute_url" />
+        </tal:block>
+    </rdf:Seq>
+  </items>
+
+</channel>
+
+<tal:block repeat="brain python: objects">    
+  <item rdf:about="" 
+        tal:attributes="rdf:about obj_item/getURL|obj_item/absolute_url" 
+        tal:define="obj_item brain/getObject|nocall:brain;
+                    objcclicense python:view.getCCLicense(obj_item)">        
+    <title tal:content="obj_item/pretty_title_or_id">Title</title>        
+    <link tal:content="obj_item/Identifier">Identifier</link>        
+    <description tal:content="obj_item/Description">            Description        </description>        
+    <cc:license tal:condition="objcclicense" tal:attributes="rdf:resource python:objcclicense[0]"/>
+    <dc:publisher tal:content="obj_item/Publisher">Publisher</dc:publisher>        
+    <tal:block tal:repeat="item obj_item/Creators">
+      <dc:creator tal:content="item">Item</dc:creator>
+    </tal:block>
+    <dc:rights tal:content="obj_item/Rights">Rights</dc:rights>        
+    <tal:block tal:repeat="item obj_item/Subject">            
+      <dc:subject tal:content="item">Item</dc:subject>        
+    </tal:block>        
+    <tal:block tal:repeat="item obj_item/Contributors">            
+      <dc:contributor tal:content="item">Item</dc:contributor>        
+    </tal:block>        
+    <dc:date tal:content="python: obj_item.modified().HTML4()">Modification date</dc:date>        
+    <dc:type tal:content="obj_item/Type">Type</dc:type>
+    <dc:format tal:content="obj_item/Format">Format</dc:format>    
+  </item>
+</tal:block>
+
+</metal:block>
+</rdf:RDF>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_questions.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_questions.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_questions.pt	(revision 126)
@@ -0,0 +1,134 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      xmlns:tal="http://xml.zope.org/namespaces/tal"
+      xmlns:metal="http://xml.zope.org/namespaces/metal"
+      xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+      lang="en"
+      metal:use-macro="here/main_template/macros/master"
+      i18n:domain="plone">
+
+<body>
+
+    <div metal:fill-slot="main">
+    <metal:main-macro define-macro="main"
+                      tal:define="kssClassesView context/@@kss_field_decorator_view;
+                                  getKssClasses nocall:kssClassesView/getKssClassesInlineEditable;
+                                  templateId template/getId">
+
+      <div tal:replace="structure provider:plone.abovecontenttitle" />
+
+
+       <h1 tal:content="string:${portal_title} OCW RSS Feeds">
+            title or id
+        </h1>
+
+        <div tal:replace="structure provider:plone.belowcontenttitle" />
+
+        <p metal:use-macro="here/kss_generic_macros/macros/generic_description_view">
+            Description
+        </p>
+
+        <div tal:replace="structure provider:plone.abovecontentbody" />
+	
+	
+    <tal:block i18n:domain="eduCommons">
+      <p class="rss_info" 
+	 style="padding-top: 30px;"
+	 i18n:translate="">
+	Receive notification of new <span i18n:name="portal_title" tal:replace="portal_title"/> OCW courses on your desktop, or add them to your blog or website.
+      </p>
+
+      <h3 i18n:translate="">Available Feeds</h3>
+      <p class="documentByLine">
+	<a href="#"
+	   tal:attributes="href string:@@rss_feeds/#rss_faqs">RSS FAQs</a>
+      </p>
+      <p class="rss_info">
+        <a href=""
+           tal:attributes="href string:${portal_url}/rss;
+                           title string:${portal_title} RSS Feed">
+         <img alt="RSS" 
+              src="rss_icon.gif" />
+        </a>
+
+        <a href="#"
+           tal:attributes="href string:${portal_url}/rss;
+                           title string:${portal_title} RSS Feed"
+	   i18n:translate="">			   
+	   Courses in all departments
+	 </a>
+
+     </p>
+    
+      <h5 i18n:translate="">Department Feeds</h5>
+      <div tal:repeat="dept python:here.portal_catalog(portal_type='Division')">
+	<p tal:define="deptid python:dept.id">
+	  <a tal:attributes="href string:${portal_url}/${deptid}/@@rss"><img src="rss_icon.gif" /></a> 
+	  <a tal:attributes="href string:${portal_url}/${deptid}/@@rss"><span tal:replace="python:dept.Title" /></a>
+	</p>
+      </div>
+
+    <!-- div metal:use-macro="context/CoursesListingMacros/macros/RSSDepartmentFeeds"/ -->
+
+    <h3 id="rss_faqs" i18n:translate="">What is RSS?</h3>
+
+      <p i18n:translate="">RSS stands for Really Simple Syndication. RSS is a time-saving way for you to receive news and information updates (often called 'RSS feeds', 'news feeds' or simply 'feeds') from your favorite Web sites and blogs.</p>
+
+      <p i18n:translate="">Typically RSS feeds consist of headlines and short summaries of new articles, blog entries or search results, though some Web sites and blogs offer the full text of articles or blog entrees as feeds.</p>
+
+      <h3 i18n:translate="">Why use RSS?</h3>
+
+      <p i18n:translate="">By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes.</p>
+
+      <h3 i18n:translate="">How to I start using RSS feeds?</h3>
+  
+      <p i18n:translate="">In general, the first thing you need is something called a news reader. This is a piece of software that checks RSS feeds and lets you read any new articles that have been added to them. There are many different versions, some of which are accessed using a browser, and some of which are downloadable applications. Browser-based news readers let you catch up with your RSS feed subscriptions from any computer, whereas downloadable applications let you store them on your main computer, in the same way that you either download your e-mail, or keep it on a web-based service.</p>
+
+      <p i18n:translate="">Once you have chosen a news reader, all you have to do is to decide what content you want to receive in your news reader, by finding and subscribing to the relevant RSS feeds. For example, if you would like the latest courses added to <span i18n:name="portal_title" tal:replace="portal_title" /> OCW, simply visit the Course List page or this page and you will notice an orange RSS button.</p>
+
+      <img src="doc_actions.png" 
+	   style="border: solid 1px grey; margin-bottom: 1em"
+	   alt="Image of Document Actions"
+	   i18n:attributes="alt"/>
+
+      <p i18n:translate="">If you click on the button you can subscribe to the feed in various ways, including by dragging the URL of the RSS feed into your news reader or by cutting and pasting the same URL into a new feed in your news reader. Most sites that offer RSS feeds use a similar orange RSS button, but some may just have a normal web link to the feed.</p>
+      
+      <p i18n:translate="">Some browsers, including Firefox and Safari, automatically check for RSS feeds for you when you visit a Web site, and display an icon when they find one. This can make subscribing to RSS feeds much easier. For more details on these, please check their Web sites.</p>
+
+      <h3 i18n:translate="">How do I get a news reader?</h3>
+
+      <p i18n:translate="">There is a range of different news readers available and new versions are appearing all the time.</p>
+
+      <p i18n:translate="">Different news readers work on different operating systems, so you will need to choose one that will work with your computer.</p>
+
+      <p i18n:translate="">Here is one 
+	<a href="http://www.google.com/alpha/Top/Reference/Libraries/Library_and_Information_Science/Technical_Services/Cataloguing/Metadata/RDF/Applications/RSS/News_Readers/"
+	   i18n:translate="" i18n:name="google-reader">
+          list
+	</a> 
+	of available readers from Google.</p>
+
+      <p class="link-top" >
+	<a href="rss_feeds#Top" 
+           i18n:attributes="title" 
+           i18n:translate="" 
+           title="Return to Top">Return to Top</a>
+      </p>
+      
+
+    </tal:block>
+
+
+      <p>This material was created or adapted from material created by MIT OCW, Copyright &copy; 2007 MIT in accordance with the <a href="http://ocw.mit.edu/OcwWeb/Global/terms-of-use.htm">MIT OCW Terms of Use, http://ocw.mit.edu/OcwWeb/Global/terms-of-use.htm</a>.</p>
+
+
+      <div tal:replace="structure provider:plone.belowcontentbody" />
+
+      <div tal:replace="structure context/@@copyright_byline_view|nothing" />
+
+      <div tal:replace="structure context/@@citation_view|nothing" />
+
+    </metal:main-macro>
+    </div>
+    
+  </body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_template.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_template.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/rss_template.pt	(revision 126)
@@ -0,0 +1,131 @@
+<?xml version="1.0"?>
+<rdf:RDF
+  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+  xmlns:dc="http://purl.org/dc/elements/1.1/"
+  xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
+  xmlns:cc="http://web.resource.org/cc/"
+  xmlns="http://purl.org/rss/1.0/"
+  xmlns:tal="http://xml.zope.org/namespaces/tal"
+  xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+  xmlns:metal="http://xml.zope.org/namespaces/metal"
+ >
+
+<metal:block 
+    define-macro="master" 
+    tal:define="syn context/portal_syndication;
+		default_max syn/getMaxItems;
+                max max_items|python:syn.getMaxItems(here);
+                objects python: objectList[:max];
+                cclicense python: view.getCCLicense(here)"
+    >
+
+<metal:block tal:define="dummy python:request.RESPONSE.setHeader('Content-Type', 'text/xml;;charset='+context.plone_utils.getSiteEncoding())" />
+
+<channel rdf:about="" tal:attributes="rdf:about request/URL" >
+  <title tal:content="context/pretty_title_or_id">The title</title>
+  <link tal:content="context/portal_url">http://url.to.portal</link>
+  <description>
+    <metal:block define-slot="description">
+       <tal:block content="context/Description">
+        Default rss description goes here
+        </tal:block>
+       </metal:block>
+  </description>
+
+  <cc:license tal:condition="cclicense"
+              rdf:resource="http://creativecommons.org/"
+              tal:attributes="rdf:resource python:cclicense[0]"/>
+  
+  <tal:comment replace="nothing">
+    The syndication tool is pretty brain dead and won't let you access the variables
+    you need for this from something like search_rss, unless you've enable site syndication
+    it really needs rewriting.
+  </tal:comment>
+  <metal:block define-slot="syndication" />
+  
+  <image
+    rdf:resource=""
+    tal:attributes="rdf:resource string:${context/portal_url}/${context/base_properties/logoName}" />
+
+  <items>
+    <rdf:Seq>
+        <tal:block repeat="obj_item python: objects">
+            <rdf:li resource=""
+                tal:attributes="resource obj_item/getURL|obj_item/absolute_url" />
+        </tal:block>
+    </rdf:Seq>
+  </items>
+
+</channel>
+
+<tal:block repeat="brain python: objects">    
+  <item rdf:about="" 
+        tal:attributes="rdf:about obj_item/getURL|obj_item/absolute_url" 
+        tal:define="obj_item brain/getObject|nocall:brain;
+                    objcclicense python:view.getCCLicense(obj_item);
+                    objcreators obj_item/Creators;
+                    objcontributors obj_item/Contributors;
+                    objsubjects obj_item/Subject">        
+    <title tal:content="obj_item/pretty_title_or_id">Title</title>        
+    <link tal:content="obj_item/Identifier">Identifier</link>        
+    <description tal:content="obj_item/Description">Description</description>        
+    <cc:license tal:condition="objcclicense" tal:attributes="rdf:resource python:objcclicense[0]"/>
+    <tal:publisher tal:condition="context/portal_metadata/Publisher">
+      <dc:publisher tal:content="context/portal_metadata/Publisher">Publisher</dc:publisher>        
+    </tal:publisher>
+    <tal:block tal:condition="python: len(objcreators) > 1">
+      <dc:creator>
+        <rdf:bag>
+          <rdf:li tal:repeat="item objcreators"><tal:block tal:replace="item"/></rdf:li>
+        </rdf:bag>
+      </dc:creator>
+    </tal:block>
+    <tal:block tal:condition="python: 1 == len(objcreators)">
+      <dc:creator tal:content="python: objcreators[0]"/>
+    </tal:block>
+    <dc:rights tal:condition="obj_item/Rights" tal:content="obj_item/Rights">Rights</dc:rights>        
+    <tal:block tal:condition="python: len(objsubjects) > 1">
+      <dc:subject>
+        <rdf:bag>
+          <rdf:li tal:repeat="item objsubjects"><tal:block tal:replace="item"/></rdf:li>
+        </rdf:bag>
+      </dc:subject>
+    </tal:block>
+    <tal:block tal:condition="python: 1 == len(objsubjects)">
+      <dc:subject tal:content="python: objsubjects[0]"/>
+    </tal:block>
+    <tal:block tal:condition="python: len(objcontributors) > 1">
+      <dc:contributor>
+        <rdf:bag>
+          <rdf:li tal:repeat="item objcontributors"><tal:block tal:replace="item"/></rdf:li>
+        </rdf:bag>
+      </dc:contributor>
+    </tal:block>
+    <tal:block tal:condition="python: 1==len(objcontributors)">
+      <dc:contributor tal:content="python: objcontributors[0]"/>
+    </tal:block>
+    <dc:date tal:content="python: obj_item.modified().HTML4()">Modification date</dc:date>        
+    <dc:type tal:content="obj_item/Type">Type</dc:type>
+    <dc:format tal:content="obj_item/Format">Format</dc:format>    
+  </item>
+</tal:block>
+
+<tal:block repeat="cclicense view/getCCLicenseTags">
+  <cc:License tal:attributes="rdf:about python:cclicense[1]"
+              tal:define="permitstags python:view.getCCLicenseTag(cclicense[0], 'permits');
+                          requirestags python:view.getCCLicenseTag(cclicense[0], 'requires');
+                          prohibitstags python:view.getCCLicenseTag(cclicense[0], 'prohibits')">
+    <tal:block condition="permitstags">
+      <cc:permits tal:repeat="tag permitstags" tal:attributes="rdf:resource tag"/>
+    </tal:block>
+    <tal:block condition="requirestags">
+      <cc:requires tal:repeat="tag requirestags" tal:attributes="rdf:resource tag"/>
+    </tal:block>
+    <tal:block condition="prohibitstags">
+      <cc:prohibits tal:repeat="tag prohibitstags" tal:attributes="rdf:resource tag"/>
+    </tal:block>
+  </cc:License>
+</tal:block>
+
+</metal:block>
+</rdf:RDF>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/searchview.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/searchview.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/searchview.py	(revision 126)
@@ -0,0 +1,149 @@
+from zope.component import getUtility
+from zope.publisher.browser import BrowserView
+from zope.annotation.interfaces import IAnnotations
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from enpraxis.educommons.interfaces import ICourseUpdateEvent
+from enpraxis.educommons.events import CourseUpdate
+from enpraxis.educommons.events import DeleteObjectEvent
+from Products.Archetypes.utils import contentDispositionHeader
+from zope.event import notify
+
+class SearchView(BrowserView):
+    """
+    """
+    def isInEduContainer(self):
+        """ test to see if the object is in a eduCommons container """
+        parent = self.findEduParent()
+        
+        if parent.Type() in ['Course','Division'] and self.context.Type() not in ['Course','Division']:
+            return True
+        else:
+            return False
+
+    def isInEduCourse(self):
+        """ tests to see if the object is in a Course """
+        parent = self.findEduParent()
+
+        if parent.Type() == 'Course' and self.context.Type() != 'Course':
+            return True
+        else:
+            return False
+
+
+    def isInEduDept(self):
+        """ tests to see if the object is in a Department (but not a course) """
+        parent = self.findEduParent()
+        
+        if parent.Type() == 'Department' and self.context.Type() != 'Department':
+            return True
+        else:
+            return False
+        
+    def isInEduSite(self):
+        """ tests to see if the object is in a Site (but not in a department) """
+        parent = self.findEduParent()
+        
+        if parent.Type() == 'Plone Site' and self.context.Type() != 'Plone Site':
+            return True
+        else:
+            return False
+
+    def isPageInEduContainer(self):
+        """ test to see if the page is in a eduCommons container """
+        if self.isInEduContainer() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+
+    def isPageInEduCourse(self):
+        """ tests to see if the page is in a Course """
+        if self.isInEduCourse() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+
+
+    def isPageInEduDept(self):
+        """ tests to see if the object is in a Department (but not a course) """
+        if self.isInEduDept() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+        
+    def isPageInEduSite(self):
+        """ tests to see if the page is in a Site (but not in a department) """
+        if self.isInEduSite() and self.context.Type() == 'Page':
+            return True
+        else:
+            return False
+
+        
+    def findEduParent(self):
+        """
+        """
+        ecutil = getUtility(IECUtility)
+        parent = ecutil.FindECParent(self.context)
+        
+        return parent
+       
+    def isEduContainer(self): 
+        """
+	Tests to see if the object is an eduCommons container 
+	"""
+
+        if self.context.Type() in ['Course','Division','Course List'] or self.context.id == 'front-page':
+            return True
+        else:
+            return False
+
+
+    def generateEmailList(self):
+        """ returns a CSV file of users' emails"""
+        email_list = ''
+        pas = self.context.acl_users
+        
+        users = pas.getUsers()    
+
+
+        for user in users:
+            roles = ''
+
+    
+            for portal_role in user.getRoles():
+                roles += portal_role + ','
+                
+                roles = '%s' %(roles)                 
+        
+            email_list += unicode(user.getProperty('fullname'),'UTF-8') + ',' + user.getProperty('email') + ',' + user.getUserName() + ', "' + roles + '"\n'
+
+
+        RESPONSE = self.context.REQUEST.RESPONSE
+        filename = 'email_list.csv'
+        header_value = contentDispositionHeader('attachment', 'UTF-8',filename=filename)
+        RESPONSE.setHeader("Content-disposition", header_value)
+        return email_list        
+
+    def copyrightClearedOnObj(self):
+        if not IAnnotations(self.context).has_key('eduCommons.clearcopyright'):
+            IAnnotations(self.context)['eduCommons.clearcopyright'] = False
+        return IAnnotations(self.context)['eduCommons.clearcopyright']
+
+    def getObjPositionInCourse(self):
+        return IAnnotations(self.context)['eduCommons.objPositionInCourse']
+
+    def changeStateEvent(self, object, workflow_action, bulkChange, initial_state=None):
+	notify(CourseUpdate(object, workflow_action, bulkChange, initial_state))
+
+    def notifyDeleteObjectEvent(self, object, bulkChange, contains_published=True):
+        notify(DeleteObjectEvent(object, bulkChange, contains_published))
+
+    def changeNav(self, nav_action):
+        if nav_action == 'hide':
+            message = 'Object(s) set to not display in left hand navigation'
+            self.context.setExcludeFromNav(True)
+        else:
+            message = 'Object(s) set to display in left hand navigation'
+            self.context.setExcludeFromNav(False)
+
+        self.context.reindexObject()
+        return message
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/selector.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/selector.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/selector.py	(revision 126)
@@ -0,0 +1,28 @@
+from zope.component import queryMultiAdapter
+from Products.Five.browser.pagetemplatefile import ZopeTwoPageTemplateFile
+from plone.app.i18n.locales.browser.selector import LanguageSelector
+
+
+class TranslatableLanguageSelector(LanguageSelector):
+    """Language selector for translatable content.
+    """
+
+    render = ZopeTwoPageTemplateFile('languageselector.pt')
+
+    def languages(self):
+        results = LanguageSelector.languages(self)
+        translations = self.context.getTranslations()
+
+        for data in results:
+            data['translated'] = data['code'] in translations
+            if data['translated']:
+                trans = translations[data['code']][0]
+                state = queryMultiAdapter((trans, self.request),
+                        name='plone_context_state')
+                data['url'] = state.view_url() + '?set_language=' + data['code']
+            else:
+                state = queryMultiAdapter((self.context, self.request),
+                        name='plone_context_state')
+                data['url'] = state.view_url() + '?set_language=' + data['code']
+
+        return results
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sharing.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sharing.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sharing.pt	(revision 126)
@@ -0,0 +1,152 @@
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"
+      lang="en"
+      metal:use-macro="context/@@standard_macros/page"
+      i18n:domain="plone">
+
+<head>
+
+<body>
+<div metal:fill-slot="body"
+     tal:define="context_state context/@@plone_context_state">
+
+<h1 class="documentFirstHeading"
+    i18n:translate="heading_currently_assigned_shares">
+    Sharing for
+    "<span tal:content="context/Title" tal:omit-tag="" i18n:name="folder">title</span>"
+</h1>
+
+<dl class="portalMessage info" tal:condition="context_state/is_default_page">
+    <dt i18n:translate="">
+        Info
+    </dt>
+    <dd i18n:translate="help_sharing_page_default_page">
+        You are adjusting the sharing privileges for a default view in a container.
+        To adjust them for the entire container,
+        <a i18n:name="go_here"
+           i18n:translate="help_sharing_go_here"
+           tal:define="folder context_state/folder"
+           tal:attributes="href string:${folder/absolute_url}/sharing">go here</a>.
+    </dd>
+</dl>
+
+<p class="documentDescription"
+   i18n:translate="description_sharing_control">
+    You can control who can view and edit your item using the list below.
+</p>
+
+<form method="post" 
+      tal:attributes="action string:${context/absolute_url}/@@sharing">
+      
+    <input type="hidden" name="form.submitted:boolean" value="True" />
+
+    <div class="field">
+        <input type="text" 
+               id="sharing-user-group-search"
+               size="30" 
+               name="search_term"
+               title="Search for user or group" 
+               i18n:attributes="title"
+               class="searchField inputLabel"
+               value="" 
+               />
+        <input type="submit"
+               id="sharing-save-button" 
+               name="form.button.Search"
+               value="Search"
+               class="searchButton allowMultiSubmit" 
+               i18n:attributes="value box_search"
+               />
+    </div>
+
+<table metal:define-macro="user-group-sharing" id="user-group-sharing"
+       class="listing" 
+       summary="Current sharing permissions" 
+       tal:define="available_roles view/roles;
+                   num_columns python:len(available_roles) + 1;
+                   role_settings view/role_settings"
+       i18n:attributes="summary summary_assigned_roles;">
+
+      <thead metal:define-macro="user-group-sharing-head" id="user-group-sharing-head">
+          <tr tal:condition="python:len(role_settings) > 0">
+              <th i18n:translate="label_name">User/Group</th>
+              <th class="nosort"
+                  tal:repeat="role available_roles"
+                  tal:content="role/title"  />
+          </tr>
+      </thead>
+
+    <tbody metal:define-macro="user-group-sharing-settings" id="user-group-sharing-settings">
+        <tal:entries repeat="entry role_settings">
+            <tr tal:define="is_group python:entry['type'] == 'group';
+                            oddrow repeat/entry/odd;"
+                tal:attributes="class python:oddrow and 'odd' or 'even'">
+                <td>
+                    <img tal:condition="is_group" tal:replace="structure context/group.gif" /> 
+                    <img tal:condition="not:is_group" tal:replace="structure context/user.gif" /> 
+                    <span tal:replace="entry/title" />
+                    <input
+                        type="hidden"
+                        name="entries.id:records"
+                        tal:attributes="value entry/id"
+                        />
+                    <input
+                        type="hidden"
+                        name="entries.type:records"
+                        tal:attributes="value entry/type"
+                        />
+                </td>
+                <td class="listingCheckbox"
+                    tal:repeat="role available_roles">
+                    <tal:block define="entry_role python:entry['roles'][role['id']]">
+                        <img tal:condition="python:entry_role == 'global'" tal:replace="structure context/site_icon.gif">
+                        <img tal:condition="python:entry_role == 'acquired'" tal:replace="structure context/confirm_icon.gif">
+                        <tal:block condition="python:entry_role in (True, False)">
+                            <input class="noborder"
+                                type="checkbox"
+                                value="True"
+                                tal:attributes="name string:entries.role_${role/id}:records;
+                                                checked python:entry_role and 'checked' or None"
+                                />
+                        </tal:block>
+                    </tal:block>
+                </td>
+            </tr>
+        </tal:entries>
+    </tbody>
+    
+</table>
+
+<div class="field">
+    <input class="noborder"
+           type="checkbox"
+           name="inherit:boolean"
+           value="1"
+           checked="checked"
+           id="inherit"
+           tal:attributes="checked python:view.inherited() and 'checked' or None"
+           /> 
+    <label for="inherit" i18n:translate="label_inherit_local_roles">
+    Inherit permissions from higher levels
+    </label>
+    <div class="formHelp" i18n:translate="help_inherit_local_roles">
+        By default, permissions from the container of this item are inherited.
+        If you disable this, only the explicitly defined sharing permissions will
+        be valid.
+        In the overview, the symbol
+        <img i18n:name="image_confirm_icon"
+             tal:replace="structure context/confirm_icon.gif" />
+        indicates an inherited value. Similarly, the symbol
+        <img i18n:name="image_link_icon"
+             tal:replace="structure context/site_icon.gif" /> 
+        indicates a global role, which is managed by the site administrator.
+    </div>
+</div>
+
+    <input class="context" type="submit" name="form.button.Save" value="Save" i18n:attributes="value label_save" />
+    <input class="standalone" type="submit" name="form.button.Cancel" value="Cancel" i18n:attributes="value label_cancel"/>
+
+</form>
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sharing.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sharing.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sharing.py	(revision 126)
@@ -0,0 +1,417 @@
+from zope.component import getUtilitiesFor, queryUtility, getMultiAdapter
+
+from Products.Five.browser import BrowserView
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+from Acquisition import aq_inner, aq_parent, aq_base
+from AccessControl import Unauthorized
+from zExceptions import Forbidden
+
+from Products.CMFCore.utils import getToolByName
+from Products.CMFCore import permissions
+from Products.CMFPlone import PloneMessageFactory as _
+
+from plone.memoize.instance import memoize, clearafter
+
+from plone.app.workflow.interfaces import ISharingPageRole
+
+from enpraxis.educommons.browser.interfaces import IeduCommonsSharingPageRole
+
+AUTH_GROUP = 'AuthenticatedUsers'
+STICKY = (AUTH_GROUP,)
+
+class SharingView(BrowserView):
+    
+    # Actions
+    template = ViewPageTemplateFile('sharing.pt')
+    
+    def __call__(self):
+        """Perform the update and redirect if necessary, or render the page
+        """
+        
+        postback = True
+        
+        form = self.request.form
+        submitted = form.get('form.submitted', False)
+    
+        save_button = form.get('form.button.Save', None) is not None
+        cancel_button = form.get('form.button.Cancel', None) is not None
+    
+        if submitted and not cancel_button:
+
+            if not self.request.get('REQUEST_METHOD','GET') == 'POST':
+                raise Forbidden
+            
+            # Update the acquire-roles setting
+            inherit = bool(form.get('inherit', False))
+            self.update_inherit(inherit)
+
+            # Update settings for users and groups
+            entries = form.get('entries', [])
+            roles = [r['id'] for r in self.roles()]
+            settings = []
+            for entry in entries:
+                settings.append(
+                    dict(id = entry['id'],
+                         type = entry['type'],
+                         roles = [r for r in roles if entry.get('role_%s' % r, False)]))
+            if settings:
+                self.update_role_settings(settings)
+            
+        # Other buttons return to the sharing page
+        if cancel_button:
+            postback = False
+        
+        if postback:
+            return self.template()
+        else:
+            context_state = self.context.restrictedTraverse("@@plone_context_state")
+            url = context_state.view_url()
+            self.request.response.redirect(url)
+            
+    # View
+    
+    @memoize
+    def roles(self):
+        """Get a list of roles that can be managed.
+        
+        Returns a list of dics with keys:
+        
+            - id
+            - title
+        """
+        context = aq_inner(self.context)
+        portal_membership = getToolByName(context, 'portal_membership')
+        
+        pairs = []
+
+        #check to see if OpenOCW installed
+        portal_setup = self.aq_parent.portal_setup
+        if 'openOCW-final' in portal_setup.getImportStepRegistry().listSteps():
+            #user default sharing page roles
+            for name, utility in getUtilitiesFor(ISharingPageRole):
+                permission = utility.required_permission
+                if permission is None or portal_membership.checkPermission(permission, context):
+                    pairs.append(dict(id = name, title = utility.title))
+        else:
+            #use eduCommons sharing page roles
+            for name, utility in getUtilitiesFor(IeduCommonsSharingPageRole):
+                permission = utility.required_permission
+                if permission is None or portal_membership.checkPermission(permission, context):
+                    pairs.append(dict(id = name, title = utility.title))
+
+        pairs.sort(lambda x, y: cmp(x['id'], y['id']))
+        return pairs
+        
+    @memoize
+    def role_settings(self):
+        """Get current settings for users and groups for which settings have been made.
+        
+        Returns a list of dicts with keys:
+        
+         - id
+         - title
+         - type (one of 'group' or 'user')
+         - roles
+         
+        'roles' is a dict of settings, with keys of role ids as returned by 
+        roles(), and values True if the role is explicitly set, False
+        if the role is explicitly disabled and None if the role is inherited.
+        """
+        
+        existing_settings = self.existing_role_settings()
+        user_results = self.user_search_results()
+        group_results = self.group_search_results()
+
+        return existing_settings + user_results + group_results
+        
+    def inherited(self, context=None):
+        """Return True if local roles are inherited here.
+        """
+        if context is None:
+            context = self.context
+        if getattr(aq_base(context), '__ac_local_roles_block__', None):
+            return False
+        return True
+        
+    # helper functions
+    
+    @memoize
+    def existing_role_settings(self):
+        """Get current settings for users and groups that have already got
+        at least one of the managed local roles.
+
+        Returns a list of dicts as per role_settings()
+        """
+        context = aq_inner(self.context)
+        
+        portal_membership = getToolByName(aq_inner(self.context), 'portal_membership')
+        portal_groups = getToolByName(aq_inner(self.context), 'portal_groups')
+        portal = getToolByName(aq_inner(self.context), 'portal_url').getPortalObject()
+        acl_users = getattr(portal, 'acl_users')
+        
+        info = []
+        
+        # This logic is adapted from computeRoleMap.py
+        
+        local_roles = acl_users.getLocalRolesForDisplay(context)
+        acquired_roles = self._inherited_roles()
+        available_roles = [r['id'] for r in self.roles()]
+
+        # first process acquired roles
+        items = {}
+        for name, roles, rtype, rid in acquired_roles:
+            items[rid] = dict(id       = rid,
+                              name     = name,
+                              type     = rtype,
+                              sitewide = [],
+                              acquired = roles,
+                              local    = [],)
+                                
+        # second process local roles
+        for name, roles, rtype, rid in local_roles:
+            if items.has_key(rid):
+                items[rid]['local'] = roles
+            else:
+                items[rid] = dict(id       = rid,
+                                  name     = name,
+                                  type     = rtype,
+                                  sitewide = [],
+                                  acquired = [],
+                                  local    = roles,)
+
+        # Make sure we always get the authenticated users virtual group
+        if AUTH_GROUP not in items:
+            items[AUTH_GROUP] = dict(id = AUTH_GROUP,
+                                     name = _(u'Logged-in users'),
+                                     type  = 'group',
+                                     sitewide = [],
+                                     acquired = [],
+                                     local = [],)
+
+        # Sort the list: first the authenticated users virtual group, then 
+        # all other groups and then all users, alphabetically
+
+        dec_users = [( a['id'] not in STICKY,
+                       a['type'], 
+                       a['name'],
+                       a) for a in items.values()]
+        dec_users.sort()
+        
+        # Add the items to the info dict, assigning full name if possible.
+        # Also, recut roles in the format specified in the docstring
+        
+        for d in dec_users:
+            item = d[-1]
+            name = item['name']
+            rid = item['id']
+            global_roles = set()
+            
+            if item['type'] == 'user':
+                member = acl_users.getUserById(rid)
+                if member is not None:
+                    name = member.getProperty('fullname') or member.getId() or name
+                    global_roles = set(member.getRoles())
+            elif item['type'] == 'group':
+                g = portal_groups.getGroupById(rid)
+                name = g.getGroupTitleOrName()
+                global_roles = set(g.getRoles())
+                
+                # This isn't a proper group, so it needs special treatment :(
+                if rid == AUTH_GROUP:
+                    name = _(u'Logged-in users')
+            
+            info_item = dict(id    = item['id'],
+                             type  = item['type'],
+                             title = name,
+                             roles = {})
+                             
+            # Record role settings
+            have_roles = False
+            for r in available_roles:
+                if r in global_roles:
+                    info_item['roles'][r] = 'global'
+                elif r in item['acquired']:
+                    info_item['roles'][r] = 'acquired'
+                    have_roles = True # we want to show acquired roles
+                elif r in item['local']:
+                    info_item['roles'][r] = True
+                    have_roles = True # at least one role is set
+                else:
+                    info_item['roles'][r] = False
+                    
+            if have_roles or rid in STICKY:
+                info.append(info_item)
+            
+        return info
+        
+    def user_search_results(self):
+        """Return search results for a query to add new users
+        
+        Returns a list of dicts, as per role_settings()
+        """
+        context = aq_inner(self.context)
+        acl_users = getToolByName(context, 'acl_users')
+        
+        search_term = self.request.form.get('search_term', None)
+        if not search_term:
+            return []
+            
+        existing_users = set([u['id'] for u in self.existing_role_settings() 
+                                if u['type'] == 'user'])
+        empty_roles = dict([(r['id'], False) for r in self.roles()])
+        info = []
+        
+        hunter = getMultiAdapter((context, self.request), name='pas_search')
+        for userinfo in hunter.searchUsers(fullname=search_term):
+            userid = userinfo['userid']
+            if userid not in existing_users:
+                user = acl_users.getUserById(userid)
+                roles = empty_roles.copy()
+                for r in user.getRoles():
+                    if r in roles:
+                        roles[r] = 'global'
+                info.append(dict(id    = userid,
+                                 title = user.getProperty('fullname') or user.getId() or userid,
+                                 type  = 'user',
+                                 roles = roles))
+        return info
+        
+    def group_search_results(self):
+        """Return search results for a query to add new groups
+        
+        Returns a list of dicts, as per role_settings()
+        """
+        context = aq_inner(self.context)
+        portal_groups = getToolByName(context, 'portal_groups')
+        
+        search_term = self.request.form.get('search_term', None)
+        if not search_term:
+            return []
+            
+        existing_groups = set([g['id'] for g in self.existing_role_settings() 
+                                if g['type'] == 'group'])
+        empty_roles = dict([(r['id'], False) for r in self.roles()])
+        info = []
+        
+        hunter = getMultiAdapter((context, self.request), name='pas_search')
+        for groupinfo in hunter.searchGroups(id=search_term):
+            groupid = groupinfo['groupid']
+            if groupid not in existing_groups:
+                group = portal_groups.getGroupById(groupid)
+                roles = empty_roles.copy()
+                for r in group.getRoles():
+                    if r in roles:
+                        roles[r] = 'global'                
+                info.append(dict(id    = groupid,
+                                 title = group.getGroupTitleOrName(),
+                                 type  = 'group',
+                                 roles = roles))
+        return info
+        
+    def _inherited_roles(self):
+        """Returns a tuple with the acquired local roles."""
+        context = aq_inner(self.context)
+        
+        if not self.inherited(context):
+            return []
+        
+        portal = getToolByName(context, 'portal_url').getPortalObject()
+        result = []
+        cont = True
+        if portal != context:
+            parent = aq_parent(context)
+            while cont:
+                if not getattr(parent, 'acl_users', False):
+                    break
+                userroles = parent.acl_users._getLocalRolesForDisplay(parent)
+                for user, roles, role_type, name in userroles:
+                    # Find user in result
+                    found = 0
+                    for user2, roles2, type2, name2 in result:
+                        if user2 == user:
+                            # Check which roles must be added to roles2
+                            for role in roles:
+                                if not role in roles2:
+                                    roles2.append(role)
+                            found = 1
+                            break
+                    if found == 0:
+                        # Add it to result and make sure roles is a list so
+                        # we may append and not overwrite the loop variable
+                        result.append([user, list(roles), role_type, name])
+                if parent == portal:
+                    cont = False
+                elif not self.inherited(parent):
+                    # Role acquired check here
+                    cont = False
+                else:
+                    parent = aq_parent(parent)
+
+        # Tuplize all inner roles
+        for pos in range(len(result)-1,-1,-1):
+            result[pos][1] = tuple(result[pos][1])
+            result[pos] = tuple(result[pos])
+
+        return tuple(result)
+        
+    def update_inherit(self, status=True):
+        """Enable or disable local role acquisition on the context.
+        """
+        context = aq_inner(self.context)
+        portal_membership = getToolByName(context, 'portal_membership')
+        
+        if not portal_membership.checkPermission(permissions.ModifyPortalContent, context):
+            raise Unauthorized
+
+        if not status:
+            context.__ac_local_roles_block__ = True
+        else:
+            if getattr(aq_base(context), '__ac_local_roles_block__', None):
+                context.__ac_local_roles_block__ = None
+
+        context.reindexObjectSecurity()
+        
+    @clearafter
+    def update_role_settings(self, new_settings):
+        """Update local role settings and reindex object security if necessary.
+        
+        new_settings is a list of dicts with keys id, for the user/group id;
+        type, being either 'user' or 'group'; and roles, containing the list
+        of role ids that are set.
+        """
+        
+        reindex = False
+        context = aq_inner(self.context)
+            
+        managed_roles = frozenset([r['id'] for r in self.roles()])
+        member_ids_to_clear = []
+        for s in new_settings:
+            user_id = s['id']
+            
+            existing_roles = frozenset(context.get_local_roles_for_userid(userid=user_id))
+            selected_roles = frozenset(s['roles'])
+            
+            # We will remove those roles that we are managing and which set
+            # on the context, but which were not selected
+            to_remove = (managed_roles & existing_roles) - selected_roles
+            
+            # Leaving us with the selected roles, less any roles that we
+            # want to remove
+            new_roles = (selected_roles | existing_roles) - to_remove
+            
+            # take away roles that we are managing, that were not selected 
+            # and which were part of the existing roles
+            
+            if new_roles:
+                context.manage_setLocalRoles(user_id, list(new_roles))
+                reindex = True
+            elif existing_roles:
+                member_ids_to_clear.append(user_id)
+                
+        if member_ids_to_clear:
+            context.manage_delLocalRoles(userids=member_ids_to_clear)
+            reindex = True
+        
+        if reindex:
+            self.context.reindexObjectSecurity()
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless.py	(revision 126)
@@ -0,0 +1,12 @@
+
+
+if context.Type() == 'Page':
+    title = context.Title()
+    content = context.CookedBody(stx_level=2)
+elif context.Type() == 'Division':
+    title = context.Title()
+    content = context.text()
+else:
+    title = context.portal_ECObjectTool.getFullCourseTitle(context)
+    content = context.text()
+return title, content
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless_byline_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless_byline_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless_byline_view.pt	(revision 126)
@@ -0,0 +1,50 @@
+<div class="documentByLine"
+     style="text-align: right; margin-top: 2em; border-top: 1px solid #999;"
+     tal:define="bylineInfo view/getLicenseByline;
+                 copyright python:bylineInfo[0];
+                 alert_msg python:here.translate('alert_cite_resource',default='Cite Resource:');
+                 citation_info view/getCitationInfo;
+                 holder python:bylineInfo[1];
+                 license_name python:bylineInfo[2];
+                 license_url python:bylineInfo[3];
+                 license_button python:bylineInfo[4];"
+     i18n:domain="ContentLicensing">
+
+  <div>Citation: <span tal:content="citation_info">Citation Info</span></div>
+  <div tal:condition="copyright" tal:replace="string:${copyright}, " />
+  <div tal:condition="holder" tal:replace="string:${holder}. " />
+  <div tal:condition="license_name" tal:omit-tag="">
+    
+    <div tal:condition="python:license_name != 'All Rights Reserved'" tal:omit-tag="" i18n:translate="license_text">
+      This work is licensed under a 
+    </div>
+
+    <a tal:condition="license_url"
+       tal:attributes="href license_url;
+                       title license_name;
+                       alt license_name"
+       tal:content="string:${license_name}.">Creative Commons License.</a>
+
+    <div tal:condition="python:not license_url and license_name"
+         tal:replace="string:${license_name}.">
+      All Rights Reserved.
+    </div>
+
+
+    <a tal:condition="python:license_url and license_button"
+       tal:attributes="href license_url;
+                       title license_name;
+                       alt license_name">
+    <img tal:condition="license_button"
+         style="vertical-align: text-top; margin-top: 3px; padding-left: 5px"
+         tal:attributes="src license_button;
+                         alt license_name;" /></a>
+    <img tal:condition="python:license_button and not license_url"
+         style="vertical-align: text-top; margin-top: 3px; padding-left: 5px"
+         tal:attributes="src license_button;
+                         alt license_name;" />
+
+  </div>
+
+
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/skinless_view.pt	(revision 126)
@@ -0,0 +1,73 @@
+<metal:page define-macro="master"><metal:doctype define-slot="doctype"><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"></metal:doctype>
+
+<metal:block use-macro="here/global_defines/macros/defines" />
+
+<html xmlns="http://www.w3.org/1999/xhtml"
+      xml:lang="en"
+      lang="en"
+      tal:attributes="lang language;
+                      xml:lang language">
+
+<head metal:define-macro="html_header">
+    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"
+          tal:define="charset site_properties/default_charset|string:utf-8"
+          tal:attributes="content string:text/html;;charset=${charset}" />
+
+    <title tal:define="portal_title portal_properties/title;
+                       page_title object_title">
+        <tal:pagetitle replace="page_title">
+            Inserts page title
+        </tal:pagetitle>
+    </title>
+
+
+
+    <metal:block metal:define-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:block>
+
+
+
+  </head>
+  <body>
+
+
+
+                    <div
+                       tal:define="text_title view/getSkinlessView;
+                                   text python:text_title[1];
+				   object_title python:text_title[0]">
+
+                      <!-- Page Content Begins Here -->
+              
+                        <h1 tal:content="object_title"> 
+                          Title or id
+                        </h1>
+                    
+                        <p tal:content="here/Description"
+                           tal:condition="here/Description">
+                            Description
+                        </p>
+                    
+                        <div class="stx"
+                             tal:condition="text">
+                            <div tal:replace="structure text" />
+                        </div>
+
+                        <div tal:replace="structure context/@@skinless_byline_view" />
+                
+                        <div tal:replace="structure context/@@citation_view" />
+                
+
+                        <!-- Page Content Ends Here -->
+                    </div>
+
+
+</body>
+</html>
+</metal:page>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_course_listing.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_course_listing.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_course_listing.pt	(revision 126)
@@ -0,0 +1,60 @@
+<metal:listingmacro define-macro="listing">
+        <tal:foldercontents define="
+                            limit_display limit_display|request/limit_display|nothing;
+                            more_url more_url|request/more_url|string:folder_contents;
+                            folderContents view/getSortedCourses;
+                            use_view_action site_properties/typesUseViewActionInListings|python:();
+                            over_limit python: limit_display and len(folderContents) > limit_display;
+                            folderContents python: (over_limit and folderContents[:limit_display]) or folderContents;">
+
+        <tal:listing condition="folderContents">
+
+
+            <div class="division-listing">
+	      <p class="division-title" i18n:domain="eduCommons" i18n:translate="">Courses</p>
+
+
+                <tal:entry tal:repeat="item folderContents">
+
+                <tal:block tal:define="item_url item/getURL|item/absolute_url;
+                                       item_id item/getId|item/id;
+				       item_term item/getTerm;
+				       item_course_id item/getCourseId;
+                                       item_title_or_id item/pretty_title_or_id;
+                                       item_description item/Description;
+                                       item_type item/portal_type;
+                                       item_type_title item/Type;
+                                   ">
+
+			<p tal:define="oddrow repeat/item/odd;"
+			   tal:attributes="class python:oddrow and 'course-listing even' or 'course-listing odd'" >
+
+
+                            <a href="#"
+                               tal:attributes="href item_url;
+                                               class string:url">
+			        <span tal:condition="item_course_id" tal:replace="string:${item_course_id} - " /><span tal:replace="item_title_or_id" /><span tal:condition="item_term" tal:replace="string:, ${item_term}" />
+
+				</a>
+                        </p>
+
+
+
+
+                </tal:block>
+                </tal:entry>
+
+          </div>
+        </tal:listing>
+
+
+        <metal:empty metal:define-slot="no_items_in_listing">
+            <p class="discreet"
+               tal:condition="not: folderContents"
+               i18n:translate="description_no_items_in_folder">
+                There are currently no items in this folder.
+            </p>
+        </metal:empty>
+
+        </tal:foldercontents>
+</metal:listingmacro>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_cross_course_listing.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_cross_course_listing.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_cross_course_listing.pt	(revision 126)
@@ -0,0 +1,54 @@
+<metal:listingmacro define-macro="listing">
+        <tal:foldercontents define="
+                            limit_display limit_display|request/limit_display|nothing;
+                            more_url more_url|request/more_url|string:folder_contents;
+                            folderContents view/getSortedCrossCourses;
+                            use_view_action site_properties/typesUseViewActionInListings|python:();
+                            over_limit python: limit_display and len(folderContents) > limit_display;
+                            folderContents python: (over_limit and folderContents[:limit_display]) or folderContents;">
+
+        <tal:listing condition="folderContents">
+
+
+            <div class="division-listing">
+	      <p class="division-title">Cross Listed Courses</p>
+
+
+                <tal:entry tal:repeat="item folderContents">
+
+                <tal:block tal:define="item_url item/getURL|item/absolute_url;
+                                       item_id item/getId|item/id;
+				       item_term item/getTerm;
+				       item_course_id item/getCourseId;
+                                       item_title_or_id item/pretty_title_or_id;
+                                       item_description item/Description;
+                                       item_type item/portal_type;
+                                       item_type_title item/Type;
+                                   ">
+
+			<p tal:define="oddrow repeat/item/odd;"
+			   tal:attributes="class python:oddrow and 'course-listing even' or 'course-listing odd'" >
+
+
+                            <a href="#"
+                               tal:attributes="href item_url;
+                                               class string:url">
+			        <span tal:condition="item_course_id" tal:replace="string:${item_course_id} -" />
+				<span tal:replace="item_title_or_id" />
+			        <span tal:condition="item_term" tal:replace="string:, ${item_term}" />
+
+				</a>
+                        </p>
+
+
+
+
+                </tal:block>
+                </tal:entry>
+
+          </div>
+        </tal:listing>
+
+
+        </tal:foldercontents>
+</metal:listingmacro>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_resource_listing.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_resource_listing.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/sorted_resource_listing.pt	(revision 126)
@@ -0,0 +1,54 @@
+<metal:listingmacro define-macro="listing">
+        <tal:foldercontents define="
+                            limit_display limit_display|request/limit_display|nothing;
+                            more_url more_url|request/more_url|string:folder_contents;
+                            folderContents view/getSortedResources;
+                            use_view_action site_properties/typesUseViewActionInListings|python:();
+                            over_limit python: limit_display and len(folderContents) > limit_display;
+                            folderContents python: (over_limit and folderContents[:limit_display]) or folderContents;">
+
+        <tal:listing condition="folderContents">
+
+
+            <div class="division-listing">
+	      <p class="division-title">Other Resources</p>
+
+
+                <tal:entry tal:repeat="item folderContents">
+
+                <tal:block tal:define="item_url item/getURL|item/absolute_url;
+                                       item_id item/getId|item/id;
+				       item_term item/getTerm;
+				       item_course_id item/getCourseId;
+                                       item_title_or_id item/pretty_title_or_id;
+                                       item_description item/Description;
+                                       item_type item/portal_type;
+                                       item_type_title item/Type;
+                                   ">
+
+			<p tal:define="oddrow repeat/item/odd;"
+			   tal:attributes="class python:oddrow and 'course-listing even' or 'course-listing odd'" >
+
+
+                            <a href="#"
+                               tal:attributes="href item_url;
+                                               class string:url">
+			        <span tal:condition="item_course_id" tal:replace="string:${item_course_id} -" />
+				<span tal:replace="item_title_or_id" />
+			        <span tal:condition="item_term" tal:replace="string:, ${item_term}" />
+
+				</a>
+                        </p>
+
+
+
+
+                </tal:block>
+                </tal:entry>
+
+          </div>
+        </tal:listing>
+
+
+        </tal:foldercontents>
+</metal:listingmacro>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summary_batching.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summary_batching.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summary_batching.pt	(revision 126)
@@ -0,0 +1,102 @@
+<!-- Navigation -->
+<div class="listingBar"
+     metal:define-macro="navigation"
+     tal:define="batch view/batch"
+     tal:condition="batch/multiple_pages">
+    <span class="previous"
+      tal:condition="batch/has_previous">
+        <a href=""
+           tal:attributes="href string:${view/url}?pagenumber=${batch/previouspage}&state=${request/state}&sort_on=${request/sort_on|string:getObjPositionInCourse}">
+           &laquo;
+           <span i18n:translate="batch_previous_x_items" tal:omit-tag="">
+               Previous
+               <span i18n:name="number" tal:omit-tag="" tal:content="batch/pagesize">n</span>
+               items
+           </span>
+        </a>
+    </span>
+
+    <span class="next"
+          tal:condition="batch/has_next">
+        <a href=""
+           tal:attributes="href string:${view/url}?pagenumber=${batch/nextpage}&state=${request/state}&sort_on=${request/sort_on|string:getObjPositionInCourse}">
+           <span i18n:translate="batch_next_x_items" tal:omit-tag="">
+               Next
+               <span i18n:name="number" tal:omit-tag="" tal:content="batch/next_item_count">n</span>
+               items
+           </span>
+           &raquo;
+        </a>
+    </span>
+
+    <!-- Link to first -->
+    <span tal:condition="batch/show_link_to_first">
+        <a href=""
+           tal:attributes="href string:${view/url}?pagenumber=1&state=${request/state}&sort_on=${request/sort_on|string:getObjPositionInCourse}">1</a>
+        <span tal:condition="batch/second_page_not_in_navlist"
+              tal:omit-tag="">
+           ...
+        </span>
+    </span>
+
+    <!-- Pagelist with quantum leap links to previous pages for quick navigation -->
+    <!--
+    <span tal:repeat="linklist python:batch.navurls(request.form, batch.leapback)"
+          tal:condition="batch/leapback"
+          tal:omit-tag="" >
+        <a href=""
+           tal:define="page python:linklist[0];
+                       query python:linklist[1];"
+           tal:content="page"
+           tal:attributes="href python: '%s?%s' % (url,query)" >
+        </a>
+        ...
+    </span>
+    -->
+
+    <!-- Pagelist with links to previous pages for quick navigation -->
+    <span tal:repeat="pagenumber batch/previous_pages"
+          tal:omit-tag="" >
+      <a href="" tal:content="pagenumber" 
+         tal:attributes="href string:${view/url}?pagenumber=$pagenumber&state=${request/state}&sort_on=${request/sort_on|string:getObjPositionInCourse}"/>
+    </span>
+
+    <!-- Current page -->
+    <span tal:condition="batch/navlist"
+          tal:omit-tag="">
+        [<span tal:content="batch/pagenumber">Current page number</span>]
+    </span>
+
+    <!-- Pagelist with links to next pages for quick navigation -->
+    <span tal:repeat="pagenumber batch/next_pages"
+          tal:omit-tag="" >
+      <a href="" tal:content="pagenumber" 
+         tal:attributes="href string:${view/url}?pagenumber=$pagenumber&state=${request/state}&sort_on=${request/sort_on|string:getObjPositionInCourse}"/>
+    </span>
+
+    <!-- Pagelist with quantum leap links to next pages for quick navigation -->
+    <!--
+    <span tal:repeat="linklist python:batch.navurls(request.form, batch.leapforward)"
+          tal:condition="batch/leapforward"
+          tal:omit-tag="" >
+        ...
+        <a href=""
+           tal:define="page python:linklist[0];
+                       query python:linklist[1];"
+           tal:content="page"
+           tal:attributes="href python: '%s?%s' % (url,query)" >
+        </a>
+    </span>
+    -->
+
+    <!-- Link to last -->
+    <span tal:condition="batch/show_link_to_last">
+        <span tal:condition="batch/before_last_page_not_in_navlist"
+              tal:omit-tag="">
+           ...
+        </span>
+        <a href=""
+           tal:attributes="href string:${view/url}?pagenumber=${batch/lastpage}&state=${request/state}&sort_on=${request/sort_on|string:getObjPositionInCourse}"
+           tal:content="batch/lastpage">3457</a>
+    </span>
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summary_table.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summary_table.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summary_table.pt	(revision 126)
@@ -0,0 +1,149 @@
+<div id="folderlisting-main-table"
+     i18n:domain="plone">
+  <input type="hidden" name="sort_on"
+         tal:attributes="value request/sort_on|string:getObjPositionInCourse"
+         />
+  <input type="hidden" name="state"
+  	 tal:attributes="value request/state|string:InProgress"
+	 />
+  <input type="hidden" name="pagenumber" tal:attributes="value view/batch/pagenumber"/>
+  <input type="hidden" name="orig_template" tal:attributes="value view/viewname"/>
+  <tal:block condition="view/selectall">
+    <input type="hidden" name="paths:list"
+           tal:repeat="item view/batch/items_not_on_page"
+           tal:attributes="value item/path"/>
+  </tal:block>
+
+  <!-- <div metal:use-macro="context/document_actions/macros/document_actions">
+      Document actions (print, sendto etc)
+  </div> -->
+  <p class="discreet"
+     tal:condition="not: view/batch"
+     i18n:translate="description_no_visible_items_add_paste">
+     This folder has no visible items. To add content, press the
+     add button, or paste content from another location.
+  </p>
+
+  <metal:listing define-macro="folder_listing"
+                 tal:define="nosortclass view/get_nosort_class">
+                             
+  <div class="visualClear" id="clear-space-before-navigation"><!-- --></div>
+
+    <div tal:replace="structure view/batching"/>
+    <table class="listing"
+           id="listing-table"
+           summary="Content listing"
+           i18n:attributes="summary summary_content_listing;"
+           tal:condition="view/items">
+      <thead>
+          <tr tal:condition="view/selectall">
+            <th colspan="6" class="nosort">
+              All <tal:block replace="view/batch/size"/> items in this folder
+              are selected. 
+              <a tal:attributes="href view/selectnone_url" 
+                 id="foldercontents-clearselection">Clear selection</a>
+            </th>
+          </tr>
+
+          <tr>
+            <th class="nosort">&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-title-column">&nbsp;<tal:title i18n:translate="listingheader_title"
+                >Title</tal:title>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-size-column">&nbsp;<tal:size i18n:translate="listingheader_size"
+                >Size</tal:size>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-modified-column">&nbsp;<tal:modified i18n:translate="listingheader_modified"
+                >Modified</tal:modified>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-status-column">&nbsp;<tal:state i18n:translate="listingheader_status"
+                >State</tal:state>&nbsp;</th>
+            <th class="nosort" 
+                id="foldercontents-order-column"
+                tal:condition="view/show_sort_column">
+              &nbsp;<tal:order i18n:translate="listingheader_order">Flags</tal:order>&nbsp;</th>
+          </tr>
+      </thead>
+
+      <metal:block tal:condition="view/batch">
+      <tbody>
+          <tal:items tal:repeat="item view/batch">
+              <tr tal:attributes="class item/table_row_class;
+                                  id string:folder-contents-item-${item/id};" >
+
+                 <tal:comment replace="nothing">
+                      * We have to check if the browserDefault stuff is really necessary
+                      * Create title_or_id metadata in the catalog (why not just use item.Title or item.getId? (alecm))
+                 </tal:comment>
+
+                 <td class="notDraggable">
+                     <input type="checkbox"
+                            class="noborder"
+                            name="paths:list" id="#"
+                            value="#"
+                            tal:attributes="value   item/path;
+                                            id      string:cb_${item/id};
+                                            checked item/checked;
+                                            alt     string:Select ${item/title_or_id};
+                                            title   string:Select ${item/title_or_id}" />
+                <input type="hidden" name="selected_obj_paths:list" value="#"
+                       tal:attributes="value item/relative_url" />
+                <label tal:content="item/title_or_id"
+                       tal:attributes="for string:cb_${item/id}" 
+                       class="hiddenStructure">
+                  Item Title
+                </label>
+              </td>
+              <td>
+                  <span tal:attributes="class item/type_class">
+                      <img tal:replace="structure item/icon" />
+                      <a href="#" tal:attributes="href  item/view_url;
+                                                title string: ${item/obj_type}: ${item/description};
+                                                class item/state_class;">
+                        <strong tal:omit-tag="not: item/is_browser_default"
+                            tal:content="item/title_or_id"/>
+                      </a>
+                  </span>
+
+                  <span class="state-expired"
+                        tal:condition="item/is_expired"
+                        i18n:translate="time_expired">expired</span>
+              </td>
+
+              <td>
+                <span tal:condition="not: item/size"> &nbsp; </span>
+                <span tal:condition="item/size"
+                      tal:content="item/size"
+                      tal:attributes="class item/state_class"> size </span>
+              </td>
+              <td tal:content="item/modified"
+                  tal:attributes="class item/state_class">
+                  08/19/2001 03:01 AM
+              </td>
+              <td>
+                  <span i18n:translate=""
+                        tal:condition="item/state_title"
+                        tal:content="item/state_title"
+                        tal:attributes="class item/state_class" />
+                  <span tal:condition="not: item/state_title">&nbsp;</span>
+              </td>
+              <td tal:define="copyright_status item/cc_status" width="15px" align="center">
+		<span tal:condition="copyright_status">&copy;</span>
+              </td>
+             </tr>
+          </tal:items>
+      </tbody>
+    </metal:block>
+  </table>
+  <div tal:replace="structure view/batching"/>
+  <tal:buttons tal:repeat="button view/buttons">
+    <input class="context"
+           type="submit"
+           name=""
+           value=""
+           i18n:attributes="value"
+           tal:attributes="value button/title; name button/url; class button/cssclass" />
+  </tal:buttons>
+  </metal:listing>
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summarycontents.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summarycontents.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/summarycontents.py	(revision 126)
@@ -0,0 +1,164 @@
+from zope.component import getMultiAdapter
+from Products.CMFCore.utils import getToolByName
+from plone.app.content.browser.foldercontents import FolderContentsView, FolderContentsTable
+import urllib
+from zope.component import getUtility
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from plone.app.content.browser.tableview import Table
+from kss.core import KSSView
+from zope.app.pagetemplate import ViewPageTemplateFile
+from Acquisition import aq_parent, aq_inner
+from zope.annotation import IAnnotations
+
+
+
+class SummaryContentsView(FolderContentsView):
+    """
+    Override contents table to use FindECParent and use SummaryContentsTable
+    """
+
+    def contents_table(self):
+	ecutil = getUtility(IECUtility)
+	parent = ecutil.FindECParent(self.context)
+        path = '/'.join(parent.getPhysicalPath())
+        request = self.request
+        if request.has_key('state'):
+            review_state = request['state']
+	else:
+	    review_state = ''
+        table = SummaryContentsTable(parent, self.request, contentFilter={'path':path,'review_state':review_state})
+        return table.render()
+
+
+class SummaryContentsTable(FolderContentsTable):
+    """   
+    The foldercontents table renders the table and its actions.
+    """                
+
+
+    def __init__(self, context, request, contentFilter={}):
+        """
+        Initialize the table
+        """
+        super(SummaryContentsTable, self).__init__(context, request, contentFilter)
+
+        url = self.context.absolute_url()
+        view_url = url + '/summary_contents'
+        self.table = SummaryTable(request, url, view_url, self.items,
+                           show_sort_column=self.show_sort_column,
+                           buttons=self.buttons)
+
+    @property
+    def items(self):
+        """
+        """
+        plone_utils = getToolByName(self.context, 'plone_utils')
+        plone_view = getMultiAdapter((self.context, self.request), name=u'plone')
+        portal_workflow = getToolByName(self.context, 'portal_workflow')
+        portal_properties = getToolByName(self.context, 'portal_properties')
+        site_properties = portal_properties.site_properties
+        
+        use_view_action = site_properties.getProperty('typesUseViewActionInListings', ())
+        browser_default = self.context.browserDefault()
+       
+
+        contentsMethod = self.context.queryCatalog
+       
+        results = list()
+        for i, obj in enumerate(contentsMethod(self.contentFilter)):
+            if i % 2 == 0:
+                table_row_class = "draggable even"
+            else:
+                table_row_class = "draggable odd"
+
+            url = obj.getURL()
+            path = obj.getPath or "/".join(obj.getPhysicalPath())
+            icon = plone_view.getIcon(obj);
+            
+            type_class = 'contenttype-' + plone_utils.normalizeString(
+                obj.portal_type)
+
+            review_state = obj.review_state
+            state_class = 'state-' + plone_utils.normalizeString(review_state)
+            relative_url = obj.getURL(relative=True)
+            obj_type = obj.portal_type
+
+            modified = plone_view.toLocalizedTime(
+                obj.ModificationDate, long_format=1)
+            
+            if obj_type in use_view_action:
+                view_url = url + '/view'
+            elif obj.is_folderish:
+                view_url = url + "/folder_contents"              
+            else:
+                view_url = url
+
+            is_browser_default = len(browser_default[1]) == 1 and (
+                obj.id == browser_default[1][0])
+
+            if IAnnotations(obj.getObject()).has_key('eduCommons.clearcopyright'):
+                cc_status = IAnnotations(obj.getObject())['eduCommons.clearcopyright']
+            else:
+                cc_status = False
+                              
+            results.append(dict(
+                url = url,
+                id  = obj.getId,
+                quoted_id = urllib.quote_plus(obj.getId),
+                path = path,
+                title_or_id = obj.pretty_title_or_id(),
+                description = obj.Description,
+                obj_type = obj_type,
+                size = obj.getObjSize,
+                modified = modified,
+                icon = icon.html_tag(),
+                type_class = type_class,
+                wf_state = review_state,
+                state_title = portal_workflow.getTitleForStateOnType(review_state,
+                                                           obj_type),
+                state_class = state_class,
+                is_browser_default = is_browser_default,
+                folderish = obj.is_folderish,
+                relative_url = relative_url,
+                view_url = view_url,
+                table_row_class = table_row_class,
+                is_expired = self.context.isExpired(obj),
+                cc_status = cc_status,
+            ))
+        return results
+
+    @property
+    def buttons(self):
+        buttons = []
+        portal_actions = getToolByName(self.context, 'portal_actions')
+        button_actions = portal_actions.listActionInfos(object=aq_inner(self.context), categories=('folder_buttons', ))
+
+        # Do not show buttons if there is no data, unless there is data to be
+        # pasted
+        if not len(self.items):
+            return []
+
+        for button in button_actions:
+            # Make proper classes for our buttons
+            if button['id'] not in ['paste','cut','copy','import']:
+                buttons.append(self.setbuttonclass(button))
+        return buttons
+
+class SummaryTable(Table):
+    """
+    The table renders a table that is 
+
+    the summary portlet.
+
+    """    
+
+    render = ViewPageTemplateFile("summary_table.pt")
+    batching = ViewPageTemplateFile("summary_batching.pt")
+
+class SummaryContentsKSSView(KSSView):
+    def update_table(self, pagenumber='1', sort_on='getObjPositionInCourse'):
+        self.request.set('sort_on', sort_on)
+        self.request.set('pagenumber', pagenumber)
+        table = SummaryContentsTable(self.context, self.request,
+                                    contentFilter={'sort_on':sort_on})
+        return self.replace_table(table)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/table.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/table.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/table.pt	(revision 126)
@@ -0,0 +1,147 @@
+<div id="folderlisting-main-table"
+     i18n:domain="plone">
+  <input type="hidden" name="sort_on"
+         tal:attributes="value request/sort_on|string:getObjPositionInCourse"
+         />
+  <input type="hidden" name="pagenumber" tal:attributes="value view/batch/pagenumber"/>
+  <input type="hidden" name="orig_template" tal:attributes="value view/viewname"/>
+  <tal:block condition="view/selectall">
+    <input type="hidden" name="paths:list"
+           tal:repeat="item view/batch/items_not_on_page"
+           tal:attributes="value item/path"/>
+  </tal:block>
+
+  <!-- <div metal:use-macro="context/document_actions/macros/document_actions">
+      Document actions (print, sendto etc)
+  </div> -->
+  <p class="discreet"
+     tal:condition="not: view/batch"
+     i18n:translate="description_no_visible_items_add_paste">
+     This folder has no visible items. To add content, press the
+     add button, or paste content from another location.
+  </p>
+
+  <metal:listing define-macro="folder_listing"
+                 tal:define="nosortclass view/get_nosort_class">
+                             
+  <div class="visualClear" id="clear-space-before-navigation"><!-- --></div>
+
+    <table class="listing"
+           id="listing-table"
+           summary="Content listing"
+           i18n:attributes="summary summary_content_listing;"
+           tal:condition="view/items">
+      <thead>
+          <tr>
+            <th class="nosort">&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-title-column">&nbsp;<tal:title i18n:translate="listingheader_title"
+                >Title</tal:title>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-size-column">&nbsp;<tal:size i18n:translate="listingheader_size"
+                >Size</tal:size>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-modified-column">&nbsp;<tal:modified i18n:translate="listingheader_modified"
+                >Modified</tal:modified>&nbsp;</th>
+            <th tal:attributes="class nosortclass"
+                id="foldercontents-status-column">&nbsp;<tal:state i18n:translate="listingheader_status"
+                >State</tal:state>&nbsp;</th>
+            <th class="nosort" 
+                id="foldercontents-order-column"
+                tal:condition="view/show_sort_column">
+              &nbsp;<tal:order i18n:translate="listingheader_order">Order</tal:order>&nbsp;</th>
+          </tr>
+      </thead>
+
+      <metal:block tal:condition="view/batch">
+      <tbody>
+          <tal:items tal:repeat="item view/batch">
+              <tr tal:attributes="class item/table_row_class;
+                                  id string:folder-contents-item-${item/id};" >
+
+                 <tal:comment replace="nothing">
+                      * We have to check if the browserDefault stuff is really necessary
+                      * Create title_or_id metadata in the catalog (why not just use item.Title or item.getId? (alecm))
+                 </tal:comment>
+
+                 <td class="notDraggable">
+                     <input type="checkbox"
+                            class="noborder"
+                            name="paths:list" id="#"
+                            value="#"
+                            tal:attributes="value   item/path;
+                                            id      string:cb_${item/id};
+                                            checked item/checked;
+                                            alt     string:Select ${item/title_or_id};
+                                            title   string:Select ${item/title_or_id}" />
+                <input type="hidden" name="selected_obj_paths:list" value="#"
+                       tal:attributes="value item/relative_url" />
+                <label tal:content="item/title_or_id"
+                       tal:attributes="for string:cb_${item/id}" 
+                       class="hiddenStructure">
+                  Item Title
+                </label>
+              </td>
+              <td>
+                  <span tal:attributes="class item/type_class">
+                      <img tal:replace="structure item/icon" />
+                      <a href="#" tal:attributes="href  item/view_url;
+                                                title string: ${item/obj_type}: ${item/description};
+                                                class item/state_class;">
+                        <strong tal:omit-tag="not: item/is_browser_default"
+                            tal:content="item/title_or_id"/>
+                      </a>
+                  </span>
+
+                  <span class="state-expired"
+                        tal:condition="item/is_expired"
+                        i18n:translate="time_expired">expired</span>
+              </td>
+
+              <td>
+                <span tal:condition="not: item/size"> &nbsp; </span>
+                <span tal:condition="item/size"
+                      tal:content="item/size"
+                      tal:attributes="class item/state_class"> size </span>
+              </td>
+              <td tal:content="item/modified"
+                  tal:attributes="class item/state_class">
+                  08/19/2001 03:01 AM
+              </td>
+              <td>
+                  <span i18n:translate=""
+                        tal:condition="item/state_title"
+                        tal:content="item/state_title"
+                        tal:attributes="class item/state_class" />
+                  <span tal:condition="not: item/state_title">&nbsp;</span>
+              </td>
+              <td tal:condition="view/show_sort_column">
+                <a href=""
+                   title="Move item up"
+                   i18n:attributes="title title_move_item_up;"
+                   tal:attributes="href string:Course_Nav_position?position=up&amp;id=${item/quoted_id}&amp;url=${item/path}">
+                  &#9650;
+                </a>
+                &nbsp;
+                <a href=""
+                   title="Move item down"
+                   i18n:attributes="title title_move_item_down;"
+                   tal:attributes="href string:Course_Nav_position?position=down&amp;id=${item/quoted_id}&amp;url=${item/path}">
+                  &#9660;
+                </a>
+              </td>
+             </tr>
+          </tal:items>
+      </tbody>
+    </metal:block>
+  </table>
+  <tal:buttons tal:repeat="button view/buttons">
+    <input class="context"
+           type="submit"
+           name=""
+           value=""
+           i18n:attributes="value"
+           tal:attributes="value button/title; name button/url; class button/cssclass" />
+  </tal:buttons>
+  </metal:listing>
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templatechooser.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templatechooser.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templatechooser.py	(revision 126)
@@ -0,0 +1,79 @@
+##################################################################################
+#    Copyright (C) 2007 Utah State University, All rights reserved.          
+#                                                                                 
+#    This program is free software; you can redistribute it and/or modify         
+#    it under the terms of the GNU General Public License as published by         
+#    the Free Software Foundation; either version 2 of the License, or            
+#    (at your option) any later version.                                          
+#                                                                                 
+#    This program is distributed in the hope that it will be useful,              
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of               
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                
+#    GNU General Public License for more details.                                 
+#                                                                                 
+#    You should have received a copy of the GNU General Public License            
+#    along with this program; if not, write to the Free Software                  
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    
+#                                                                                 
+##################################################################################
+
+__author__ = 'David Ray, John Thomas, Brent Lambert'
+__docformat__ = 'restructuredtext'
+__version__ = "$Revision: 1 $"[11:-2]
+
+
+from zope.formlib.form import PageForm, FormFields, action
+from zope.app.form.interfaces import WidgetInputError
+from zope.component import getMultiAdapter
+from Products.PageTemplates import PageTemplateFile
+from enpraxis.educommons import eduCommonsMessageFactory as _
+from Products.MailHost.MailHost import MailHostError
+from Products.statusmessages.interfaces import IStatusMessage
+from interfaces import ITemplateForm
+
+from Products.CMFDefault.formlib.widgets import ChoiceRadioWidget
+
+from zope.interface import implements
+from zope.component import getUtility
+from zope.schema.vocabulary import SimpleVocabulary
+
+
+
+def templateVocabulary(context):
+    template_actions = context.portal_actions.listActionInfos(object=context, categories=('template_buttons'))
+    items = ()
+    for template_action in template_actions:
+        id = template_action['id']
+        title = str(template_action['title'])
+        items += (title, id), 
+        
+    return SimpleVocabulary.fromItems(items)
+
+
+class TemplateForm(PageForm):
+    """ A form for selecting templates on objects """
+
+    form_fields = FormFields(ITemplateForm)
+    form_fields['template'].custom_widget = ChoiceRadioWidget
+
+    label = u'Template Chooser'
+    description = u'Preview and choose templates for your content object'
+
+
+    @action(_(u'Apply Template', default=u'Apply Template'), 
+            name=u'Submit')
+    def action_submit(self, action, data):
+        # Apply the template
+        if data.has_key('template') and data['template']:
+            context = self.context
+            template = '@@%s' % data['template']
+            template = context.restrictedTraverse(str(template))
+            text = template(context)
+            context.setText(text)
+            if data['template'] in ['syllabus_view']:
+                context.setPresentation(True)
+            self.request.response.redirect('view')
+
+        return ''
+
+    
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/__init__.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/__init__.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/__init__.py	(revision 126)
@@ -0,0 +1,1 @@
+# make directory a product
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/aboutprof_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/aboutprof_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/aboutprof_view.pt	(revision 126)
@@ -0,0 +1,29 @@
+<div id="about">
+<table id="aboutTable"
+       border="0" 
+       cellspacing="0"
+       cellpadding="0" 
+       summary="Information about Professor"
+       i18n:translate="summary table_about_prof;">
+ <tbody>
+  <tr>
+   <td id="aboutPhoto">
+     <!-- Use eduCommons insert link functionality to create this link -->        
+     <img alt="Professor Image" title="Professor Image" width="275" height="275" border="0" 
+          src=""
+          tal:attributes="src string:${here/portal_url}/eduCommonsDivision.gif"/>
+   </td>
+   <td id="aboutInfo">
+     <h3>Professor X, Ph.D.</h3>
+     <p>Department Head / Professor</p>
+     <p>Department Name<br /> 
+     Institution Name</p>
+  
+     <p>Additional notes about Professor X.</p>
+
+   </td>
+  </tr>
+ </tbody>
+</table>
+
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/abouttext_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/abouttext_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/abouttext_view.pt	(revision 126)
@@ -0,0 +1,37 @@
+<tal:block>
+<h2>About OpenCourseWare</h2>
+<p>
+This site is involved in making course materials available through an open content license.
+</p>
+
+<p>
+More information about this site:
+</p>
+
+<ul>
+  <li><a href="terms-of-use" title="Terms of Use">Terms of Use</a></li>
+  <li><a href="privacy-policy" title="Privacy Policy">Privacy Policy</a></li>
+</ul>
+
+<h2>About eduCommons</h2>
+
+<p>eduCommons' goals are to:</p>
+
+<ul>
+  <li> Provide free, searchable, access to course materials for educators, 
+       students, and self-learners around the world.</li>
+  <li> Catalyze the growth of communities of learners.</li>
+  <li> Extend the reach and impact of the "opencourseware" concept.</li>
+</ul>
+
+<h2>Appreciation</h2>
+
+<p>eduCommons would not be possible without:</p>
+
+<ul>
+  <li> Generous funding from the <a href="http://www.hewlett.org/" title="Hewlett Foundation" target="_blank">William and Flora Hewlett Foundation</a>.
+  </li>
+  <li>Generous support from <a href="http://ocw.mit.edu/" title="MIT OCW" target="_blank">MIT OpenCourseWare</a>
+  including sharing their process documentation which has contributed significantly to the success of eduCommons.</li>
+</ul>
+</tal:block>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/accessibilityguidelines_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/accessibilityguidelines_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/accessibilityguidelines_view.pt	(revision 126)
@@ -0,0 +1,84 @@
+<h2>Checklist for Accessibility</h2>
+<p>Creating accessible Web-based resources is a necessary step towards a classroom environment that supports the learning needs of all students.  This checklist identifies several of the basic steps relevant to creating accessible Web-based resources in an educational setting; it is not a complete list to creating accessible Web content.</p>
+<table class="documentTable">
+<thead>
+<tr>
+<th>Accessibility Issue</th>
+<th>Yes</th>
+<th>No</th>
+<th>N/A</th>
+</tr>
+</thead>
+<tbody>
+<tr class="odd">
+<td>Appropriate text descriptions for images.</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="even">
+<td>Transcript or alternative provided for audio content.</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="odd">
+<td>Captioning provided for video/media content.</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="even">
+<td>At least one video is opened on the user's computer (i.e., video is not embedded on the Web page).</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="odd">
+<td>Hyperlinks provide clear information as to end location or function.</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="even">
+<td>Other elements beside color are used to convey information (e.g., asterisk, etc.).</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="odd">
+<td>Sufficient color contrast is present to differentiate between the foreground and background.</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="even">
+<td>Tables with data have appropriate row and column headers identified.</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="odd">
+<td>MS PowerPoint presentations accessible or are available in an accessible format</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="even">
+<td>Adobe PDF documents are accessible or available in an accessible format</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+<tr class="odd">
+<td>Interactive experiences are accessible or alternate available that conveys the same educational objectives.</td>
+<td><br /></td>
+<td><br /></td>
+<td><br /></td>
+</tr>
+</tbody>
+</table>
+<div class="discreet">
+<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/"><img alt="Creative Commons License" style="border-width:0" src="http://i.creativecommons.org/l/by-nc-sa/3.0/us/88x31.png"/></a><br/>This work is licensed under a <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/us/">Creative Commons Attribution-Noncommercial-Share Alike 3.0 United States License</a>.<br />
+  2008, High Tech Center Training Unit of the California Community Colleges</div>
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/configure.zcml
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/configure.zcml	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/configure.zcml	(revision 126)
@@ -0,0 +1,92 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+	   xmlns:browser="http://namespaces.zope.org/browser"
+	   i18n_domain="eduCommons">
+
+
+  <browser:page
+     name="division_view"
+     for="...interfaces.IDivision"
+     class="..coursestopic.DivisionPageView"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="course_view"
+     for="...interfaces.ICourse"
+     class="..coursestopic.CoursePageView"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="aboutprof_view"
+     for="*"
+     template="aboutprof_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="frontpage_view"
+     for="*"
+     template="frontpage_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="abouttext_view"
+     for="*"
+     template="abouttext_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="accessibilityguidelines_view"
+     for="*"
+     template="accessibilityguidelines_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="faq_view"
+     for="*"
+     template="faq_view.pt"
+     permission="zope2.View"
+     />
+
+
+  <browser:page
+     name="privacypolicy_view"
+     for="*"
+     template="privacypolicy_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="schedule_view"
+     for="*"
+     template="schedule_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="syllabus_view"
+     for="*"
+     template="syllabus_view.pt"
+     permission="zope2.View"
+     />
+
+  <browser:page
+     name="tou_view"
+     for="*"
+     template="tou_view.pt"
+     permission="zope2.View"
+     />
+
+
+  <browser:page
+     name="feedback_view"
+     for="*"
+     template="feedback_view.pt"
+     permission="zope2.View"
+     />
+
+</configure>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/course_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/course_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/course_view.pt	(revision 126)
@@ -0,0 +1,36 @@
+<div id="about">
+  <table id="aboutTable" 
+         border="0" 
+         cellspacing="0"
+         cellpadding="0" 
+         summary="Information about Course"
+         i18n:attributes="summary table_course_summary;">
+    <tbody>
+      <tr>
+        <td id="aboutPhoto">
+          <!-- Use eduCommons insert link functionality to create this link -->           
+          <img alt="Course Image" title="Course Image" width="275" height="275" border="0" 
+               src=""
+               tal:attributes="src string:${here/portal_url}/eduCommonsDivision.gif"/>
+        </td>
+        <td id="aboutInfo">
+          <h3>COURSE TITLE</h3>
+          <p><strong>Professor X, Ph.D.</strong></p>
+          <p>Department Name<br />
+             Institution Name</p>
+          <p><strong i18n:translate="label_course_structure">Course Structure:</strong> Hour long classes - four times a week</p>
+                <!-- For Course Structure: Follow Editorial Guidelines, (UPDATE) such as "hour long classes - twice weekly" or "2 hour seminar 
+                once weekly and 1 hour lab once weekly" -->
+        </td>
+      </tr>
+    </tbody>
+  </table>
+  
+  
+  <h4>Course Description</h4>
+  
+  <p>
+    Put any additional information about the course not in the right hand side of the box here.
+  </p>
+
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/division_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/division_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/division_view.pt	(revision 126)
@@ -0,0 +1,30 @@
+<div id="about">
+  <table cellspacing="0" 
+         cellpadding="0" 
+         border="0"
+         summary="Information about Department"
+         id="aboutTable"
+         i18n:attributes="summary table_dept_summary;">
+    <tbody>
+      <tr>
+        <td id="aboutPhoto">
+          <!-- Use eduCommons insert link functionality to create this link -->        
+          <img width="275" height="275" border="0" title="Department Image" alt="Department Image" 
+               src=""
+               tal:attributes="src string:${here/portal_url}/eduCommonsDivision.gif" />
+        </td>
+        <td id="aboutDeptInfo">
+          <h3>Department Name</h3>
+	  
+          <p tal:condition="not: view/isOpenOCW" id="deptMetadata">Institution Name</p>
+          <p>ABOUT THE DEPARTMENT</p>
+          <p>
+            <a href="#" tal:condition="not: view/isOpenOCW">Link to Department</a>...Tu es Petrus, et super hanc petram aedificabo Ecclesiam meam, 
+            et portae inferi non praevalebunt adversum eam. Et tibi dabo claves regni coelorum. 
+          </p>       
+        </td>
+      </tr>
+    </tbody>
+  </table>
+  
+</div>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/faq_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/faq_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/faq_view.pt	(revision 126)
@@ -0,0 +1,780 @@
+<tal:block tal:define="portal_title python:here.portal_url.getProperty('title')">
+<p class="discreet">
+  <a id="TOP" name="TOP"></a>This document provides the help for the 
+  <tal:block tal:replace="here/title">eduCommons</tal:block> OpenCourseWare 
+  site in the form of a list of frequently asked questions and answers. If you 
+  have other questions about this site please use the 
+  <a href="../feedback" title="Feedback">feedback</a> form.
+</p>
+
+<h2 tal:content="string:About ${portal_title} OCW">About eduCommons</h2>
+<ol>
+<li><h3><a id="q1" name="q1"></a> What is <tal:block tal:replace="portal_title">eduCommons</tal:block> OpenCourseWare?</h3>
+
+<p>The idea behind <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is to make <tal:block tal:replace="portal_title">eduCommons</tal:block> course materials that are used
+in the teaching of undergraduate and graduate subjects available on the
+Web, free of charge, to any user anywhere in the world. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW will
+advance technology-enhanced education at <tal:block tal:replace="portal_title">eduCommons</tal:block>, and will serve as a model
+for university dissemination of knowledge in the Internet age. This
+venture continues the tradition at <tal:block tal:replace="portal_title">eduCommons</tal:block>, and in American higher
+education, of open dissemination of educational materials, philosophy,
+and modes of thought, and will help lead to fundamental changes in the
+way colleges and universities utilize the Web as a vehicle for
+education.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q2" name="q2"></a> Why is <tal:block tal:replace="portal_title">eduCommons</tal:block> doing this?</h3>
+
+<p>Because technology makes it possible for us to increase the reach of
+educational opportunity, we have a moral obligation to do so. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+supports <tal:block tal:replace="portal_title">eduCommons</tal:block>'s mission to serve the public through learning, discovery,
+and engagement, and is true to <tal:block tal:replace="portal_title">eduCommons</tal:block>'s guiding principle that academics
+come first. As <tal:block tal:replace="portal_title">eduCommons</tal:block> enters the 21st century, services like
+OpenCourseWare enable it to more fully accomplish its land grant
+mission. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW contributes to the "shared intellectual commons" in
+academia, which fosters collaboration across <tal:block tal:replace="portal_title">eduCommons</tal:block> and among other
+scholars across disciplines and around the world.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q3" name="q3"></a> How does <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW differ from other types of Web-based education, including distance learning?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW differs from other <tal:block tal:replace="portal_title">eduCommons</tal:block> Web-based education offerings in that it
+is free and open, does not provide university credit, and grants no
+access to university faculty. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is not a distance-learning
+initiative. Distance learning involves the active exchange of
+information between faculty and students, with the goal of obtaining
+some form of a credential. Increasingly, distance learning is also
+limited to those willing and able to pay for materials or course
+delivery. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is not meant to replace degree-granting higher
+education or for-credit courses. Rather, the goal is to provide the
+content that supports an education.</p>
+
+<p>Many individual faculty members at <tal:block tal:replace="portal_title">eduCommons</tal:block> and other universities
+already use the Web extensively to make standard course materials
+available to their students. Some colleges and universities now require
+a Web site for every class. But, to a large extent, these Web sites are
+designed for, and access is only provided to, the students enrolled at
+these institutions. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is an unprecedented effort of a much
+broader magnitude, as the goal is to provide the course materials free
+and open to the world.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q4" name="q4"></a> What are the long-term goals of the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW initiative?</h3>
+
+<p>We expect <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW to grow to encompass the course materials of all
+faculty who are willing to participate. Over time, the goal is for most
+of the courses offered at <tal:block tal:replace="portal_title">eduCommons</tal:block> to be represented in the collection.
+Another goal of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is to catalyze the development of groups or
+communities around the course materials. Individuals participating in
+these informal groups will coach, mentor, and support each other in
+their learning, adding significant value to the materials themselves.
+Finally, we strongly desire to extend the reach and impact of the
+"opencourseware" concept.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q5" name="q5"></a> Will <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW always be free and openly available to anyone in the world?</h3>
+
+<p>We are committed to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW remaining a free and openly available
+publication of the course materials that support the dynamic classroom
+interactions of a <tal:block tal:replace="portal_title">eduCommons</tal:block> education. Even as we continue to grow and
+evolve, the materials will always remain free and open to all. Along
+with this commitment to remaining free and open, <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is also
+committed to the idea that <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is not a distance-learning, or a
+degree-granting, initiative, and that there will not be a registration
+process required for users to view course materials now or in the
+future. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is working hard to publish all of the <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty's
+course materials who wish to participate.</p>
+
+<p><a href="#TOP">Top</a></p>
+</ol>
+
+<h2 tal:content="string:Using ${portal_title} OCW Materials">Using eduCommons OCW Materials</h2>
+<ol>
+
+<li><h3><a id="q6" name="q6"></a> Do I need to register to use <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course materials?</h3>
+
+<p>Because <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is not a distance-learning, or a degree-granting,
+initiative, there is no registration process required for users to view
+course materials. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is a publication of the course materials that
+support the dynamic classroom interactions of an <tal:block tal:replace="portal_title">eduCommons</tal:block> education. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+is available on the Web, free of charge, to any user anywhere in the
+world.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q7" name="q7"></a> Where are the course materials?</h3>
+
+<p>To find what courses are available at this time, view the&nbsp;<a href="../courselist">complete course list</a>.
+Once you have accessed a particular course site, the left-hand
+navigation bar of each course homepage will detail what materials are
+available for that individual course.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q8" name="q8"></a> How do I find what courses are available?</h3>
+
+<p>You can, utilize the Search function that can be found in the right-hand corner of every page on the
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW site. You can search for specific text, such as certain academic
+discipline area, across all courses or within just one course. Or to
+perform a detailed search, use our&nbsp;<a href="search_form">Advanced Search</a>.</p>
+
+
+<p>Or, to see what courses are available is to click on&nbsp;<a href="../courselist">Courses</a>&nbsp;in the top navigation bar on every page of the
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+Web site. This will allow you to view the list of courses available at this time.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q9" name="q9"></a> How can I use <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course materials?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW can be considered a large-scale, Web-based publication of the
+course materials that support an <tal:block tal:replace="portal_title">eduCommons</tal:block> education. Educators are
+encouraged to utilize the materials for curriculum development,
+students can augment their current learning by making use of the
+materials offered, and self-learners are encouraged to draw upon the
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW for self-study or supplementary use. Course materials offered
+on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site may be used within 
+the license associated with the content, course or overall <tal:block tal:replace="portal_title">eduCommons</tal:block> site as applicable.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q10" name="q10"></a> What are the prerequisites to use <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW materials?</h3>
+
+<p>Because <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is not a distance-learning, or a degree-granting,
+initiative, there is no registration process required for users to view
+course materials. There are also no prerequisites for users who utilize
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course materials in their own learning. However, each course
+site indicates the prerequisites and corequisites that are required of
+<tal:block tal:replace="portal_title">eduCommons</tal:block> students.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q11" name="q11"></a> Does <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW offer discounts on textbooks or software applications utilized in the course materials?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW does not sell, offer vendor discounts for, or represent any
+vendor who may sell the software, books, or other materials that users
+of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW may require to understand the course materials offered on
+the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q12" name="q12"></a> How do I get a copy of the course pack for a particular <tal:block tal:replace="portal_title">eduCommons</tal:block> course?</h3>
+
+<p>The course-pack materials that accompany most <tal:block tal:replace="portal_title">eduCommons</tal:block> courses often contain
+proprietary information and copyrighted materials that <tal:block tal:replace="portal_title">eduCommons</tal:block> Faculty only
+use in their classroom interactions with <tal:block tal:replace="portal_title">eduCommons</tal:block> students. These materials
+are not available, nor will they be in the future, to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW users.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q13" name="q13"></a> I have seen (or I am/represent) an
+individual, organization, or institution that offers to teach <tal:block tal:replace="portal_title">eduCommons</tal:block>
+courses or tutor students based on <tal:block tal:replace="portal_title">eduCommons</tal:block> materials. Does <tal:block tal:replace="portal_title">eduCommons</tal:block> approve or
+recognize such individuals or organizations?</h3>
+
+<p>No, <tal:block tal:replace="portal_title">eduCommons</tal:block> has no relationship with, grants no special permission to, and
+does not approve, endorse, or certify any organizations, teachers,
+tutors, or other service providers who use educational materials
+available on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site in connection with their services.
+Except for students admitted to <tal:block tal:replace="portal_title">eduCommons</tal:block>, <tal:block tal:replace="portal_title">eduCommons</tal:block>
+does not authorize the granting of any kind of degree, certificate, or
+other recognition for participation in or completion of any course of
+study based on or using published <tal:block tal:replace="portal_title">eduCommons</tal:block> course materials.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q14" name="q14"></a> Can I/my organization state on our Web site or in our literature that we make use of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course materials?</h3>
+
+<p>To reference <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW you must comply with the terms of the license associated with <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW and/or the specific course materials. Typically you must you must give credit to <tal:block tal:replace="portal_title">eduCommons</tal:block> and the faculty author of
+the course materials anytime you use <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW materials. For your convenience, each <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW page includes a citation appropriate for the page at the bottom of the content. However, any
+reference to <tal:block tal:replace="portal_title">eduCommons</tal:block> (including the <tal:block tal:replace="portal_title">eduCommons</tal:block> name in any of its forms or <tal:block tal:replace="portal_title">eduCommons</tal:block>
+seals or logos) that deliberately or inadvertently claims, suggests, or
+in <tal:block tal:replace="portal_title">eduCommons</tal:block>'s sole judgment gives the appearance or impression of a
+relationship with or endorsement by <tal:block tal:replace="portal_title">eduCommons</tal:block>, is prohibited.</p>
+
+<p>[See also <a href="#q19">Intellectual Property</a>]</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q15" name="q15"></a> Can I link to the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site from my Web site?</h3>
+<p>Links to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW or to courses or pages within the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site are
+permitted so long as the use of the materials associated with the link
+is permitted under the terms of the license associated with the course materials or particlar content. Typically course materials are licensed under a <a href="http://creativecommons.org/licenses/by/2.5/" title="Creative Commons License">Creative 
+Commons Attribution license 2.5</a>, however individual course materials may have a separate license. Please check the bottom of the page to view the applicable license for any particular item. For your convenience, each <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW page includes a citation appropriate for the page at the bottom of the content. </p>
+
+<p>In addition to meeting the terms of the license, links to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW are permitted as long as the link is freely accessible (e.g., no restrictions
+or fee for access); and there is no claim, appearance, or implication
+of an affiliation with or endorsement by <tal:block tal:replace="portal_title">eduCommons</tal:block>. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW cannot guarantee
+the persistence of any specific link other than those to the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW homepage.</p>
+
+<p>[See also <a href="#q19">Intellectual Property</a>]</p>
+
+<p><a href="#TOP">Top</a></p>
+
+</ol>
+
+<h2>Content</h2>
+<ol>
+
+<li><h3><a id="q16" name="q16"></a> Why is there such variation in the breadth and depth of content presented on individual <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course Web sites?</h3>
+
+<p>Each <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course Web site is developed individually with the
+participating faculty and instructors. It includes as much of the <tal:block tal:replace="portal_title">eduCommons</tal:block>
+faculty member's course materials as is available in a digital format,
+or can be cost-effectively prepared; and is free of Intellectual
+Property and copyright restrictions. <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty and instructors
+participate only voluntarily, and publish only as much content as they
+are comfortable having on a Web site that is freely accessible
+worldwide.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q17" name="q17"></a> Why do some <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course sites lack solutions to assignments, quizzes, and exams?</h3>
+<p>In some cases, solutions to homework assignments, quizzes, and exams
+are only discussed and presented in the classroom, and not made
+available in print or electronic format to the <tal:block tal:replace="portal_title">eduCommons</tal:block> students--or to the
+worldwide community of visitors to the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site. In other
+cases, the instructors plan to re-use in their <tal:block tal:replace="portal_title">eduCommons</tal:block> classroom the
+assignments, quizzes, and exams, and so they do not wish to widely
+publish their solutions.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q18" name="q18"></a> Why doesn't every <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course offer video lectures?</h3>
+<p>Although video lectures are useful for students, there are many reasons
+that <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW does not include video lectures in every course. First is
+the issue of bandwidth. We are very much focused on making <tal:block tal:replace="portal_title">eduCommons</tal:block>'s
+courses materials as accessible as possible to users all over the
+world, including the developing world. If we were to start depending on
+the video component as THE key element of every <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course, we
+would be excluding a large portion of the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW audience who are
+not using high-speed Internet  connections. They would never be able to
+download the videos and we are very sensitive to that fact.</p>
+
+<p>Another key concern about video is cost. The technology for
+compressing and storing video becomes more and more affordable by the
+day, but it is still not affordable, or feasible from a production
+standpoint, for us to be compressing 20 video lectures for all of our
+courses. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW does not have that kind of storage capacity, at this
+time.</p>
+
+<p>A key <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW audience is educators, and for them, we are hoping
+that by providing the syllabus, reading lists and lecture notes, we are
+offering a chance for them to jumpstart their own pedagogy and improve
+the way they teach their chosen discipline. While video lectures are
+very easy for people with fast Internet connections to watch, they do
+not really fulfill the mission of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+</ol>
+
+<h2>Intellectual Property</h2>
+<ol>
+
+<li><h3><a id="q19" name="q19"></a> Who owns the intellectual property published on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site?</h3>
+
+<p>Prior to making any course materials publicly available, the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+team has reviewed all material extensively to determine the correct
+ownership of the material and obtain the appropriate licenses to make
+the material openly available on the Web. We will promptly remove any
+material that is determined to be infringing on the rights of others [See also <a href="#q24">What do I do if I believe a portion of 
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW material infringes my copyright?</a>].</p>
+
+<p>The intellectual property policies created for <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW are clear and
+consistent with other policies for scholarly materials used in
+education. Faculty retain ownership of most materials prepared for <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW. 
+<tal:block tal:replace="portal_title">eduCommons</tal:block> retains ownership only when significant use has been made of
+the Institute's resources. If student course work is placed on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW 
+site, then copyright in the work remains with the student.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q20" name="q20"></a> What are the Terms of Use for <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW users?</h3>
+
+<p>See the <a href="../about/terms_of_use">Terms of Use</a> for more information.</p>
+
+
+<p>If you would like to use <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course materials, but you are unsure whether your intended
+use qualifies as non-commercial use, please contact us using the <a href="../feedback">feedback</a> page.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+<li><h3><a id="q21" name="q21"></a>What are the Terms of Use for the discussion software?</h3>
+
+<p>See the <a href="../about/terms_of_use">Terms of Use</a> for more information.</p>
+
+
+<li><h3><a id="q22" name="q22"></a> How does <tal:block tal:replace="portal_title">eduCommons</tal:block> define non-commercial use?</h3>
+
+<p>A commercial use would involve the assessment of a direct or indirect
+fee for use of the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW materials, or any derivation or modification
+of the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW material, or any other commercial exploitation of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW 
+materials. All uses, reuse, and distribution of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW material,
+including works derived from <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW material, must be attributed to
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW and to the original authors where identified on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+materials you distribute. If you would like to use <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course
+materials, but you are unsure whether your intended use qualifies as
+non-commercial use, please contact us using the <a href="../feedback">feedback</a> link at the top of the page.
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q23" name="q23"></a> How do I properly cite my reuse of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW materials?</h3>
+
+<p>To reuse or repost materials from <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW, confirm that the license allows for the use you intend. If the license permits reuse, you must give proper
+attribution to the original <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty author(s).</p>
+
+<p>For your convenience, at the bottom of each page, we provide a citation in APA format, a copyright statement and a license for that page.</p>
+
+<p>Or you may chose to cite the resource in the following manner: "This material was created by or adapted from material created by <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty member, (Name),
+(Title), (Year). Copyright &copy; (Year), (Faculty Member's Name)."</p>
+
+<blockquote>As an example, the citation for "Understanding Online Interaction"
+taught by Utah State University Professor David Wiley would read, "This material was
+created or adapted from material created by Utah State University faculty member David
+Wiley, Associate Professor. Copyright &copy; 2004, David Wiley."</blockquote>
+
+
+<p>If you want to use the course materials on your Web site, and the materials are licensed using a Creative Commons license, you must also
+include a copy of the Creative Commons license, or
+clear and reasonable link to its URL (for example, <a href="http://creativecommons.org/licenses/by-nc-sa/2.5/" target="_blank">http://creativecommons.org/licenses/by-nc-sa/2.5/</a>), with every copy of the  materials or the derivative work(s) you create from it.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q24" name="q24"></a> How can I contribute my own educational materials to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW?</h3>
+
+<p>The intent of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is that our Web site should reflect the course
+materials for what is being taught at <tal:block tal:replace="portal_title">eduCommons</tal:block>. The reason for this policy
+is that the materials presented on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW site are authored by
+members of the <tal:block tal:replace="portal_title">eduCommons</tal:block> Faculty, and thus, our faculty will take final
+responsibility for these materials. It would be difficult for <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+to guarantee the accuracy and originality of materials we received from
+outside sources. However, we encourage other universities to create
+their own "opencourseware" in which materials from their courses would
+be posted online and openly shared with the world. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is eager to
+link to other universities or institutions that have similar goals.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+<li><h3><a id="q25" name="q25"></a> What do I do if I believe a portion of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW material infringes my copyright?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW, prior to making any <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW materials publicly available, has
+reviewed all material extensively to determine the correct ownership of
+the material and obtain the appropriate licenses to make the material
+available on <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW will promptly remove any material that is
+determined to be infringing on the rights of others. If you believe
+that a portion of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW material infringes on your copyright, please contact us using the <a href="../feedback">feedback</a> page.</p>
+
+<p>To file the notification, you must be either the copyright
+owner of the work or an individual authorized to act on behalf of the
+copyright owner. Your notification must include:
+</p>
+
+<ol>
+
+<li>Identification of the copyrighted work, or, in the case of multiple
+works at the same location, a representative list of such works at that
+site.</li>
+
+<li>Identification of the material that is claimed to be infringing or
+to be the subject of infringing activity. You must include sufficient
+information, such as a specific URL or other specific identification,
+for us to locate the material.</li>
+
+<li>Information for us to be able to contact the claimant (e.g., email address, phone number).</li>
+
+<li>A statement that the claimant believes that the use of the material
+has not been authorized by the copyright owner or an authorized agent.</li>
+
+<li>A statement that the information in the notification is accurate
+and that the claimant is, or is authorized to act on behalf of, the
+copyright owner.</li>
+
+</ol>
+
+<p>If you do not include an electronic signature with
+your claim, you may be asked to send or fax a follow-up copy with a
+signature.</p>
+
+<p><a href="#TOP">Top</a></p>
+</ol>
+
+<h2 tal:content="string:${portal_title} Faculty">eduCommons Faculty</h2>
+<ol>
+
+<li><h3><a id="q26" name="q26"></a> Are <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty required to participate in <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW?</h3>
+
+<p>Participation of <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty in <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is completely voluntary.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q27" name="q27"></a> How do I contact a specific member of the <tal:block tal:replace="portal_title">eduCommons</tal:block> Faculty?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is intended as a publication of <tal:block tal:replace="portal_title">eduCommons</tal:block> course materials on the
+Web, and not as an interactive experience with <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty. It provides
+the content of, but is not a substitute for, an <tal:block tal:replace="portal_title">eduCommons</tal:block> education. The most
+fundamental cornerstone of the learning process at <tal:block tal:replace="portal_title">eduCommons</tal:block> is the
+interaction between faculty and students in the classroom, and among
+students themselves on campus. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW does not offer visitors to the
+Web site the opportunity for direct contact with <tal:block tal:replace="portal_title">eduCommons</tal:block> faculty, though individual 
+portal faculty may choose to list their contact information. Inquiries related to specific course materials will be forwarded 
+to the <tal:block tal:replace="portal_title">eduCommons</tal:block>
+faculty member associated with that course for their consideration.
+However, due to the tremendous volume of email inquiries received, it
+is unlikely he or she will answer all emails.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q28" name="q28"></a> Will inquiries to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW be answered?</h3>
+
+<p>Yes inquiries will be answered. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW encourages users to provide <a href="../feedback">feedback</a> on the site and the
+published course materials. The comments and constructive criticism of
+users will help the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW staff improve the site and published course materials as we continue to evolve.</p>
+
+<p><a href="#TOP">Top</a></p>
+</ol>
+
+<h2>Translations</h2>
+<ol>
+
+<li><h3><a id="q29" name="q29"></a> Can I translate the course materials in <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW?</h3>
+
+<p>You may translate course materials in <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW if permitted by the license of the course materials you wish to translate. <tal:block tal:replace="portal_title">eduCommons</tal:block> asks that any <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW materials translated into other
+languages from the original language must be accompanied by the proper attribution of the original materials and include the following disclaimer:</p>
+
+<blockquote>"These <tal:block tal:replace="portal_title">eduCommons</tal:block> OpenCourseWare course materials have
+been translated into [YOUR LANGUAGE] by [YOUR INSTITUTION] and <tal:block tal:replace="portal_title">eduCommons</tal:block> 
+OpenCourseWare makes no representations or warranties of any kind
+concerning the materials, express or implied, including, without
+limitation, warranties of merchantability, fitness for a particular
+purpose, non-infringement, or the absence of errors, whether or not
+discoverable. <tal:block tal:replace="portal_title">eduCommons</tal:block> OpenCourseWare bears no responsibility for any
+inaccuracies in translation. Any inaccuracies or other defects
+contained in this material, due to inaccuracies in language
+translation, are the sole responsibility of [YOUR INSTITUTION] and not
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OpenCourseWare."</blockquote>
+
+ [See Also <a href="#q23">How do I properly cite my reuse of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW materials</a>] 
+ 
+<p><a href="#TOP">Top</a></p>
+</ol>
+
+<h2>Usability</h2>
+<ol>
+
+<li><h3><a id="q30" name="q30"></a> What are the technical requirements for viewing <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course materials?</h3>
+
+<p>The majority of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course sites work in modern Web browsers on both the Macintosh and
+Windows platforms. Although higher-speed connections are preferable,
+slower connections, such as modems, should allow users to view most
+materials on the sites (however, downloading or accessing materials may take
+somewhat longer). <!--<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW has tested the course sites with Netscape
+version 4.75 and Internet Explorer version 5.5 browsers.--></p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q31" name="q31"></a> What is metadata and why is it important to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW?</h3>
+
+<p>Metadata is, literally, "data about data." Metadata can be better
+understood as information that describes other information. For
+example, this Web page of FAQs for <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW has an author, a title, a
+date of creation, and a unique Internet address; this information
+constitutes the metadata about this page. Metadata enables
+sophisticated, powerful, and accurate searches across <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course
+materials.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q32" name="q32"></a> How do I change the font-size on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site?</h3>
+
+<p>The fonts and style of the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site have been specifically
+selected to meet certain design and accessibility standards. The <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW 
+Team has tested the site and these standards across a wide variety
+of browsers and platform. However, some users may still find that their
+browser configurations continue to display the text too small. You can
+change the displayed font size using your browser's View menu. In
+Netscape 7, there is a "VIEW - Text-Zoom" selection (try 120%). In
+Netscape 4.x, there is a "VIEW - Increase Font" selection. In Internet
+Explorer, you can select "VIEW - Text-Size - Larger or Largest." We
+hope this helps you to more comfortably view the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW course
+materials.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q33" name="q33"></a> Will the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site be compliant with W3C standards and accessibility requirements?</h3>
+
+<p>All course materials published on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW site are checked to see if they are
+valid XHTML and meet Section 508 and WAI-AA guidelines as part of the
+authoring process. We require all images to contain ALT attributes and
+all links to contain TITLE tags.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+<li><h3><a id="q33a" name="q33a"></a> How can I ensure my content is accessible?</h3>
+
+<p>While there is no automated way to ensure that a piece of content is entirely accessible, you can review and implement, as needed, the <a href="./accessibility-guidelines">accessibility guidelines</a>.
+
+<p><a href="#TOP">Top</a></p>
+
+
+
+<li><h3><a id="q34" name="q34"></a> Why does this PDF not open correctly in copy of Adobe Acrobat Reader?</h3>
+
+<p>A small percentage of the PDF documents offered on the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site
+may be compatible only with newer versions of Adobe Acrobat Reader. If you would like
+to view such a file, we recommend downloading the latest version of the Acrobat Reader 
+from the Adobe Web site at&nbsp;<a href="http://www.adobe.com/support/downloads/main.html" target="_blank">http://www.adobe.com/support/downloads/main.html</a>.</p>
+
+<p><a href="#TOP">Top</a></p>
+</ol>
+
+<h2>Privacy and Data Collection</h2>
+<ol>
+
+<li><h3><a id="q35" name="q35"></a> What information does <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW collect from visitors to the Web site?</h3>
+
+<p>The information we learn from visitors helps us improve the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+site, and assists our foundation sponsors in evaluation of usage,
+access, and impact of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW on the worldwide educational community.
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW collects the following information from visitors:</p>
+
+
+<ul>
+
+<li>
+<div><em>Information You Provide</em>: We receive and store any
+information you enter on our Web site or give us in any other way. You
+provide most such information when you submit feedback on the site,
+contact us by email, or agree to participate in a visitor survey. This
+information may include your name and email address, your academic
+status, your institution, your geographic region, how you are using <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW, 
+and what you think of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW. In all cases, any information you
+provide is strictly optional and voluntary and you may choose to use
+the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW site without ever providing this information. If you
+voluntarily provide your email address or other contact information, we
+will not share personal information with anyone without first
+requesting your explicit permission to do so.</div>
+</li>
+
+<li>
+<div><em>Automatic Information</em>: We receive and store certain types
+of information whenever you interact with the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site.
+Examples of the information we collect and analyze include the Internet
+protocol (IP) address used to connect your computer to the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW
+site; computer and connection information such as browser type and
+version, operating system, and platform, and; content you viewed or
+searched for during your visit to <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW. During some visits we may
+use software tools to measure and collect session information,
+including page response times, download errors, and length of visits to
+certain pages. However, none of this information is personally
+identifiable or linked back to you individually.</div>
+</li>
+
+</ul>
+
+<p>[See Also <a href="../about/privacy_policy">Privacy Policy</a>]</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q36" name="q36"></a> What are "cookies," and does <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW make use of cookies on its Web site?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW uses "cookies" in a limited way. Cookies are alphanumeric
+identifiers that this Web site transfers to your computer's hard drive
+through your Web browser to enable our systems to recognize your
+browser when you make return trips to the site. This allows us to track
+your use of the site (anonymously), and to analyze patterns in site
+use, such as repeat visits, length of visits, and breadth of content
+used, for example). Cookies also allow us to conduct periodic, online,
+voluntary user surveys where we can gain more insight into what type of
+people are actually using the site, how they are using the site, and
+what the educational impact of the site is on these users.</p>
+
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW's use of cookies is designed to be unobtrusive, and we do
+not collect personally identifiable information through their use.
+However, if you do not wish to accept cookies, the "Help" portion of
+the toolbar on most Web browsers will tell you how to prevent your
+browser from accepting new cookies, how to have the browser notify you
+when you receive a new cookie, or how to disable cookies altogether.
+Disabling cookies will in no way affect your access to content on the
+<tal:block tal:replace="portal_title">eduCommons</tal:block> OCW site. If you leave cookies enabled on your Web browser, you may
+be asked to complete a brief questionnaire that will help us gain a
+better understanding of the use and impact of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW.</p>
+
+<p>[See Also <a href="../about/privacy_policy">Privacy Policy</a>]</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q37" name="q37"></a> Does <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW share the information it receives?</h3>
+
+<p>Information about our site visitors is an important part of
+understanding and extending the impact of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW in the worldwide
+academic community. Individual personally identifiable information
+about users (name, email address, etc) will not be made available to
+third parties except as outlined below, nor will it ever be used for
+commercial purposes. We share user information only as described below.</p>
+
+<ul>
+
+<li>
+<div><em>Agents</em>: We employ companies and individuals to perform
+functions on our behalf. Examples include compiling and categorizing
+user feedback, analyzing survey data or data about your use of the
+site, and providing customer support. These agents have access to user
+information needed to perform their functions, for example, but may not
+use this information for any other purposes. These agents are bound by
+non-disclosure agreements.</div>
+</li>
+
+<li>
+<div><em><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Sponsors</em>: We work closely with philanthropic
+organizations that provide the funding that makes <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW possible.
+These sponsors are interested in evaluating access, use, and impact of
+the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site in order to determine if <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is achieving its
+objectives. We will provide information on a regular basis to these
+sponsors for evaluation purposes. We will not share any personally
+identifiable information such as name or email address unless you have
+given us explicit permission to do so.</div>
+</li>
+
+<li>
+<div><em>Institutions interested in the "opencourseware movement":</em>
+Part of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW's mission as an organization is to encourage other
+educational institutions to openly share their course materials with
+the world, as <tal:block tal:replace="portal_title">eduCommons</tal:block> is doing. In order to accomplish this objective, we
+are committed to sharing what we learn in public forums, at educational
+conferences, and with other educational institutions. This may include
+aggregate data about usage of the site, feedback we have received, and
+the impact of <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW on people throughout the world. However, in no
+case will we share any personally identifiable information, such as
+name or email address, unless you have given us explicit permission to
+do so.</div>
+</li>
+
+</ul>
+
+<p>[See Also <a href="../about/privacy_policy">Privacy Policy</a>]</p>
+
+<p><a href="#TOP">Top</a></p>
+</ol>
+
+<h2>Technology</h2>
+<ol>
+
+<li><h3><a id="q38" name="q38"></a> What technology is used to publish the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Web site?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW runs on the open source <a href="http://cosl.usu.edu/projects/educommons/">eduCommons</a>
+software. The current technical solution has been in use since January
+2005 with a small technical team managing all aspects of
+this infrastructure at the Center for Open and Sustainable Learning (<a href="http://cosl.usu.edu/">http://cosl.usu.edu/</a>) at Utah State University.</p>
+
+<p>The planning tools used by the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW team to assist faculty in
+publishing their course materials include a portion of the workflow in
+eduCommons, and several checklists and documents. For creating and
+managing content, we use several desktop tools (file conversion tools)
+as well as eduCommons, that together fully support our publishing
+process. Our content delivery infrastructure includes a production
+cluster and a content staging cluster.</p>
+
+<p>For more information on eduCommons, please contact The Center for Open and Sustainable Learning (<a href="http://cosl.usu.edu/">http://cosl.usu.edu/</a>).</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q39" name="q39"></a> Is <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW an open source project?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is firmly committed to open systems and will share its approach
+and the open source eduCommons software with those who may want to
+launch similar efforts. eduCommons has a dedicated team of developers focused on extending the platform, features and functions to
+meet <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW and other institution's needs.</p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q40" name="q40"></a> What is RSS?</h3>
+
+<p>RSS (Really Simple Syndication) and an aggregator allow you to 
+subscribe to discussion forums, blogs and other websites in order to receive timely, 
+organized updates of posts, news, and other information you care about.</p>
+
+<p><a href="#TOP">Top</a></p>
+</ol>
+
+<h2>Other Questions</h2>
+<ol>
+
+<li><h3><a id="q41" name="q41"></a> How can I support <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW with a financial donation?</h3>
+
+<p>It is particularly generous of you to offer a financial contribution to
+support <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW. This is a wonderful endorsement of what we hope to
+achieve. If you wish to make such a donation, please make your check
+payable to "<tal:block tal:replace="portal_title">eduCommons</tal:block>" and enclose a note indicating that the contribution is
+for the <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW Fund. You can mail your check to:<br />
+
+&lt;YourUniveristy&gt;<br />
+
+&lt;Street Address&gt;<br />
+
+&lt;City, State, Zip&gt;<br /></p>
+
+<p><a href="#TOP">Top</a></p>
+
+
+<li><h3><a id="q42" name="q42"></a> How do I apply for admission to <tal:block tal:replace="portal_title">eduCommons</tal:block> as a student?</h3>
+
+<p><tal:block tal:replace="portal_title">eduCommons</tal:block> OCW is not a degree-granting or certificate-granting program. <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW 
+course materials are available for free on the Web for the use of
+educators and self-learners. Those interested in applying to be
+full-time students at <tal:block tal:replace="portal_title">eduCommons</tal:block> are encouraged to contact the Admissions
+Office:<br />
+
+Office of Admissions<br />
+
+&lt;YourUniveristy&gt;<br />
+
+&lt;Street Address&gt;<br />
+
+&lt;City, State, Zip&gt;<br />
+
+&lt;Phone: 999-999-9999&gt;<br />
+
+<a href="#" target="_blank">http://www.yoursitehere.com/admissions/</a></p>
+
+<p><a href="#TOP">Top</a></p>
+
+</ol>
+
+
+<hr />
+
+This material was created or adapted from material created by MIT OCW, Copyright &copy; 2005 MIT in accordance with the <a href="http://ocw.mit.edu/OcwWeb/Global/terms-of-use.htm">MIT OCW Terms of Use, http://ocw.mit.edu/OcwWeb/Global/terms-of-use.htm</a>.
+</tal:block>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/feedback_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/feedback_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/feedback_view.pt	(revision 126)
@@ -0,0 +1,22 @@
+<p>
+We welcome your feedback on <tal:block tal:replace="here/title">eduCommons</tal:block> OpenCourseWare.
+</p>
+<p>
+Before sending us your feedback, you may want to view <a href="../help" title="Help: Frequently Asked Questions">Help &raquo; Frequently Asked Questions</a>.
+</p>
+<br />
+<form>
+<input class="standalone" value="Leave Feedback" type="button"
+       tal:define="email python:here.portal_properties.email_from_address;"
+       tal:attributes="onClick string:javascript:window.location='mailto:${email}';" />
+</form>
+<br />
+Possible feedback topics include:
+<ul>
+   <li>stories and experience with using <tal:block tal:replace="here/title">eduCommons</tal:block> OCW
+   <li>issues with content within a course</li>
+   <li>request a course that hasn't been posted yet</li>
+   <li>problems using the site</li>
+   <li>suggestions on improving the site</li>
+</ul>
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/frontpage_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/frontpage_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/frontpage_view.pt	(revision 126)
@@ -0,0 +1,89 @@
+<tal:block tal:define="portal_title python:here.portal_url.getProperty('title')">
+<table cellpadding="0" cellspacing="0" summary="eduCommons Home Page Layout">
+  <tbody>
+    <tr id="opentext" valign="top">
+      <td id="opentext-a">
+        <h2 tal:content="portal_title">eduCommons</h2>
+        <p><span tal:replace="portal_title" /> is a free and open educational resource for faculty, 
+	  students, and self-learners throughout the world. </p>
+        <div>We hope you find eduCommons valuable whether you're:</div>
+	  <ul>
+	    <li>a student looking for some extra help</li>
+	    <li>a faculty member trying to prepare a new course</li>
+	    <li>or someone interested in learning more about a subject that interests you.</li>
+	  </ul>
+        <p><span tal:replace="portal_title" /> does not grant credits or degrees, and does not provide 
+	  access to faculty. <span tal:replace="portal_title" /> gives you open access to the materials 
+	  used in a variety of courses.</p>
+      </td>
+      <td id="opentext-b">  
+        <h2>Welcome!</h2>
+	<ul>
+	  <li>If you're wondering where to start, try the list of departments on the left 
+	    of this page, or go to the full <a href="./courselist" 
+					       title="List of Courses">list of courses</a>.</li>
+	  <li>We've also provided answers to several questions about eduCommons in our 
+	    <a href="./help" 
+	       title="Frequently Asked Questions">Frequently Asked Questions</a>.</li>
+	  <li>Once you've had a chance to look around, we would love to hear your 
+	    <a href="./feedback" title="Feedback">feedback</a>.</li>
+        </ul>
+      </td>
+    </tr>
+  </tbody>
+</table>
+<table cellpadding="0" cellspacing="0" summary="User Testimonials" id="testimonial">
+  <tbody>
+    <tr id="testimonial">
+      <td id="testimonial-a" valign="top">
+        <h2>What's New</h2>
+	<ul id="testimonial-a">
+	  <li>Learn more about keeping up to date via 
+	    <a href="./courselist/@@rss_feeds"><img src="rss_icon.gif" alt="RSS" /></a>.
+	  </li>
+	  <li>
+	    Look for the <a href=""
+			    tal:attributes="href string:${here/portal_url}/front-page/presentation_view">presentation mode icon</a>
+	                 <a href=""
+			    tal:attributes="href string:${here/portal_url}/front-page/presentation_view"><img src="s5_icon.jpg" alt="Presentation Mode" /></a> 
+	    in the upper right which allows you to view content as slides.
+	  </li>
+	  <li>
+	    We've also added many more new features for those who are adding new 
+	    content to eduCommons sites.
+	  </li>
+	</ul>
+      </td>
+      <td id="testimonial-b" valign="top">
+        <h2>Content</h2>
+	<ul>
+	  <li>
+	    Use the <a href=""
+		       tal:attributes="href string:${here/portal_url}/front-page/skinless_view">Content View icon</a>
+	            <a href=""
+		       tal:attributes="href string:${here/portal_url}/front-page/skinless_view"><img src="document_icon.gif" alt="Content View" /></a> 
+	    to view or download a plain version of a page. This 
+	    feature makes it easy to reuse the content elsewhere, but be sure to check with
+	    the requirements of the copyright license listed at the bottom of the page.
+	  </li>
+	</ul>	
+      </td>
+      <td id="testimonial-c" valign="top">
+        <h2>About eduCommons</h2>
+	<ul>
+	  <li>
+	    You can find out more about the software hosting this site by visiting the
+	    <a href="http://cosl.usu.edu/projects/educommons"
+	       class="link-plain">eduCommons project page</a>. 
+	  </li>
+	  <li>
+	    You can also read additional 
+	    <a href="http://cosl.usu.edu/projects/educommons/documentation"
+	       class="link-plain">documentation</a>
+	    about eduCommons.
+	</ul>
+      </td>      
+    </tr>
+  </tbody>
+</table>
+</tal:block>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/privacypolicy_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/privacypolicy_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/privacypolicy_view.pt	(revision 126)
@@ -0,0 +1,7 @@
+<p>
+This site has not yet set a privacy policy.
+</p>
+
+<p>
+  Please  please use the
+  <a href="../feedback" title="Feedback">feedback</a> form to request privacy policy information.</p>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/schedule_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/schedule_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/schedule_view.pt	(revision 126)
@@ -0,0 +1,104 @@
+<h2>Course Schedule Information</h2>
+
+<table summary="schedule" class="documentTable" width="40%" border="0" cellpadding="0" cellspacing="0">
+    <thead>
+        <tr>
+            <td align="center" valign="center" width="50">Lesson</td>
+            <td align="center" valign="center">Topic</td>
+            <td style="text-align: center;">Audio&nbsp;</td>
+            <td style="text-align: center;">&nbsp;Video</td>
+        </tr>
+    </thead>
+    <tbody>
+        <tr class="even">
+            <td align="center">1</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="odd">
+            <td align="center">2</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="even">
+            <td align="center">3</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="odd">
+            <td align="center">4</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="even">
+            <td align="center">5</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="odd">
+            <td align="center">6</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="even">
+            <td align="center">7</td>
+            <td>&nbsp;</td>
+            <td></td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="odd">
+            <td align="center">8</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="even">
+            <td align="center">9</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="odd">
+            <td align="center">10</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="even">
+            <td align="center">11</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="odd">
+            <td align="center">12</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="even">
+            <td align="center">13</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="odd">
+            <td align="center">14</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+        <tr class="even">
+            <td align="center">15</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+            <td>&nbsp;</td>
+        </tr>
+    </tbody>
+</table>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/syllabus_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/syllabus_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/syllabus_view.pt	(revision 126)
@@ -0,0 +1,71 @@
+<h2>Course Description</h2>
+<p>Paragraph about Course</p>
+
+<h2>Course Objectives</h2>
+<ul>
+  <li>Objective 1</li>
+  <li>Objective 2</li>
+  <li>Objective 3</li>
+  <li>Objective 4</li>
+  <li>Objective etc.</li>
+  <li>Objective etc.</li>
+</ul>
+
+<h2>Prerequisites</h2>
+
+<p><em>Class One</em></p>
+<p>Description of Class One</p>
+
+<p><em>Class Two</em></p>
+<p>Description of Class Two</p>
+
+<h2>Required Textbook</h2> 
+<p><em>Book Title.</em> Edition (Author(s), Year, Publisher), Year.</p>
+
+<h2> Other Reading</h2> 
+<ul>
+  <li>Reading One</li>
+  <li>Reading Two</li>
+  <li>Reading Three</li>
+</ul>
+
+
+<h2>Grading</h2>
+<table class="documentTable" cellpadding="0" cellspacing="0" width="50%" summary="grading scale">
+  <thead>
+    <tr>
+      <td width="50%">Component</td>
+      <td width="50%">Percentage</td>
+    </tr>
+  </thead>
+  <tfoot>
+    <tr>
+      <td>&nbsp;</td>
+      <td>100%</td>
+    </tr>
+  </tfoot>
+  <tbody>
+    <tr class="even">
+      <td>Problem Sets</td>
+      <td>20%</td>
+    </tr>
+    <tr class="odd">
+      <td>Written Report/Oral Presentation of Special Project</td>
+      <td>15%</td>
+    </tr>
+    <tr class="even">
+      <td>Examination 1</td>
+      <td>20%</td>
+    </tr>
+    <tr class="odd">
+      <td>Examination 2</td>
+      <td>20%</td>
+    </tr>
+    <tr class="even">
+      <td>Final Examination</td>
+      <td>25%</td>
+    </tr>
+  </tbody>
+</table>
+
+<p class="instruction">The table above includes sample data.  Edit the table as befits the class being worked on.</p>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/tou_view.pt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/tou_view.pt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/templates/tou_view.pt	(revision 126)
@@ -0,0 +1,84 @@
+<tal:block tal:define="portal_title python:here.portal_url.getProperty('title')">
+<p class="discreet">
+This document provides the terms of use for the <tal:block tal:replace="portal_title">eduCommons</tal:block> Open
+Courseware site. If you have any questions please use the <a href="../feedback" title="Feedback">feedback</a> form.</p>
+
+<h2>Intellectual Property</h2>
+
+<h2>Course Materials</h2>
+<p>Course materials made available through <tal:block tal:replace="portal_title">eduCommons
+</tal:block> OCW are the property of their respective rights holders. Unless otherwise specified 
+the course materials are Copyright <tal:block tal:replace="portal_title">eduCommons
+</tal:block> and are licensed under <a href="http://creativecommons.org/licenses/by/2.5/" title="Creative Commons License">Creative 
+Commons Attribution license 2.5</a>.<p>
+
+<h2>Comments</h2>
+<p>All comments posted in <tal:block tal:replace="portal_title">eduCommons</tal:block> OCW 
+are the property of their authors and are licensed for display, copying, reuse, and distribution 
+according to the terms of the <a href="http://creativecommons.org/licenses/by/2.5/" title="Creative Commons License">Creative 
+Commons Attribution license 2.5</a>.
+</p>
+
+<p>
+Representing material posted in <span tal:replace="portal_title">eduCommons</span> by another individual as your own work in online or
+offline settings is strictly prohibited and constitutes grounds for
+immediate termination of your <span tal:replace="portal_title">eduCommons</span> account and may lead to civil
+and/or criminal charges.
+</p>
+
+<h2>Liability Disclaimer</h2>
+
+<p>
+Information, advice, opinions, and other expressions in <span tal:replace="portal_title">eduCommons</span> 
+are provided "as is" without warranty of any kind, express or implied, 
+including, but not limited to, the implied warranties of merchantability, 
+fitness for a particular purpose, or non-infringement. The entire liability 
+for any use of any materials available through <span tal:replace="portal_title">eduCommons</span> lies with 
+the user of the materials.
+</p>
+
+<h2>Abuse of the <span tal:replace="portal_title">eduCommons</span> OCW Site</h2>
+
+<p>
+The following list describes
+activities that are strictly prohibited within <span tal:replace="portal_title">eduCommons</span>. 
+Attempting or succeeding to allow or commit any of the acts prohibited
+below constitutes grounds for immediate termination of your <span tal:replace="portal_title">eduCommons</span>
+account and may lead to civil and/or criminal charges. Prohibited
+activities include, but are not limited to, the following:
+</p>
+
+<div class="tos">
+  <ul>
+    <li>Users shall not do anything
+        to intentionally degrade the performance of <span tal:replace="portal_title">eduCommons</span> 
+        hardware, software, or network resources.</li>
+    <li>Users shall not attempt to
+        gain unauthorized access to any portion of <span tal:replace="portal_title">eduCommons</span>.</li>
+    <li>Users shall not post
+        commercial solicitations or "spam" comments in <span tal:replace="portal_title">eduCommons</span>.</li>
+    <li>Users shall not attempt to
+        spread viruses, worms, or other files harmful to computer systems
+        and/or networks via <span tal:replace="portal_title">eduCommons</span>.</li>
+    <li>Users shall not gather
+        personal information about other users (including, but not limited to,
+        harvesting email addresses) via <span tal:replace="portal_title">eduCommons</span>.</li>
+    <li>Users shall not share their
+        password or account with other individuals.</li>
+    <li>Users shall refrain from
+        making harassing, intimidating, or libelous statements or other
+        expressions in <span tal:replace="portal_title">eduCommons</span>.</li>
+    <li>Users shall refrain from
+        offensive/inflammatory statements or other expressions (for example,
+        offensive images) in <span tal:replace="portal_title">eduCommons</span>.</li>
+    <li>Users shall not engage in
+        impersonation or other behavior designed to deceive <span tal:replace="portal_title">eduCommons</span> 
+        users and/or community leaders.</li>
+    <li>Users shall respect the
+        intellectual freedom of others&rsquo; expression of their opinions
+        and ideas.</li>
+  </ul>
+</div>
+</tal:block>
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/translate.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/translate.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/translate.py	(revision 126)
@@ -0,0 +1,81 @@
+from Acquisition import aq_inner, aq_parent
+from zope.component import getMultiAdapter
+from Products.Five import BrowserView
+from Products.statusmessages.interfaces import IStatusMessage
+from enpraxis.educommons import eduCommonsMessageFactory as _
+from Products.CMFCore.utils import getToolByName
+
+
+class CreateTranslation(BrowserView):
+
+    def _setCanonicalLanguage(self, obj):
+        """Make sure an object has a language set (ie is not neutral).
+        """
+        lang=obj.Language()
+        if not lang:
+            portal_state=getMultiAdapter((self.context, self.request),
+                                    name="plone_portal_state")
+            lang=portal_state.language()
+            obj.setLanguage(lang)
+
+
+
+    def nextUrl(self, trans):
+        """Figure out where users should go after creating the translation.
+        """
+        try:
+            action=trans.getTypeInfo().getActionInfo("object/translate",
+                    object=trans)
+            return action["url"]
+        except ValueError:
+            pass
+
+        try:
+            action=trans.getTypeInfo().getActionInfo("object/edit",
+                    object=trans)
+            return action["url"]
+        except ValueError:
+            pass
+
+        state=getMultiAdapter((trans, self.request), name="plone_context_state")
+        return state.view_url()
+
+    def __call__(self):
+        status=IStatusMessage(self.request)
+        self._setCanonicalLanguage(self.context)
+
+        newlang=self.request["newlanguage"]
+
+        if self.context.hasTranslation(newlang):
+            state=getMultiAdapter((self.context, self.request),
+                                    name="plone_context_state")
+            status.addStatusMessage(_(u"Translation already exists"),
+                                    type="error")
+            return self.request.response.redirect(state.view_url())
+
+        lt=getToolByName(self.context, "portal_languages")
+        lt.setLanguageCookie(newlang)
+
+        #Customization for eduCommons to ensure parent Division --> Course --> SubObject's parent folder translated first
+        if self.context.aq_inner.aq_parent.Type() == 'Plone Site':
+            self.context.addTranslation(newlang)
+            trans=self.context.getTranslation(newlang)
+            status.addStatusMessage(_(u"Translated created."),
+                                    type="info")
+
+            return self.request.response.redirect(self.nextUrl(trans))
+        else:
+            if self.context.aq_inner.aq_parent.aq_explicit.hasTranslation(newlang):
+                self.context.addTranslation(newlang)
+                trans=self.context.getTranslation(newlang)
+                status.addStatusMessage(_(u"Translated created."),
+                                        type="info")
+                
+                return self.request.response.redirect(self.nextUrl(trans))
+            else:
+                url = self.context.absolute_url()
+                not_available = '%s/not_available_lang/view?set_language=%s&parentNotTranslated=True' % (url, newlang)
+                return self.request.response.redirect(not_available)
+
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/viewlets.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/viewlets.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/browser/viewlets.py	(revision 126)
@@ -0,0 +1,32 @@
+##################################################################################
+#    Copyright (C) 2004-2007 Utah State University, All rights reserved.          
+#                                                                                 
+#    This program is free software; you can redistribute it and/or modify         
+#    it under the terms of the GNU General Public License as published by         
+#    the Free Software Foundation; either version 2 of the License, or            
+#    (at your option) any later version.                                          
+#                                                                                 
+#    This program is distributed in the hope that it will be useful,              
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of               
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                
+#    GNU General Public License for more details.                                 
+#                                                                                 
+#    You should have received a copy of the GNU General Public License            
+#    along with this program; if not, write to the Free Software                  
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    
+#                                                                                 
+##################################################################################
+
+__author__ = 'Brent Lambert, David Ray, Jon Thomas'
+__docformat__ = 'restructuredtext'
+__version__ = "$Revision: 1 $"[11:-2]
+
+
+from plone.app.layout.viewlets.content import DocumentActionsViewlet, DocumentBylineViewlet
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+
+class IconDocumentActionsViewlet(DocumentActionsViewlet):
+    render = ViewPageTemplateFile("icon_document_actions.pt")
+
+class LockViewlet(DocumentBylineViewlet):
+    render = ViewPageTemplateFile("lock.pt")
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/config.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/config.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/config.py	(revision 126)
@@ -0,0 +1,2 @@
+PROJECTNAME = 'eduCommons'
+GLOBALS = globals()
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/configure.zcml
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/configure.zcml	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/configure.zcml	(revision 126)
@@ -0,0 +1,320 @@
+<configure
+    xmlns="http://namespaces.zope.org/zope"
+    xmlns:five="http://namespaces.zope.org/five"
+    xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
+    xmlns:i18n="http://namespaces.zope.org/i18n"
+    i18n_domain="eduCommons">
+
+  <five:registerPackage package="." initialize=".initialize" />
+
+  <genericsetup:registerProfile
+     name="default"
+     title="eduCommons"
+     directory="profiles/default"
+     description="Extension profile for eduCommons Product"
+     provides="Products.GenericSetup.interfaces.EXTENSION"
+     />
+
+  <genericsetup:registerProfile
+     name="openocw"
+     title="eduCommons OpenOCW"
+     directory="profiles/openocw"
+     description="Extension profile for eduCommons OpenOCW"
+     provides="Products.GenericSetup.interfaces.EXTENSION"
+     />
+
+  <genericsetup:upgradeStep
+     title="Migration :: 3.0.2 to 3.1.0"
+     description="Migrates eduCommons from version 3.0.2 to 3.1.0"
+     source="3.0.2"
+     destination="3.1.0"
+     handler=".upgrades.v3_0_2_to_3_1_0.migrate"
+     sortkey="1"
+     profile="enpraxis.educommons:default" />
+
+  <genericsetup:upgradeStep
+     title="Migration :: 3.0.2 to 3.1.0"
+     description="Migrates eduCommons from version 3.0.2 to 3.1.0"
+     source="3.0.2"
+     destination="3.1.0"
+     handler=".upgrades.openocw.v3_0_2_to_3_1_0.migrate"
+     sortkey="1"
+     profile="enpraxis.educommons:openocw" />
+  
+  <include package=".browser" />
+  <include package=".content" />
+  <include package=".portlet" />
+  <include package=".utilities" />
+  <include package="collective.captcha" />
+
+  <i18n:registerTranslations directory="locales" />
+
+  <class class=".content.division.Division">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>
+
+  <class class=".content.course.Course">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>
+
+  <class class=".content.fssfile.FSSFile">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>  
+
+  <class class="Products.ATContentTypes.content.document.ATDocument">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>
+
+  <class class="Products.ATContentTypes.content.folder.ATFolder">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>
+
+  <class class="Products.ATContentTypes.content.image.ATImage">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>
+
+  <class class="Products.ATContentTypes.content.file.ATFile">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>
+
+  <class class="Products.ATContentTypes.content.link.ATLink">
+    <implements interface=".interfaces.IClearCopyrightable
+			   .interfaces.IAccessibilityCompliantable
+			   .interfaces.ICourseOrderable
+                           zope.annotation.interfaces.IAttributeAnnotatable"
+      />
+  </class>
+
+  <adapter
+     for=".interfaces.IClearCopyrightable"
+     provides=".interfaces.IClearCopyright"
+     factory=".fields.ClearCopyright"
+     trusted="true"
+  />
+
+  <class class=".fields.ClearCopyright">
+    <require
+       permission="zope2.View"
+       interface=".interfaces.IClearCopyright"
+    />
+  </class>
+
+
+  <subscriber
+     for=".interfaces.IClearCopyrightable
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".events.update_clear_copyright"
+  />
+
+  <adapter
+     for=".interfaces.IAccessibilityCompliantable"
+     provides=".interfaces.IAccessibilityCompliant"
+     factory=".fields.AccessibilityCompliant"
+     trusted="true"
+  />
+
+  <class class=".fields.AccessibilityCompliant">
+    <require
+       permission="zope2.View"
+       interface=".interfaces.IAccessibilityCompliant"
+    />
+  </class>
+
+
+  <subscriber
+     for=".interfaces.IAccessibilityCompliantable
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".events.update_accessibility_compliant"
+  />
+
+
+  <subscriber
+      for="collective.imstransport.interfaces.ISetNameSpaces"
+      handler=".eventHandlers.setNameSpaces" />
+
+  <subscriber
+      for="collective.imstransport.interfaces.IObjectWriteMetadata"
+      handler=".eventHandlers.writeECMetadata" />
+
+  <subscriber
+      for="collective.imstransport.interfaces.IObjectReadMetadata"
+      handler=".eventHandlers.readECMetadata" />
+
+  <subscriber
+      for="collective.imstransport.interfaces.IObjectWriteOrganizations"
+      handler=".eventHandlers.writeOrganizations" />
+
+  <subscriber
+      for="collective.imstransport.interfaces.IObjectReadOrganizations"
+      handler=".eventHandlers.readOrganizations" />
+
+  <subscriber
+      for="collective.imstransport.interfaces.IObjectWriteContributeNode"
+      handler=".eventHandlers.writeContributeNode" />
+ 
+  <subscriber
+      for="collective.imstransport.interfaces.IObjectReadContributeNode"
+      handler=".eventHandlers.readContributeNode" />
+ 
+  <subscriber
+      for="collective.imstransport.interfaces.IObjectCreateObject"
+      handler=".eventHandlers.eduCommonsCreateObject" />
+
+  <subscriber
+     for=".content.course.Course
+	  zope.app.container.interfaces.IObjectAddedEvent"
+     handler=".events.add_course_portlets"
+   />
+
+  <subscriber
+     for="Products.ATContentTypes.content.image.ATImage
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_creators"
+     />
+
+  <subscriber
+     for="Products.ATContentTypes.content.file.ATFile
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_creators"
+     />
+
+  <subscriber
+     for="Products.ATContentTypes.content.folder.ATFolder
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_creators"
+     />
+
+  <subscriber
+     for="Products.ATContentTypes.content.document.ATDocument
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_creators"
+     />
+    
+  <subscriber
+     for="enpraxis.educommons.interfaces.IDivision
+          zope.app.container.interfaces.IObjectAddedEvent"
+     handler=".eventHandlers.syndicateFolderishObject"
+  />
+
+  <subscriber
+     for="enpraxis.educommons.interfaces.ICourse
+          zope.app.container.interfaces.IObjectAddedEvent"
+     handler=".eventHandlers.syndicateFolderishObject"
+  />  
+
+<!--
+  <subscriber
+     for="enpraxis.educommons.interfaces.ICourse
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".eventHandlers.updateZipDownload"
+  />
+
+  <subscriber
+     for="Products.ATContentTypes.content.document.ATDocument
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".eventHandlers.updateZipDownload"
+  />
+ 
+  <subscriber
+     for="Products.ATContentTypes.content.file.ATFile
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".eventHandlers.updateZipDownload"
+  /> 
+
+  <subscriber
+     for="Products.ATContentTypes.content.image.ATImage
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".eventHandlers.updateZipDownload"
+  />
+ 
+  <subscriber
+     for="Products.ATContentTypes.content.folder.ATFolder
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".eventHandlers.updateZipDownload"
+  />
+
+  <subscriber
+     for="Products.ATContentTypes.content.link.ATLink
+	  zope.lifecycleevent.interfaces.IObjectModifiedEvent"
+     handler=".eventHandlers.updateZipDownload"
+  />
+
+
+  <subscriber
+      for=".interfaces.ICourseUpdateEvent"
+      handler=".eventHandlers.ZipFileMaker"
+    />
+
+  <subscriber
+      for=".interfaces.IDeleteCourseObjectEvent"
+      handler=".eventHandlers.deleteObjectHandler"
+  />
+-->
+
+  <subscriber
+     for=".interfaces.ICourseOrderable
+          zope.app.container.interfaces.IObjectAddedEvent"
+     handler=".eventHandlers.addObjPosition"
+  />
+
+  <subscriber
+     for=".interfaces.ICourseOrderable
+          zope.app.container.interfaces.IObjectModifiedEvent"
+     handler=".events.reindexOnReorder"
+  />
+
+
+  <subscriber
+     for="Products.ATContentTypes.content.image.ATImage
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_excludefromnav"
+     />
+
+  <subscriber
+     for="Products.ATContentTypes.content.file.ATFile
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_excludefromnav"
+     />
+
+  <subscriber
+     for="Products.ATContentTypes.content.folder.ATFolder
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_excludefromnav"
+     />
+
+  <subscriber
+     for="Products.ATContentTypes.content.document.ATDocument
+	  zope.component.interfaces.IObjectEvent"
+     handler=".events.set_default_excludefromnav"
+     />
+
+ 
+</configure>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/__init__.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/__init__.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/__init__.py	(revision 126)
@@ -0,0 +1,5 @@
+from courses import CoursesTopic
+from division import Division
+from course import Course
+from feedback import Feedback
+from fssfile import FSSFile
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/configure.zcml
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/configure.zcml	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/configure.zcml	(revision 126)
@@ -0,0 +1,4 @@
+<configure 
+    xmlns="http://namespaces.zope.org/zope">
+
+</configure>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/course.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/course.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/course.py	(revision 126)
@@ -0,0 +1,172 @@
+from Products.Archetypes.atapi import Schema
+from Products.Archetypes.atapi import TextField, TextAreaWidget, RichWidget
+from Products.Archetypes.atapi import StringField, StringWidget, LinesField
+from Products.Archetypes.atapi import BooleanField, BooleanWidget
+from Products.Archetypes.atapi import SelectionWidget, MultiSelectionWidget
+from Products.Archetypes.atapi import AnnotationStorage
+from Products.Archetypes.atapi import RFC822Marshaller
+from Products.Archetypes.utils import DisplayList
+from Products.ATContentTypes.configuration import zconf
+from Products.ATContentTypes.atct import ATFolder, ATFolderSchema
+from Products.ATContentTypes.lib.historyaware import HistoryAwareMixin
+from Products.ATContentTypes.content.base import registerATCT
+from Products.ATContentTypes.content.schemata import finalizeATCTSchema
+from zope.interface import implements
+from AccessControl import ClassSecurityInfo
+from Products.CMFCore.permissions import AddPortalContent
+from enpraxis.educommons.interfaces import ICourse
+from enpraxis.educommons.config import PROJECTNAME
+
+from enpraxis.educommons import eduCommonsMessageFactory as _
+
+
+
+
+
+CourseSchema = ATFolderSchema.copy() + Schema((
+        
+    TextField('text',
+              required=False,
+              searchable=True,
+              primary=True,
+              storage = AnnotationStorage(migrate=True),
+              validators = ('isTidyHtmlWithCleanup',),
+              #validators = ('isTidyHtml',),
+              default_output_type = 'text/x-html-safe',
+              widget = RichWidget(
+                        description = '',
+                        label = _(u'Body Text'),
+                        rows = 25,
+                        allow_file_upload = zconf.ATDocument.allow_document_upload),
+             ),
+
+    StringField('courseId',
+                required=False,
+                widget=StringWidget(label=_(u'Course ID'),
+                                    label_msgid='label_course_id',
+                        	    description=_(u'The course identifier or catalog number. Also can be used to sequence courses (1.0, 2.0, etc).'),
+                                    description_msgid='help_course_id',
+                                    ),
+                ),
+
+    StringField('term',
+                required=False,
+                widget=StringWidget(label=_(u'Term'),
+                                    label_msgid='label_course_term',
+                                    description=_(u'The term the course was taught in.'),
+                                    description_msgid='help_course_term',
+                                    ),
+                ),
+        
+
+    TextField('structure',
+              required=False,
+              default_content_type='text/plain',
+              allowable_content_types = ('text/plain',),
+              widget=TextAreaWidget(label=_(u'Structure'),
+                                    label_msgid='label_course_structure',
+                                    description=_(u'The structure of the course.'),
+                                    description_msgid='help_course_structure',
+                                    rows=3,
+                                    cols=40,
+                                    ),
+              ),
+
+    StringField('level',
+                required=False,
+                vocabulary=[_(u'Undergraduate'), _(u'Graduate'),],
+                widget=SelectionWidget(label=_(u'Level'),
+                                       label_msgid='label_course_structure',
+                                       description=_(u'The level at which the course is taught.'),
+                                       description_msgid='help_course_level',
+                                       format='select',
+                                       ),
+                ),
+
+    StringField('instructorName',
+                required=False,
+                widget=StringWidget(label=_(u'Instructor Name'),
+                                    label_msgid='label_course_instructor_name',
+                                    description=_(u'The name of the primary instructor teaching this course.'),
+                                    description_msgid='help_course_instructor_name',
+                                    ),
+                ),
+    
+    StringField('instructorEmail',
+                required=False,
+                widget=StringWidget(label=_(u'Instructor Email'),
+                                    label_msgid='label_course_instructor_email',
+                                    description=_(u'The email address of the primary instructor teaching this course.'),
+                                    description_msgid='help_course_instructor_email',
+                                    ),
+                ),
+
+    BooleanField('displayInstEmail',
+                 widget=BooleanWidget(label=_(u'Display Instructor Email Address'),
+                                      label_msgid='label_course_display_inst_email',
+                                      description=_(u'Should the primary instructor\'s Email address be publically displayed?'),
+                                      description_msgid='help_course_display_inst_email',
+                                      ),
+                 ),
+
+    BooleanField('instructorAsCreator',
+                 widget=BooleanWidget(label=_(u'Instructor is Primary Author'),
+                                      label_msgid='label_course_inst_primary_author',
+                                      description=_(u'Is the primary instructor also the primary author of the course materials?'),
+                                      description_msgid='help_course_inst_primary_author',
+                                      ),
+                 ),
+    
+
+    LinesField('crosslisting',
+                required=False,
+                vocabulary='getDivisionsVocab',
+                widget=MultiSelectionWidget(label=_(u'Cross Listing(s)'),
+                                       label_msgid='label_course_crosslisting',
+                                       description=_(u'Other Divisions that this Course should be listed in. To select multiple options, SHIFT click for adjacent items, or CTRL/CMD click for non-adjacent items.'),
+                                       description_msgid='help_course_crosslisting',
+                                       format='select',
+                                       ),
+                ),
+
+
+    ),
+    marshall=RFC822Marshaller()
+    )
+
+finalizeATCTSchema(CourseSchema)
+
+
+class Course(ATFolder):
+    """ A course content object """
+
+    implements(ICourse)
+    security = ClassSecurityInfo()
+    schema = CourseSchema
+    portal_type = 'Course'
+
+    _at_rename_after_creation = True
+
+    def initializeArchetype(self, **kwargs):
+        ATFolder.initializeArchetype(self, **kwargs)
+        deftext = self.restrictedTraverse('@@course_view')
+        self.setText(deftext())
+
+    def getECParent(self):
+        """ Determine by acquisition if an object is a child of a course. """
+        return self
+
+    def getDivisionsVocab(self):
+        """ Get the list of current divisions and return it as a vocabulary. """
+        path = {'query':('/'), }
+        brains = self.portal_catalog.searchResults(path=path, Type='Division', sort_on='sortable_title')
+        dl = DisplayList()
+        dl.add('None', 'None')
+        for brain in brains:
+            if brain.getId != self.aq_parent.id:
+                dl.add(brain.getId, brain.Title)
+        return dl
+
+        
+
+registerATCT(Course, PROJECTNAME)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/courses.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/courses.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/courses.py	(revision 126)
@@ -0,0 +1,19 @@
+from Products.Archetypes.atapi import registerType
+from Products.ATContentTypes.atct import ATTopic, ATTopicSchema
+from zope.interface import implements
+from AccessControl import ClassSecurityInfo
+from enpraxis.educommons.interfaces import ICoursesTopic
+from enpraxis.educommons.config import PROJECTNAME
+
+CoursesTopicSchema = ATTopicSchema.copy()
+
+class CoursesTopic(ATTopic):
+    
+    implements(ICoursesTopic)
+    security = ClassSecurityInfo()
+    schema = CoursesTopicSchema
+    portal_type = "CoursesTopic"
+
+    _at_rename_after_creation = True
+
+registerType(CoursesTopic, PROJECTNAME)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/division.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/division.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/division.py	(revision 126)
@@ -0,0 +1,63 @@
+from Products.Archetypes.atapi import Schema
+from Products.Archetypes.atapi import TextField, RichWidget
+from Products.Archetypes.atapi import AnnotationStorage
+from Products.Archetypes.atapi import RFC822Marshaller
+from Products.ATContentTypes.configuration import zconf
+from Products.ATContentTypes.atct import ATFolder, ATFolderSchema
+from Products.ATContentTypes.lib.historyaware import HistoryAwareMixin
+from Products.ATContentTypes.content.base import registerATCT
+from Products.ATContentTypes.content.schemata import finalizeATCTSchema
+from zope.interface import implements
+from AccessControl import ClassSecurityInfo
+from Products.CMFCore.permissions import AddPortalContent
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from enpraxis.educommons.interfaces import IDivision
+from enpraxis.educommons.config import PROJECTNAME
+
+from enpraxis.educommons import eduCommonsMessageFactory as _
+
+
+DivisionSchema = ATFolderSchema.copy() + Schema((
+    TextField('text',
+              required=False,
+              searchable=True,
+              primary=True,
+              storage = AnnotationStorage(migrate=True),
+              validators = ('isTidyHtmlWithCleanup',),
+              #validators = ('isTidyHtml',),
+              default_output_type = 'text/x-html-safe',
+              widget = RichWidget(
+                        description = '',
+                        label = _(u'Body Text'),
+                        rows = 25,
+                        allow_file_upload = zconf.ATDocument.allow_document_upload),
+              ),
+    ),
+    marshall=RFC822Marshaller()
+    )
+
+finalizeATCTSchema(DivisionSchema)
+        
+
+
+class Division(ATFolder):
+    """ The Department/Division content object. """
+
+    implements(IDivision)
+    security = ClassSecurityInfo()
+    schema = DivisionSchema
+    portal_type = "Division"
+
+    _at_rename_after_creation = True
+
+
+    def initializeArchetype(self, **kwargs):
+        ATFolder.initializeArchetype(self, **kwargs)
+        deftext = self.restrictedTraverse('@@division_view')
+        self.setText(deftext())
+
+    def getECParent(self):
+        """ Determine by acquisition if an object is a child of a course. """
+        return self
+
+registerATCT(Division, PROJECTNAME)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/feedback.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/feedback.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/feedback.py	(revision 126)
@@ -0,0 +1,37 @@
+from Products.Archetypes.atapi import AnnotationStorage
+from Products.ATContentTypes.configuration import zconf
+from Products.ATContentTypes.atct import ATFolder, ATFolderSchema
+from Products.ATContentTypes.lib.historyaware import HistoryAwareMixin
+from Products.ATContentTypes.content.base import registerATCT
+from Products.ATContentTypes.content.schemata import finalizeATCTSchema
+from zope.interface import implements
+from AccessControl import ClassSecurityInfo
+from Products.CMFCore.permissions import AddPortalContent
+from Products.Five.browser.pagetemplatefile import ViewPageTemplateFile
+from enpraxis.educommons.interfaces import IFeedback
+from enpraxis.educommons.config import PROJECTNAME
+
+
+
+FeedbackSchema = ATFolderSchema.copy()
+
+finalizeATCTSchema(FeedbackSchema)
+        
+
+
+class Feedback(ATFolder):
+    """ The Feedback content object. """
+
+    implements(IFeedback)
+    security = ClassSecurityInfo()
+    schema = FeedbackSchema
+    portal_type = "Feedback"
+
+    _at_rename_after_creation = True
+
+
+    def initializeArchetype(self, **kwargs):
+        ATFolder.initializeArchetype(self, **kwargs)
+        self.setLayout('feedback_view')
+
+registerATCT(Feedback, PROJECTNAME)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/fssfile.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/fssfile.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/content/fssfile.py	(revision 126)
@@ -0,0 +1,57 @@
+from AccessControl import ClassSecurityInfo
+from zope.interface import implements
+
+# Archetypes imports
+try:
+    from Products.LinguaPlone.public import *
+except ImportError: 
+    # No multilingual support
+    from Products.Archetypes.public import *
+
+# Products imports
+from iw.fss.FileSystemStorage import FileSystemStorage
+from Products.ATContentTypes.atct import ATFile, ATFileSchema
+from Products.ATContentTypes.lib.historyaware import HistoryAwareMixin
+from Products.ATContentTypes.content.base import registerATCT
+from Products.ATContentTypes.content.schemata import finalizeATCTSchema
+
+from enpraxis.educommons.interfaces import IFSSFile
+from enpraxis.educommons.config import PROJECTNAME
+
+
+from Products.CMFPlone import PloneMessageFactory as _
+
+FSSFileSchema = ATFileSchema.copy() + Schema((
+    FileField('file',
+              required=False,
+              primary=True,
+              storage=FileSystemStorage(),
+              widget = FileWidget(
+                        description = u"Select the file to be added by clicking the 'Browse' button.",
+                        description_msgid = "help_file",
+                        label= "Large File",
+                        label_msgid = "label_large_file",
+                        i18n_domain = "eduCommons",
+                        show_content_type = False,)),
+    ), 
+    marshall=RFC822Marshaller()
+)
+                                           
+finalizeATCTSchema(FSSFileSchema)
+
+class FSSFile(ATFile):
+    """A storage item for IMS/ZIP copies of courses using FileSystemStorage"""
+
+    implements(IFSSFile)
+    
+    security = ClassSecurityInfo()
+    schema = FSSFileSchema
+    portal_type = 'Large File'
+    
+    _at_rename_after_creation = True
+
+    def initializeArchetype(self, **kwargs):
+        ATFile.initializeArchetype(self, **kwargs)
+
+
+registerATCT(FSSFile, PROJECTNAME)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/CHANGES.html
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/CHANGES.html	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/CHANGES.html	(revision 126)
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!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">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<title></title>
+<link rel="stylesheet" href="./default.css" type="text/css" />
+</head>
+<body>
+<div class="document">
+
+
+<div class="section" id="changes-in-version-3-1-0">
+<h1>Changes in version 3.1.0</h1>
+<dl class="docutils">
+<dt>&quot;Download Course&quot; Additions</dt>
+<dd>Moved &quot;download this course&quot; into a &quot;Reuse Course&quot; portlet. The course downloads now include IMS information. Using a portlet will also allow for additional formats, such as Common Cartridge, to be added in the future.</dd>
+<dt>Display License and Caption for Embedded Objects</dt>
+<dd>Using the Kupu editor, eduCommons can now display separate licenses and citations for image objects embedded in a page, distinct from the overall page license.</dd>
+<dt>Captcha integration</dt>
+<dd>We now integrate captcha on the registration page to prevent spambot submissions.</dd>
+<dt>Lingua Plone 2.0 Integration</dt>
+<dd>LinguaPlone 2.0 has been implemented into eduCommons 3.1.0, allowing users to localize content and support multiple languages on a single OpenCourseWare site.</dd>
+<dt>Add accessibility check</dt>
+<dd>This is intended to help institutions who want to include accessibility check into their workflow.</dd>
+<dt>Enable Javascript/Page-specific CSS and embed tags by default</dt>
+<dd>We have enabled Javascript and page-specific CSS and embed tags by default.</dd>
+<dt>Documentation for Adding Small Widgets</dt>
+<dd>Add eduCommons-specific documentation and examples for adding Plone 3 portlets.</dd>
+<dt>Add &quot;Remix this course&quot; functionality</dt>
+<dd>This feature is designed to allow courses from MIT OpenCourseWare (pending implementation by MIT OCW) as well as other eduCommons OCWs to be easily imported into OpenOCW (or another eduCommons site if specified, but OpenOCW will be the default). On published eduCommons OCW courses that have been packaged, a &quot;Remix this course&quot; link appears. This allows unauthenticated users to send the entire course to OpenOCW (OpenOCW login credentials must be provided).</dd>
+<dt>Update &quot;download this course&quot; to improve handling of large courses</dt>
+<dd>&quot;Download this course&quot; is no longer auto-generated when a course is published or changed. Instead, a new &quot;Package course&quot; button appears in the contents view of the course once it has been published. The &quot;Download this course&quot; .zip file now includes IMS information. It now appears in its own portlet, along with the &quot;Remix this course&quot; link.</dd>
+<dt>Other updates</dt>
+<dd>Updated eduCommons to exclude new content from showing in the left nav by default (including zip imports).
+Improved IE 6 and 7 compatibility.</dd>
+</dl>
+</div>
+<div class="section" id="changes-in-version-3-0-2">
+<h1>Changes in version 3.0.2</h1>
+<p>Fixed bugs in 3.0.1 migration release</p>
+</div>
+<div class="section" id="changes-in-version-3-0-1">
+<h1>Changes in version 3.0.1</h1>
+<p>Added migration support for from eduCommons 2.3.1</p>
+</div>
+<div class="section" id="changes-in-version-3-0-0">
+<h1>Changes in version 3.0.0</h1>
+<dl class="docutils">
+<dt>Added full support for Plone 3.0</dt>
+<dd>Inline editing
+Working Copy support
+Link and reference integrity checking
+Automatic locking and unlocking
+Easy collaboration and sharing
+Versioning, history and reverting content
+Upgraded visual HTML editor</dd>
+<dt>Added OpenOCW Functionality</dt>
+<dd>Simplified Workflow
+Refactored Security
+Eased Production processes</dd>
+<dt>Simplified Course Building</dt>
+<dd>Course Builder Widget allows 'one step' production of Division, Course, and templates Course objects (syllabus, etc).</dd>
+</dl>
+</div>
+<div class="section" id="changes-in-version-2-3-1">
+<h1>Changes in version 2.3.1</h1>
+<dl class="docutils">
+<dt>Added Migration from 2.2.0</dt>
+<dd>The migration process has been improved and simplified.</dd>
+</dl>
+</div>
+<div class="section" id="changes-in-version-2-3-0">
+<h1>Changes in version 2.3.0</h1>
+<dl class="docutils">
+<dt>Added i18n Support for Spanish, Dutch, French, and Chinese</dt>
+<dd>Translations are now available for the aforementioned languages.</dd>
+<dt>Added Support for MOCSL Tools</dt>
+<dd>The Folksemantic AddOn Product allows for seamless interaction with
+Annorate, Make A Path, and Send2Wiki.</dd>
+<dt>Fixed Metadata Bugs</dt>
+<dd>The Citations were presenting incorrect metadata; now pulling in correct
+metadata per object.</dd>
+<dt>Added Course Wide Instructor Metadata</dt>
+<dd>A flag is now available to note if the Instructor of the Course is also the
+principal creator for objects within the course.</dd>
+<dt>Added MIT CP Import Support</dt>
+<dd>Via the IMS Transport Tool, an end user can now import IMS Content Packages.
+eduCommons will strip the package of it's chrome and import content, navigation,
+and metadata.</dd>
+<dt>Added Zip File Download for Courses</dt>
+<dd>End Users can now get a Zip File download of a course object, stripped of eduCommons
+chrome and ready for reuse</dd>
+<dt>Extended RSS Feed Support</dt>
+<dd>Departments and Courses now have configurable feeds per object, and the ability to turn
+feeds on and off</dd>
+<dt>Added Recursive Copyright Clearance</dt>
+<dd>Folderish Objects may now recrusively clear or revoke copyight</dd>
+</dl>
+</div>
+<div class="section" id="changes-in-version-2-2-0">
+<h1>Changes in version 2.2.0</h1>
+<p>Front end UI Enhancements</p>
+<p>Auto-citation generation (from metadata) displayed inline with documents and included in skinless content. Simplify conformance with Attribution terms of Creative Commons licenses for those who build derivative works.</p>
+<p>Social Bookmarking Dropdown. Help users bookmark and later find OERs hosted in eduCommons using popular social bookmarking services.</p>
+<p>Integration with MyOCW (pending MyOCW release dates).</p>
+<p>Expanded support for IMS Content Packaging, including a transform engine that can translate from popular IMS CP formats to and from eduCommons.</p>
+<p>Updated internationalization support, with translation updates for a predetermined set of languages.</p>
+<p>Finalized support for content translation using the LinguaPlone product.</p>
+</div>
+<div class="section" id="changes-in-version-2-1-1">
+<h1>Changes in version 2.1.1</h1>
+<dl class="docutils">
+<dt>Updated Internationalization Files</dt>
+<dd>Updated internationalization files to reflect the latest eduCommons changes.</dd>
+<dt>Added Support for Inline Translations</dt>
+<dd>Integrated the LinguaPlone product with eduCommons, making it now possible
+to have multiple translations of content within the same eduCommons instance.</dd>
+<dt>RSS Feeds on front page, and RSS feeds for departments</dt>
+<dd>RSS feed icon now appears on the front page of eduCommons, as well as on the
+courses listing page. A new RSS feed now appears for departments, which
+lists the latest published courses in a department.</dd>
+<dt>Added Support for Social Bookmarking Services</dt>
+<dd>Added support for bookmarking services, starting with del.icio.us. Support
+for more to come.</dd>
+<dt>Added a Skinless View for Documents</dt>
+<dd>eduCommons now provides a skinless view of documents, making it both possible
+and easy to reuse content.</dd>
+</dl>
+</div>
+<div class="section" id="changes-in-version-2-1-0-final">
+<h1>Changes in version 2.1.0-final</h1>
+<dl class="docutils">
+<dt>A new IMS Transport Engine</dt>
+<dd>A refactored IMS Content Packaging engine that provides a more robust import
+and export functionality. On import eduCommons will identify where required
+tags missing in the manifest file, if it is not able to read it directly.</dd>
+<dt>IMS Content Packaging Documentation</dt>
+<dd>This version ships with detailed documentation on how to write out an IMS
+Content Package that eduCommons can consume. The documentation is provided
+in raw text, web based, and in a standalone (PDF) file.</dd>
+<dt>A New Content Licensing Engine</dt>
+<dd>eduCommons now allows a default content license and a rights holder to be
+set sitewide. It also includes the ability to license an individual piece
+of content, should the need arise to publish content under a license
+different to the site wide one.</dd>
+<dt>Copyright Bylines</dt>
+<dd>Content is now published with the appropriate copyright byline, including
+the ability to specify copyright dates, the rights holder, and the license
+itself. The license includes a hyper-link to the legal terms of the license
+as well as an icon (if the license includes one).</dd>
+<dt>Creative Commons License Support</dt>
+<dd>eduCommons now includes a license selector that integrates with Creative
+Commons Licenses (www.creativecommons.org), allowing eduCommons to remain
+flexible with the latest CC offerings.</dd>
+<dt>Support for Other Licenses</dt>
+<dd>eduCommons supports other licenses, including the traditional all rights
+reserved, and GNU Free Document Licenses, as well as allowing content
+developers to input their own license.</dd>
+<dt>RDF and machine readable Creative Commons License Support</dt>
+<dd>eduCommons will publish by default any metadata for a content object in
+embedded RDF format. eduCommons will also publish machine readable creative
+commons licenses, that can be read and processed by search engines.</dd>
+<dt>Content Licensing Product for Plone 2.5</dt>
+<dd>The content licensing features in eduCommons are shipped in a standalone product
+that can also be used in a default Plone 2.5 instance.</dd>
+<dt>Native Support for Plone 2.5</dt>
+<dd>This version of eduCommons supports the latest version of Plone (2.5), with some
+functionality now taking advantage of the new Zope 3 component architecture.</dd>
+<dt>Improved HTML Validation/Fixing Engine</dt>
+<dd>The HTML Validation/Fixer Engine has been updated, and now displays a detailed
+report of problems within the body of an HTML document, and provides a simple
+method to fix most problems, and identify remaining ones that need extra
+attention. This functionality works when a content developer's editor is not
+set to use the FCKeditor.</dd>
+</dl>
+</div>
+<div class="section" id="changes-in-version-2-0-0-final">
+<h1>Changes in version 2.0.0-final</h1>
+<dl class="docutils">
+<dt>Human Readable URLS</dt>
+<dd>URLs are human readable, instead of being based on an auto generated id.</dd>
+<dt>Recursive Folder Change State</dt>
+<dd>Can change workflow state recursively on content in subfolders.</dd>
+<dt>Native Support for Plone 2.1</dt>
+<dd>Integrated eduCommons custom skin files with new Plone 2.1 functionality.
+Content objects are now based on ATContentTypes. Substantial changes across
+the code base. eduCommons is currently based on Plone-2.1.2 and Zope-2.8.6.</dd>
+<dt>Content Status History on Object Views in Edit Mode</dt>
+<dd>The content status history of an object is now available in the view from
+a history link at the top of the page while in edit mode.</dd>
+<dt>No Redirect on Front Page</dt>
+<dd>Front page no longer redirects to an ECIndex folder, but renders directly.</dd>
+<dt>Removed Forum Support</dt>
+<dd>Forum support is being replaced by new social software in the future, which
+means that the old OLS code base is no longer being maintained. If you require
+forum support it is recommended that you use the excellent zForum
+(<a class="reference external" href="http://www.zforum.org">http://www.zforum.org</a>) plone product until the new software is in place.</dd>
+<dt>Improved IMS Content packaging</dt>
+<dd>Workflow status history is now written in the IMS content package instead
+of being stored in a binary blob.</dd>
+<dt>eduCommons Custom Skin Support</dt>
+<dd>eduCommons can now reskinned in release mode without requiring eduCommons
+to be restarted.</dd>
+<dt>Courses Object Removed</dt>
+<dd>The courses object has been removed, and departments are now put in the
+root of the site. This simplifies the UI and removes confusion over what
+the Courses object is/was.</dd>
+<dt>Improved Default Templates</dt>
+<dd>Default templates for the front page, FAQ and about pages propagate the
+eduCommons site title, making it easier to customize default site text.</dd>
+<dt>Department and Course IDs</dt>
+<dd>Departments and Courses now support the display of ID's in front of their
+titles. Courses also support the display of the year and semester that the
+course was taught in.</dd>
+</dl>
+</div>
+<div class="section" id="changes-in-version-1-6-1-final">
+<h1>Changes in version 1.6.1-final</h1>
+<dl class="docutils">
+<dt>eduCommons Document HTML Fixer</dt>
+<dd>Implement an HTML engine that can fix HTML mistakes automatically in ecDocuments.</dd>
+<dt>RDF Headers/Metadata</dt>
+<dd>Add RDF headers to ECDocuments implementing the RDF/Dublin Core standard.</dd>
+<dt>Support for Plone 2.1.1/Zope 2.8.2</dt>
+<dd>Implementing support for the latest Plone (2.1.1) and Zope (2.8.2) code bases.</dd>
+<dt>Support for Default Templates</dt>
+<dd>Support for adding default templates for commonly used pages within eduCommons.</dd>
+<dt>Review and Revise IMS Export Rights</dt>
+<dd>Changes in the UI to only present IMS import/export to administrators and managers.
+This is necessary because producers do not have rights on content that is not in the
+&quot;In Progress&quot; state, which prevents producers from being able to import/export
+content not in the appropriate state.</dd>
+<dt>Zip export (non-ims)</dt>
+<dd>Allow a producer administrator or manager to export course content in a zip file format.</dd>
+<dt>Creative Commons metadata header</dt>
+<dd>Add a metadata header to ECDocuments for the creative commons license.</dd>
+<dt>Removal of &quot;Courses&quot; link in bread crumb</dt>
+<dd>Remove the &quot;Courses&quot; link in the breadcrumb due to the fact that is is confusing to users.</dd>
+<dt>XHTML Validation of an Entire Course</dt>
+<dd>Adding the ability to do validation of XHTML across a course, while reporting
+errors in a log file.</dd>
+<dt>Add Folders to Course Contents</dt>
+<dd>Add folders to course content pages so that objects which externally link to other
+objects will retain their links with out having to rewrite them.</dd>
+<dt>Migration from 1.5.2-final</dt>
+<dd>Implement the ability to migrate existing 1.5.2-final sites to 1.6.1-final.</dd>
+</dl>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="CHANGES.txt">View document source</a>.
+Generated on: 2009-01-14 23:51 UTC.
+Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/IMSContentPackaging.html
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/IMSContentPackaging.html	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/IMSContentPackaging.html	(revision 126)
@@ -0,0 +1,482 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!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">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<title></title>
+<link rel="stylesheet" href="./default.css" type="text/css" />
+</head>
+<body>
+<div class="document">
+
+
+<div class="section" id="ims-content-packaging-and-educommons-3-1-1-final">
+<h1>IMS Content Packaging and eduCommons 3.1.1-final</h1>
+<p>This document details how to write IMS Content packages that are compatible with
+eduCommons 3.1.1-final.</p>
+<p>eduCommons uses version 1.2 of the IMS Content Packaging Specification. XML Schemas
+for the specification can be found at <a class="reference external" href="http://imsglobal.org/xsd/imscp_v1p2.xsd">http://imsglobal.org/xsd/imscp_v1p2.xsd</a> and
+<a class="reference external" href="http://imsglobal.org/xsd/imsmd_v1p2p4.xsd">http://imsglobal.org/xsd/imsmd_v1p2p4.xsd</a>.</p>
+</div>
+<div class="section" id="using-xml-schemas-and-a-validating-xml-editor">
+<h1>Using XML Schemas and a Validating XML Editor</h1>
+<p>In the process of writing software that exports eduCommons supported IMS Content
+Packages, it is highly recommended to use a validating XML editor and associated
+schema files to check manifests for validity. eduCommons in some circumstances
+will expect import manifests to meet validity standards, and the chances of
+creating content packages that will work with eduCommons will be greatly increased.
+eduCommons provides XML schema files on export for this purpose.</p>
+<p>An XML schema file for eduCommons specific metadata can be found both online
+(<a class="reference external" href="http://cosl.usu.edu/xsd/eduCommonsv1.1.xsd">http://cosl.usu.edu/xsd/eduCommonsv1.1.xsd</a>) and in eduCommons IMS Content
+Packages.</p>
+<p>To use the IMS Content Package XML schemas along with the eduCommons schema, make
+sure your manifest specifies these packages and the relevant XML schema informtation
+in the header. Below is an example of attributes which you may want to set on the
+<em>manifest</em> tag.</p>
+<pre class="literal-block">
+xmlns=&quot;http://www.imsglobal.org/xsd/imscp_v1p1&quot;
+xmlns:eduCommons=&quot;http://cosl.usu.edu/xsd/eduCommonsv1.1&quot;
+xmlns:imsmd=&quot;http://www.imsglobal.org/xsd/imsmd_v1p2&quot;
+xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;
+xsi:schemaLocation=&quot;http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd
+                    http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p4.xsd
+                    http://cosl.usu.edu/xsd/eduCommonsv1.2 eduCommonsv1.2.xsd&quot;&gt;
+</pre>
+</div>
+<div class="section" id="specifying-and-using-educommons-namespaces">
+<h1>Specifying and Using eduCommons Namespaces</h1>
+<p>The IMS CP specification allows content packages to be extended using custom
+metadata fields. eduCommons takes advantage of this to pass information that
+does not fit into the LOM metadata format. Using the eduCommons extensions
+requires the use of the eduCommons namespace in typical XML style.</p>
+<p>eduCommons can read values from colon prefixed tags, or by using an <em>xmlns</em>
+attribute on the top level eduCommons tag as shown below. Although both methods
+are acceptable, the latter is preferred due to the fact that it makes the
+corresponding XML more readable. Examples in the rest of the document will
+be given in this format.</p>
+<pre class="literal-block">
+&lt;manifest xmlns=&quot;....
+          xmlns:eduCommons=&quot;http://cosl.usu.edu/xsd/eduCommonsv1.2&quot;
+          ...
+          &gt;
+
+    ...
+
+    &lt;eduCommons:eduCommons&gt;
+        &lt;eduComons:objectType&gt;
+            Course
+        &lt;/eduCommons:objectType&gt;
+    &lt;/eduCommons:eduCommons&gt;
+
+    ...
+ &lt;/manifest&gt;
+</pre>
+<pre class="literal-block">
+&lt;eduCommons xmlns=&quot;http://cosl.usu.edu/xsd/eduCommonsv1.2&quot;&gt;
+    &lt;objectType&gt;
+        Course
+    &lt;/objectType&gt;
+&lt;/eduCommons&gt;
+</pre>
+</div>
+<div class="section" id="how-to-make-items-appear-in-the-left-hand-navigation">
+<h1>How to Make Items Appear in the Left Hand Navigation</h1>
+<p>eduCommons will add links to objects in the left hand navigation of a course
+view through the use of the <em>organizations</em> section in an IMS content package.
+Becuase IMS CP standards support multiple organizations within a manifest,
+eduCommons will use the default organization if it is specified. If no default
+is specified eduCommons will read from the first <em>organization</em> tag listed
+in the organizations section.</p>
+<p>eduCommons gets its left hand navigation information from the <em>isVisible</em> attribute
+on items. If this attribute is present and set to true, eduCommons will mark
+this object as displayable in the left hand navigation. eduCommons will order
+left hand navigation items based on the ordering of <em>item</em> tags within the
+organization section.</p>
+<p>An example of how to write an organizations section that eduCommons can read is
+given below. Notice how the default organization section is set, and how unique
+identifiers are used to link the item to the resource in the resources section.</p>
+<p>The IMS CP specification requires that any id value use be unique to the manifest,
+otherwise anything can be used.</p>
+<pre class="literal-block">
+&lt;oganizations default=&quot;ORG1234&quot;&gt;
+    &lt;organization identifier=&quot;ORG1234&quot;&gt;
+        &lt;item identifier=&quot;ITM1234&quot; identifierref=&quot;RES1234&quot; isVisible=&quot;true&quot;&gt;
+            &lt;title&gt;
+                Hello World
+            &lt;/title&gt;
+        &lt;/item&gt;
+        ...
+    &lt;/organization&gt;
+&lt;/organizations&gt;
+&lt;resources&gt;
+    &lt;resource identifier=&quot;RES1234&quot;&gt;
+       ...
+    &lt;/resource&gt;
+    ...
+&lt;/resources&gt;
+</pre>
+</div>
+<div class="section" id="setting-metadata-on-educommons-enabled-ims-content-packages">
+<h1>Setting Metadata on eduCommons Enabled IMS Content Packages</h1>
+<p>eduCommons stores metadata for every content object entered into its repository.
+In order to write a content package that eduCommons can process, it is necessary
+to include a metadata section for every resource specified in the manifest.</p>
+<p>It is also important to note that eduCommons currently will not read top level
+metadata sections, nor will it support nested manifests within IMS Content
+Packages. Support for nested manifests, and non eduCommons content packages
+are currently listed as future eduCommons features.</p>
+<p>An example of how to lay out your manifest section to be eduCommons friendly is
+given below.</p>
+<pre class="literal-block">
+&lt;manifest&gt;
+    &lt;organizations&gt;
+        &lt;organization&gt;
+        &lt;/organization&gt;
+    &lt;/organizations&gt;
+    &lt;metadata&gt;
+        ... any metadata specified here is ignored by eduCommons ...
+    &lt;/metadata&gt;
+    &lt;resources&gt;
+        &lt;resource&gt;
+            &lt;metadata&gt;
+               ... metadata specified here is used to apply metadata
+                   to content objects ...
+            &lt;/metadata&gt;
+            &lt;file href=&quot; ... used by eduCommons to name the content object
+                             and find it within the package ...&quot;/&gt;
+        &lt;/resource&gt;
+        ...
+    &lt;/resources&gt;
+    &lt;manifest&gt;
+        ... nested manifests are not currently supported by eduCommons,
+            but may be at a future date ...
+    &lt;/manifest&gt;
+&lt;/manifest&gt;
+</pre>
+</div>
+<div class="section" id="the-educommons-course-object">
+<h1>The eduCommons Course Object</h1>
+<p>The eduCommons course object is different to other content objects in that
+it has extra requirements. eduCommons represents courses as both a document
+and a container for content objects. This means in an IMS Manifest it will
+appear as a content object that is connected to an HTML file (used to
+render the front course page) and is also a folder which contains  all content
+related to the course. It appears in the manifest as both.</p>
+<p>Courses also have additional metadata associated with them in the eduCommons
+specific metadata section. This extra metadata is specified in a further section
+below.</p>
+<p>Each manifest should specify a course object as the initial resource.</p>
+</div>
+<div class="section" id="lom-metadata-fields-read-by-educommons-on-import">
+<h1>LOM Metadata Fields Read By eduCommons on Import</h1>
+<p>eduCommons uses Dublin Core fields to store metadata internally. In order to
+be able to support IEEE LOM metadata standards in IMS Content Packages, some
+mapping between metadata standards must be done. Not all LOM metadata fields
+are supported, and although eduCommons may populate some of these extra fields
+on output, it only supports reading data from the following fields:</p>
+<div class="section" id="general">
+<h2>1. General</h2>
+<div class="section" id="title">
+<h3>1.2 Title</h3>
+<p>eduCommons uses this field to set the title on an object. This field is
+required.</p>
+</div>
+<div class="section" id="language">
+<h3>1.3 Language</h3>
+<p>eduCommons uses the language setting to set the language of the content object
+and its metadata. eduCommons does not support setting language values on metadata
+or individual metadata fields. All LOM language attributes in &quot;langstring&quot; nodes
+are ignored by eduCommons. This field is optional, but recommended.</p>
+</div>
+<div class="section" id="description">
+<h3>1.4 Description</h3>
+<p>eduCommons sets descriptions on content objects using this field. This field is
+optional, but recommended.</p>
+</div>
+<div class="section" id="keyword">
+<h3>1.5 Keyword</h3>
+<p>eduCommons supports the use of keywords for search purposes over content. It
+uses this LOM field. This field is optional.</p>
+</div>
+</div>
+<div class="section" id="lifecycle">
+<h2>2. Lifecycle</h2>
+<div class="section" id="contribute">
+<h3>2.3 Contribute</h3>
+<p>eduCommons supports a number of fields based on the LOM Contribute node.</p>
+<p>When the role in a contribute node is set to &quot;creator&quot;, eduCommons will
+set the eduCommons creator field to the name value in the VCARD of this
+section. When the role is set to &quot;creator&quot; it will also use the date field
+to set the creation date on the eduCommons content object.</p>
+<p>eduCommons will set its contributors field with the names listed in any other
+LOM based contribute nodes. The roles defined in additional LOM based contribute
+nodes are not read or stored by eduCommons.</p>
+<p>eduCommons also supports a number of eduCommons specific contribute nodes
+which are detailed in the next section.</p>
+</div>
+</div>
+<div class="section" id="other">
+<h2>Other</h2>
+<p>eduCommons may support a larger number of LOM fields in the future. The current
+supported set is likely to be expanded. However, attempts will be made to remain
+compatible with the above listed fields.</p>
+</div>
+</div>
+<div class="section" id="lom-based-educommons-metadata-fields">
+<h1>LOM Based eduCommons Metadata Fields</h1>
+<div class="section" id="the-rights-holder-field">
+<h2>The <em>rights holder</em> field</h2>
+<p>eduCommons supports setting a rights holder for every content object. However, it
+also supports setting content to use a site wide default, making it possible to
+set a default rights holder over the whole eduComomns site. To use the site wide
+default setting, use &quot;(site default)&quot; as the rights holder name.</p>
+<p>eduCommons will read an write the rights holder information in a <em>contribute</em>
+section in the LOM metadata section of an IMS content package. The <em>source</em>
+tag in this contribute section is set to &quot;eduCommonsv1.1&quot; signifying that this
+role is defined by eduCommons and is not a standard LOM role. An example of how
+the rights holder is given below. The date field can be set to a publication or
+creation date. It does not matter, as eduCommons does not use the date field in
+this section.</p>
+<pre class="literal-block">
+&lt;contribute&gt;
+    &lt;role&gt;
+        &lt;source&gt;
+            &lt;langstring xml:lang=&quot;en&quot;&gt;
+                eduCommonsv1.2
+            &lt;/langstring&gt;
+        &lt;/source&gt;
+        &lt;value&gt;
+            &lt;langstring xml:lang=&quot;en&quot;&gt;
+                rights holder
+            &lt;/langstring&gt;
+        &lt;/value&gt;
+    &lt;/role&gt;
+    &lt;centity&gt;
+        &lt;vcard&gt;
+            BEGIN:VCARD
+            FN: John Smith
+            END:VCARD
+        &lt;/vcard&gt;
+    &lt;/centity&gt;
+    &lt;date&gt;
+        &lt;datetime&gt;
+            2006-08-07 15:59:23
+        &lt;/datetime&gt;
+    &lt;/date&gt;
+&lt;/contribute&gt;
+</pre>
+<dl class="docutils">
+<dt>Note</dt>
+<dd>The VCARD Section In The Xml File Should Be Left Aligned, With No Whitespace In
+Order To Comply With VCARD Standards.</dd>
+</dl>
+</div>
+<div class="section" id="the-instructor-and-instructoremail-fields">
+<h2>The <em>Instructor</em> and <em>InstructorEmail</em> fields</h2>
+<p>The instructor field is also encoded in a LOM contribute node, similar to the
+rights holder field above. Things to note here are that eduCommons will read both
+the <em>FN:</em> and <em>EMAIL;INTERNET:</em> fields out of the VCARD, and use them to set
+the <em>Instructor</em> and <em>InstructorEmail</em> settings accordingly.</p>
+<pre class="literal-block">
+&lt;contribute&gt;
+    &lt;role&gt;
+        &lt;source&gt;
+            eduCommonsv1.2
+        &lt;/source&gt;
+        &lt;value&gt;
+            instructor
+        &lt;/value&gt;
+    &lt;/role&gt;
+    &lt;centity&gt;
+        &lt;vcard&gt;
+            BEGIN:VCARD
+            FN: John Smith
+            EMAIL;INTERNET: johnsmith&#64;somewhere.com
+            END:VCARD
+        &lt;/vcard&gt;
+    &lt;/centity&gt;
+    &lt;date&gt;
+        &lt;datetime&gt;
+            2006-08-07 15:59:23
+        &lt;/datetime&gt;
+    &lt;/date&gt;
+&lt;/contribute&gt;
+</pre>
+<dl class="docutils">
+<dt>Note</dt>
+<dd>The VCARD Section In The Xml File Should Be Left Aligned, With No Whitespace In
+Order To Comply With VCARD Standards.</dd>
+</dl>
+</div>
+</div>
+<div class="section" id="educommons-specific-metadata">
+<h1>eduCommons Specific Metadata</h1>
+<p>This section details eduCommons metadata that does not appear within the LOM
+metadata section. Instead it appears in a section following the LOM metadata as
+follows.</p>
+<pre class="literal-block">
+&lt;metadata&gt;
+    &lt;lom xmlns=&quot;http://www.imsglobal.org/xsd/imsmd_v1p2&quot;&gt;
+        &lt;general&gt;
+        &lt;/general&gt;
+        &lt;lifecycle&gt;
+        &lt;/lifecycle&gt;
+        ...
+    &lt;/lom&gt;
+    &lt;eduCommons xmlns=&quot;http://cosl.usu.edu/xsd/eduCommonsv1.2&quot;&gt;
+       &lt;objectType&gt;
+       &lt;/objectType&gt;
+       ...
+    &lt;/eduCommons&gt;
+&lt;/metadata&gt;
+</pre>
+<p>The following section describes the tags supported by eduCommons in detail.</p>
+</div>
+<div class="section" id="educommons-metadata-tags">
+<h1>eduCommons Metadata Tags</h1>
+<div class="section" id="the-objecttype-tag">
+<h2>The <em>objectType</em> tag</h2>
+<p>The <em>objectType</em> tag is used to signify what type of content object eduCommons
+should create for the given resource. Possible values are Course, Document,
+File, Image, or Link. This field is required. HTML or plain text resources
+should use the document setting. Images should use the image setting. All other
+resources should use the File setting, unless they are an external link. If
+a resource is in HTML format and represents a course home page, use the Course
+setting and make sure the resource appears first in the manifest resources
+section.</p>
+<pre class="literal-block">
+&lt;objectType&gt;
+    Course
+&lt;/objectType&gt;
+</pre>
+</div>
+<div class="section" id="the-copyright-tag">
+<h2>The <em>copyright</em> tag</h2>
+<p>The <em>copyright</em> tag is used by eduCommons to license content objects. It also uses
+the field to render copyright bylines for objects. The field should specify both
+the copyright and the date. e. g. &quot;Copyright 2006&quot;. This field is optional. If
+it is not included, the site default copyright string will be used instead.</p>
+<pre class="literal-block">
+&lt;copyright&gt;
+    Copyright 2006
+&lt;/copyright&gt;
+</pre>
+</div>
+<div class="section" id="the-license-tag">
+<h2>The <em>license</em> tag</h2>
+<p>The license tag is used to assign a copyright license to a content object. It
+is also used to render a copyright byline for an object.</p>
+<p>The license field supports four parameters:</p>
+<ul class="simple">
+<li>License Cateogory</li>
+<li>License Name</li>
+<li>License URL</li>
+<li>License Icon URL</li>
+</ul>
+<p>The category field appears as an attribute in the <em>license</em> tag, and must be
+set to one of the following:</p>
+<ul class="simple">
+<li>(site default)</li>
+<li>All Rights Reserved</li>
+<li>GNU Free Document License</li>
+<li>Creative Commons License</li>
+<li>Other</li>
+</ul>
+<p>The category field is also used as a label by eduCommons to allow a user to
+select a copyright license for a content object. It is a required field.</p>
+<p>The <em>licenseName</em> tag is used to identify the name of the license. This name
+will be used in the copyright byline, and should slot into the following sentence:
+This resource is licensed under a ____________. This is an optional field only
+if &quot;(site default)&quot; is chosen. Otherwise it must be specified.</p>
+<p>The <em>licenseUrl</em> tag is used to specify a public web site where the legal definition
+of the license is displayed. It allows the license name in the copyright byline to
+be linked directly to the definition. It is optional.</p>
+<p>The <em>licenseIconUrl</em> tag is used to specify a public icon image that represents
+the content license. This field is optional, and likely not to be included, unless
+the license includes a representative icon. An example where you would want
+to include this field would be to specify a creative commons icon along with
+the license.</p>
+<p>Below is an example of how the license field would be encoded within the eduCommons
+metadata.</p>
+<pre class="literal-block">
+&lt;license category=&quot;Creative Commons License&quot;&gt;
+    &lt;licenseName&gt;
+        Attribution 2.5
+    &lt;/licenseName&gt;
+    &lt;licenseUrl&gt;
+        http://creativecommons.org
+    &lt;/licenseUrl&gt;
+    &lt;licenseIconUrl&gt;
+        http://creativecommons.org
+    &lt;/licenseIconUrl&gt;
+&lt;/license&gt;
+</pre>
+</div>
+<div class="section" id="the-clearedcopyright-tag">
+<h2>The <em>clearedCopyright</em> tag</h2>
+<p>The <em>clearedCoypright</em> field is used by eduCommons to keep track of whether or not
+a content object has been cleared for publication in an open content environment.
+It can be set to either &quot;true&quot; or &quot;false&quot;. This field is optional, and is set to
+&quot;false&quot; by default.</p>
+<pre class="literal-block">
+&lt;clearedCopyright&gt;
+    true
+&lt;/clearedCopyright&gt;
+</pre>
+</div>
+</div>
+<div class="section" id="course-related-metadata">
+<h1>Course related metadata</h1>
+<p>The following metadata is only applicable when the <em>objectType</em> field is set
+to Course. It contains metadata that is specific to course objects.</p>
+<div class="section" id="the-courseid-tag">
+<h2>The <em>courseId</em> tag</h2>
+<p>The <em>courseId</em> tag is used to identify the course catalog number at an institution.
+It is used by eduComomns to render a full title of a course. Although this tag not
+required, is highly recommended.</p>
+<pre class="literal-block">
+&lt;courseId&gt;
+    INST7000
+&lt;/courseId&gt;
+</pre>
+</div>
+<div class="section" id="the-term-tag">
+<h2>The <em>term</em> tag</h2>
+<p>The <em>term</em> tag is used by eduCommons to specify which term, or semester the course
+was taught in. It is used by eduCommons to render a full title of a course. Although
+this tag is not required, it is highly recommended.</p>
+<pre class="literal-block">
+&lt;term&gt;
+    Fall 2005
+&lt;/term&gt;
+</pre>
+</div>
+<div class="section" id="the-displayinstructoremail-tag">
+<h2>The <em>displayInstructorEmail</em> tag</h2>
+<p>The <em>displayInstructorEmail</em> tag is used to specify whether or not an Instructor's
+Email address should be published or not. It can be set to &quot;true&quot; or &quot;false&quot;.
+This tag is optional and defaults to &quot;false&quot;.</p>
+<pre class="literal-block">
+&lt;displayInstructorEmail&gt;
+    false
+&lt;/displayInstructorEmail&gt;
+</pre>
+</div>
+</div>
+<div class="section" id="example-ims-content-packages">
+<h1>Example IMS Content Packages</h1>
+<p>You can create example IMS packages by building content in eduCommons and then
+use the IMS export functionality to export them. This feature can be useful
+in figuring out how to write compatible packages.</p>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="IMSContentPackaging.txt">View document source</a>.
+Generated on: 2009-01-14 23:51 UTC.
+Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/INSTALL.html
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/INSTALL.html	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/INSTALL.html	(revision 126)
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!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">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<title>eduCommons 3.1.1-final Installation</title>
+<link rel="stylesheet" href="./default.css" type="text/css" />
+</head>
+<body>
+<div class="document" id="educommons-3-1-1-final-installation">
+<h1 class="title">eduCommons 3.1.1-final Installation</h1>
+<h2 class="subtitle" id="installation-instructions">Installation Instructions</h2>
+
+<div class="section" id="installation">
+<h1>Installation</h1>
+<p>This section describes how to install a server based instance of eduCommons on
+a UNIX based platform (linux, OSX).</p>
+<p>Installation involves the following packages:</p>
+<blockquote>
+<ul class="simple">
+<li>Python-2.4.4.tar.gz (<a class="reference external" href="http://python.org/2.4.4/">http://python.org/2.4.4/</a>)</li>
+<li>Zope-2.10.5-final.tar.gz (<a class="reference external" href="http://www.zope.org/Products/Zope/2.10.5">http://www.zope.org/Products/Zope/2.10.5</a>)</li>
+</ul>
+</blockquote>
+<p>Python library packages:</p>
+<blockquote>
+<ul class="simple">
+<li>Imaging-1.1.6.tar.gz (<a class="reference external" href="http://www.pythonware.com/products/pil/">http://www.pythonware.com/products/pil/</a>)</li>
+<li>PyXML-0.8.4.tar.gz (<a class="reference external" href="http://sourceforge.net/project/showfiles.php?group_id=6473">http://sourceforge.net/project/showfiles.php?group_id=6473</a>)</li>
+<li>elementtree-1.2.6.tar.gz (<a class="reference external" href="http://effbot.org/downloads/#elementtree">http://effbot.org/downloads/#elementtree</a>)</li>
+<li>libxml2-python-2.6.15.tar.gz (<a class="reference external" href="ftp://xmlsoft.org/libxml2/python/">ftp://xmlsoft.org/libxml2/python/</a>)</li>
+<li>Beautiful Soup 3.0.4 (<a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/download/">http://www.crummy.com/software/BeautifulSoup/download/</a>)</li>
+</ul>
+</blockquote>
+<p>Plone package:</p>
+<blockquote>
+<ul class="simple">
+<li>Plone-3.0.6.tar.gz (<a class="reference external" href="http://plone.org/products/plone/releases/3.0.6">http://plone.org/products/plone/releases/3.0.6</a>)</li>
+</ul>
+</blockquote>
+<p>eduCommons-related Packages:</p>
+<p>(Correct versions of these products are shipped in the eduCommons archive unless ohterwise noted)</p>
+<blockquote>
+<ul class="simple">
+<li>eduCommons (3.1.0-final)</li>
+<li>leftskin (1.0.2-final)</li>
+<li>ContentLicensing (2.0.0)</li>
+<li>ZipFileTransport (2.0.1)</li>
+<li>IMSTransport (2.0.1)</li>
+<li>PloneBookmarklets (2.0.0)</li>
+<li>ProxyIndex (1.2.1)</li>
+<li>FileSystemStorage (2.6.2)</li>
+<li>LinguaPlone (2.0)</li>
+<li>easy_install (download here: <a class="reference external" href="http://peak.telecommunity.com/dist/ez_setup.py">http://peak.telecommunity.com/dist/ez_setup.py</a>)</li>
+<li>collective.captcha (installed via easy_install)</li>
+</ul>
+</blockquote>
+<div class="section" id="i-installation-steps">
+<h2>I. Installation Steps</h2>
+<ol class="arabic">
+<li><p class="first">Installing Python:</p>
+<p>It is likely that the Python programming language is already installed on
+your server. Try typing:</p>
+<pre class="literal-block">
+$ python
+</pre>
+<p>on the command line to see what version you have installed (Ctrl-D will exit).
+You should see something like the following:</p>
+<pre class="literal-block">
+Python 2.4.4 (#1, Oct  7 2006, 21:17:24)
+[GCC 3.4.6 20060404 (Red Hat 3.4.6-3)] on linux2
+Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
+&gt;&gt;&gt;
+</pre>
+<p>eduCommons and its supporting software requires version 2.4.4. If your server
+does not have Python, or if the version of Python installed is not 2.4.4, you
+will have to install a new version.</p>
+<p>Some platforms may have an updated version of Python available through their
+package managers (yum, apt, fink). If you can not find a suitable version, or
+if you prefer to build Python from source, simply download the source package
+and use a command line interface to type in the following instructions:</p>
+<pre class="literal-block">
+tar -zxvf Python-2.4.4.tar.gz
+cd Python-2.4.4
+./configure
+make
+sudo make install
+</pre>
+<p>By default this will install a new version of Python in the /usr/local directory
+on your server.</p>
+</li>
+<li><p class="first">Installing Python library packages</p>
+<p>Once you have Python installed it will be necessary to include a number of
+libraries that extend the functionality of your Python installation. If you
+have installed Python using a package manager, it may be likely that some
+(or all) of these packages may also be available for installation. As long
+as suitable library versions can be found, it should be fine to use them. In
+cases where it is not possible to load prebuilt packages, use the following
+instructions below:</p>
+<ol class="loweralpha">
+<li><p class="first">Installing Python Imaging Libary (PIL)</p>
+<p>PIL is now a required package for the latest version of Plone.</p>
+<p>Unpack and install Imaging-1.1.6:</p>
+<pre class="literal-block">
+tar -zxvf Imaging-1.1.6.tar.gz
+cd Imaging
+/usr/local/bin/python setup.py build
+sudo /usr/local/bin/python setup.py install
+</pre>
+<p>You may require additional packages to build the imaging library. See
+the PIL website for additional installation instructions.</p>
+</li>
+<li><p class="first">Installing PyXML</p>
+<p>Unpack and install PyXML:</p>
+<pre class="literal-block">
+tar -zxvf PyXML-0.8.4.tar.gz
+cd PyXML-0.8.4
+/usr/local/bin/python setup.py build
+sudo /usr/local/bin/python setup.py install
+</pre>
+</li>
+<li><p class="first">Installing elementtree</p>
+<p>elementtree is now a required dependency for the latest version of Plone.</p>
+<p>Unpack and install elementtree:</p>
+<pre class="literal-block">
+tar -zxvf elementtree-1.2.6.tar.gz
+cd elementtree-1.2.6
+/usr/local/bin/python setup.py build
+sudo /usr/local/bin/python setup.py install
+</pre>
+</li>
+<li><p class="first">Installing libxml2-python</p>
+<p>If your target platform includes binary only distributions of libxml2 and
+libxslt, you may need to also include the development packages in order for
+the following to work.</p>
+<p>Unpack and install libxml2-python:</p>
+<pre class="literal-block">
+tar -zxvf libxml2-python-2.6.15.tar.gz
+cd libxml2-python-2.6.15
+/usr/local/bin/python setup.py build
+sudo /usr/local/bin/python setup.py install
+</pre>
+</li>
+<li><p class="first">Install Beautiful Soup</p>
+<p>Unpack and install Beautiful Soup 3.0.4 into your python library.</p>
+<pre class="literal-block">
+tar -zxvf BeautifulSoup-3.0.4.tar.gz
+cd BeautifulSoup-3.0.4
+/usr/local/bin/python setup.py build
+sudo /usr/local/bin/python setup.py install
+</pre>
+</li>
+</ol>
+</li>
+</ol>
+<blockquote>
+<ol class="loweralpha" start="6">
+<li><p class="first">Install Easy Install</p>
+<blockquote>
+<p>Easy Install (easy_install) is a python module bundled with setuptools
+that lets you automatically download, build, install, and manage Python packages.</p>
+<p>Download <a class="reference external" href="http://peak.telecommunity.com/dist/ez_setup.py">http://peak.telecommunity.com/dist/ez_setup.py</a> and install it using the
+correct version of python:</p>
+<pre class="literal-block">
+/usr/local/bin/python ez_setup.py
+</pre>
+</blockquote>
+</li>
+</ol>
+<blockquote>
+<ol class="loweralpha" start="7">
+<li><p class="first">Install collective.captcha</p>
+<p>collective.captcha is a Python package that is installable via Easy Install</p>
+<pre class="literal-block">
+/usr/local/bin/easy_install collective.captcha
+</pre>
+</li>
+</ol>
+</blockquote>
+</blockquote>
+<ol class="arabic" start="3">
+<li><p class="first">Installing Zope</p>
+<p>Unpack, build and install Zope:</p>
+<pre class="literal-block">
+tar -zxvf Zope-2.10.5-final.tar.gz
+cd Zope-2.10.5-final
+./configure --with-python=/usr/local/bin/python --prefix /opt/Zope-2.10.5
+make
+sudo make install
+</pre>
+</li>
+<li><p class="first">Create a Zope instance</p>
+<p>Create an instance in your Zope install:</p>
+<pre class="literal-block">
+sudo /opt/Zope-2.10.5/bin/mkzopeinstance.py
+</pre>
+<p>When prompted for a directory enter in the following:</p>
+<pre class="literal-block">
+/opt/Zope-2.10.5/web
+</pre>
+<p>You can substitute the <em>web</em> directory for a name that better describes your site.
+The documentation will assume that you have chosen web as your instance directory.</p>
+<p>When prompted for a username and password, enter in the username/password you will
+use for managing your Zope instance.</p>
+</li>
+<li><p class="first">Install Zope Products</p>
+<p>eduCommons relies on several Zope products in order to run. You will need to install
+the following packages in the following order. The commands listed below assume that
+you have the source tarballs in the root of your home account:</p>
+<ol class="loweralpha">
+<li><p class="first">Plone-3.0.6</p>
+<p>Install Plone into your Zope instance Products folder.lib/python directory</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/Products
+sudo tar -zxvf ~/Plone-3.0.6.tar.gz
+</pre>
+<p>Once you have unpacked Plone you need to move the products back up to the Products
+directory as follows:</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/Products
+sudo su
+cd Plone-3.0.6
+mv * ..
+cd ..
+sudo rm -rf Plone-3.0.6
+</pre>
+<p>The Plone tarball came with a lib/python directory. The contents of it need to go
+up one level, into the lib/python of your Zope install.</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/Products
+cp -r lib/* ../lib/
+sudo rm -rf /opt/Zope-2.10.5/web/Products/lib
+</pre>
+<p>The Plone tarball also contains a Products directory. The contents of it need to go
+up one level, into the web/Products directory of your Zope install.</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/Products
+cp -r Products/* ../Products/
+sudo rm -rf /opt/Zope-2.10.5/web/Products/Products
+</pre>
+</li>
+<li><p class="first">eduCommons</p>
+<p>This is the eduCommons product source package. To install use the following:</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/Products
+sudo tar -zxvf ~/eduCommons-3.1.1-final.tar.gz
+</pre>
+<p>eduCommons includes a number of products which need to be put in the root
+of the Products folder. To do this use the following:</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/Products
+sudo mv eduCommons-3.1.1-final/* .
+sudo rm -rf eduCommons-3.1.1-final
+</pre>
+<p>The products that now ship with eduCommons are as follows:</p>
+<ol class="arabic">
+<li><p class="first">eduCommons</p>
+<p>A Plone product which implements the core functionality of eduCommons.</p>
+</li>
+<li><p class="first">leftskin</p>
+<p>A Plone product which customizes the Plone layout.</p>
+</li>
+<li><p class="first">ContentLicensing</p>
+<p>A Plone product that adds the ability to set copyright licenses on content
+objects. Auto installed with the eduCommons product.</p>
+</li>
+<li><p class="first">ZipFileTransport</p>
+<p>A Plone product that adds the ability to import and export content via
+ZIP archives. Auto installed with the eduCommons product.</p>
+</li>
+<li><p class="first">IMSTransport</p>
+<p>A Plone product that imports and exports contents in IMS content packages.
+Auto installed with the eduCommons product.</p>
+</li>
+<li><p class="first">PloneBookmarklets</p>
+<p>A Plone product that adds the ability to integrate documents with popular social
+bookmarking sites.</p>
+</li>
+<li><p class="first">ProxyIndex</p>
+<p>ProxyIndex is a plugin to zope catalog index.</p>
+</li>
+<li><p class="first">FileSystemStorage</p>
+<p>FileSystemStorage is a product that provides the framework for content types to store data
+directly on the filesystem, rather than in the ZODB.</p>
+</li>
+<li><p class="first">LinguaPlone</p>
+<p>A tool to manage and maintain multilingual Plone content.</p>
+</li>
+</ol>
+</li>
+</ol>
+</li>
+<li><p class="first">Configure your Zope site</p>
+<p>Now that all the necessary Zope products are installed it is time to clean up and
+configure the site. The first task is to create a zope user and group in which
+zope can run under. This can be done via the following:</p>
+<pre class="literal-block">
+sudo /usr/sbin/groupadd zope
+sudo /usr/sbin/adduser -g zope -s /bin/false -d /opt/Zope-2.10.5 zope
+</pre>
+<p>Once that is done we can now set the proper permissions needed for Zope to run
+securely. This can be done via the following:</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/Products
+sudo chgrp -R zope *
+sudo chmod go-w *
+</pre>
+<p>FileSystemStorage comes with its own documentation and we recommend you read it
+(/opt/Zope-2.10.5/web/Products/FileSystemStorage/README.txt). Create folders for
+storage and backup. We suggest setting things up in the following way:</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/var
+mkdir fss_storage
+mkdir fss_backup
+</pre>
+<p>Now edit the filesystemstorage.conf.in configuration file for FileSystemStorage located
+in /opt/Zope-2.10.5/web/Products/FileSystemStorage/etc. There are several configuration
+options here (see README.txt), but most can be left at the default. We suggest a
+hierarchical file structure, which can be set up by uncommenting and editing this line:</p>
+<pre class="literal-block">
+# storage-strategy flat
+change to:
+storage-strategy site1
+</pre>
+<p>Zope needs to be able to write to the log directory, and its database files. To
+enable this enter the following:</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web
+sudo chgrp -R zope log var
+sudo chmod -R g+w log var
+</pre>
+<p>The last bit of configuration that needs to be done is to edit the zope.conf file.
+found in the <em>etc/</em> directory of your Zope Instance. Uncomment and edit the
+following settings:</p>
+<pre class="literal-block">
+effective-user zope
+</pre>
+<p>And set the default port you want the Zope server to run on:</p>
+<pre class="literal-block">
+&lt;http-server&gt;
+  # valid keys are &quot;address and &quot;force-connection-close&quot;
+  address 8080
+  # force-connection-close on
+&lt;/http-server&gt;
+</pre>
+</li>
+<li><p class="first">Apply Security Patch</p>
+<p>Plone's Security Panel is broken for Products that add Roles that come alphabetically
+before 'Anonymous'. eduCommons adds the Administrator Role, which breaks the Security
+Panel.  This is a documented bug (<a class="reference external" href="http://dev.plone.org/plone/ticket/7690">http://dev.plone.org/plone/ticket/7690</a>).</p>
+<p>In order to remedy this problem, apply the patch found in the eduCommons/extras folder.
+Copy the patch to /opt/Zope-2.10.5/web/lib/python/plone/app/controlpanel.</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web/lib/python/plone/app/controlpanel
+cp /opt/Zope-2.10.5/web/Products/eduCommons/extras/plone.app.controlpanel.security.py.patch .
+</pre>
+<p>Apply the patch by running the following command:</p>
+<pre class="literal-block">
+patch -p0 &lt; plone.app.controlpanel.security.py.patch
+</pre>
+<p>You may get this message: &quot;can't find file to patch at input line 1 Perhaps you used
+the wrong -p or --strip option? File to patch:&quot; Enter the following:</p>
+<pre class="literal-block">
+security.py
+</pre>
+</li>
+<li><p class="first">Overwrite Kupu's html2captioned transform</p>
+<p>Kupu allows for dynamically generated captions on inserted images. eduCommons utilizes
+this feature to provide license and copyright holder information for embedded images
+in documents.  In order for this functionality to occur, the default transformation
+must be customized</p>
+<pre class="literal-block">
+cp /opt/Zope-2.10.5/web/Products/eduCommons/extras/html2captioned.py /opt/Zope-2.10.5/web/Products/kupu/plone
+</pre>
+</li>
+</ol>
+</div>
+<div class="section" id="ii-configuration-steps">
+<h2>II. Configuration Steps</h2>
+<ol class="arabic">
+<li><p class="first">Launch Zope</p>
+<p>Once Zope has been properly configured it can then be launched via the following
+commands:</p>
+<pre class="literal-block">
+cd /opt/Zope-2.10.5/web
+sudo bin/zopectl start
+</pre>
+<p>You should now be able to open a browser and go to the ZMI with the following URL
+(assuming that you configured Zope to run on port 8080)</p>
+<pre class="literal-block">
+http://&lt;server name&gt;:8080/manage
+</pre>
+<p>You should then get a dialog prompt asking for your Zope admin username and password.</p>
+</li>
+<li><p class="first">Install eduCommons Product</p>
+<p>Once you have logged into the ZMI via the management interface, you are now ready
+to create the site. Start by creating a plone site with the pull down menu in the
+top right corner. Give the plone site an ID and title. The ID will be used in the
+URL to access the site, so name it appropriately. The title will appear several
+places within the eduCommons install, and should be based on your group or institution.</p>
+<p>Under &quot;Extension Profiles&quot; you need to do a multi-select (hold down the CTRL or the
+Apple key). Select Working Copy Support (Iterate), ContentLicensing, IMSTransport, LinguaPlone,
+PloneBookmarklets, Zip File Transport, eduCommons, and Left Skin so they are all highlighted.
+Then click &quot;Add Plone Site.&quot;</p>
+<p>Once the eduCommons instance has been created, you will need to QuickInstall the FileSystemStorage Product.
+In the ZMI:</p>
+<pre class="literal-block">
+1. Navigate to your eduCommons instance
+2. Navigate to portal_quickinstaller
+3. Select the checkbox to the left of FileSystemStorage
+4. Click Install
+</pre>
+<p>If you wish to localize content in other languages you will need to QuickInstall install LinguaPlone.
+This can be done either now from the ZMI or later, via Site Setup --&gt; Add-on Products.
+In the ZMI:</p>
+<pre class="literal-block">
+1. Navigate to your eduCommons instance
+2. Navigate to portal_quickinstaller
+3. Select the checkbox to the left of LinguPlone
+4. Click Install
+</pre>
+<p>If you have installed LinguaPlone you will also need to select your supported languages.
+In the ZMI:</p>
+<pre class="literal-block">
+1. Navigate to your eduCommons instance
+2. Navigate to portal_languages
+3. Select one or more Allowed languages (use the control or apple key to multi-select)
+4. Click Save
+</pre>
+<p>Additional instructions for localizing content using LinguaPlone are available in LOCALIZATION.txt.</p>
+<p>Finally, you need to reorder the Layers in your eduCommons Skins Selections.
+In the ZMI:</p>
+<pre class="literal-block">
+1. Navigate to your eduCommons instance
+2. Navigate to portal_skins
+3. Click on the Properties tab
+4. Under the Skins Selections, in the Layers textbox for LeftSkin, cut the LinguaPlone entry
+   and paste it one a new line below the eduCommons entry
+5. Click Save (be sure to click the Save button for the Skins selection section)
+</pre>
+</li>
+<li><p class="first">Configure eduCommons</p>
+<p>Additional configuration information is provided in SETUP.txt (or online at
+<a class="reference external" href="http://cosl.usu.edu/projects/educommons/documentation/how-to/educommons-setup-instructions">http://cosl.usu.edu/projects/educommons/documentation/how-to/educommons-setup-instructions</a>).
+This will help you to further customize eduCommons.</p>
+</li>
+</ol>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="INSTALL.txt">View document source</a>.
+Generated on: 2009-01-14 23:51 UTC.
+Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/LOCALIZATION.html
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/LOCALIZATION.html	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/LOCALIZATION.html	(revision 126)
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!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">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<title></title>
+<link rel="stylesheet" href="./default.css" type="text/css" />
+</head>
+<body>
+<div class="document">
+
+
+<div class="section" id="linguaplone-translation-instructions">
+<h1>LinguaPlone Translation Instructions</h1>
+<p>In the context of Department, Course, and ECObjects, translations must occur in a 'top down'
+manner.  A Department must be translated prior to translating a Course, which must be
+translated prior to any objects in the Course being translated.</p>
+<p>By default, LinguaPlone will tag newly created content objects in the default language setting
+for the instance. Objects that exist in the ZODB prior to LinguaPlone being installed will be
+'neutral', in terms of their language setting. In order to maintain the correct relationships
+between languages, existing objects must have their language 'set'.</p>
+<p>To set an existing object's language, click translate into on the management toolbar, and then
+click manage translations.... This interface will allow you to change the content language
+setting from neutral to the appropriate setting for your instance.</p>
+</div>
+<div class="section" id="localization-with-educommons-3-1-1-final">
+<h1>Localization with eduCommons 3.1.1-final</h1>
+<div class="section" id="overview">
+<h2>Overview</h2>
+<p>If you want to translate eduCommons into your language, here are instructions on how to get
+started, as well as some guidelines that you should follow when performing a translation. You do
+not need to know anything about programming to create an eduCommons translation. This
+has been adapted for eduCommons from the <a class="reference external" href="http://plone.org/development/teams/i18n/translators-guidelines">plone translator guidelines</a>. Please see our <a class="reference external" href="./educommons-localization-team">eduCommons
+Localization Team page</a> for a list of our volunteer translators.</p>
+</div>
+<div class="section" id="introduction">
+<h2>Introduction</h2>
+<p>Since eduCommons is customized from Plone, it has built-in support for internationalization. As of
+June 2006 Plone has 56 different translations. eduCommons requires some additional
+translation work, but follows the same process as Plone. Adding an eduCommons translation is much
+less time consuming because most of the translation work has already been done in Plone.</p>
+<p>There are about 400 strings needed for a translation of eduCommons (compared to about 1600 strings
+for a Plone translation). Some of these are sentences or paragraphs, but the major part are one or
+two words. These strings are scattered around in Plone, for example in page templates. Other items
+to translate are widget labels, and workflow states. All those strings are collected in master
+files. Currently eduCommons contains six .pot files. Each language requires its own .po files that
+corresponds to the strings or message ids declared in the .pot files. The .pot is the blueprint for
+the .po files.</p>
+</div>
+<div class="section" id="tools">
+<h2>Tools</h2>
+<p>When creating the .po files, we strongly recommend using a specialized tool called poEdit
+(<a class="reference external" href="http://www.poedit.net">http://www.poedit.net</a>). This makes the translation process very easy. But a normal
+text editor work fine if you prefer that (both vim and emacs are great for this, and have special
+modes for PO files). poEdit exists for both Linux and Windows, and Mac OS X.</p>
+<p>If you use a plain text editor instead of a dedicated tool, you should make sure you use utf-8
+as your charset, even if your country usually uses iso-8859-* or similar. The reason for this is
+that Plone uses a few characters (like the ellipsis) that don't have representations in other
+charsets.</p>
+</div>
+<div class="section" id="step-by-step-guide">
+<h2>Step-by-step guide</h2>
+<blockquote>
+<p>1. Check if somebody is working on your language already. Even if they do, contact them and
+offer to help with testing. There's no way the eduCommons team can know what is a high-quality
+translation in a language they don't know, so your input is very valuable to us. We want
+good translations, not just a translation. So if you think something is badly done, tell us.
+Give polite feedback if something feels wrong with the translation to your language. A
+translation can always be made better.</p>
+<p>2. Be sure that you have used eduCommons enough to grasp the general concepts and how they
+interact. eduCommons is an advanced system, so be sure you know enough before you start
+translating key concepts like workflow. Check the language specific terms for your language,
+or create one if it doesn't exist. This will help you keep consistent translations for your
+language.</p>
+<p>3. Download the files to base your translation on. We recommend that you always use the
+English language files as your starting point, both because they are always the most current
+ones (other translations will usually lag a bit behind), and because you should try to match
+the original text. Translating between similar languages may be tempting (like Danish and
+Norwegian), but will usually result in a lower quality translation. Of course, if the only
+language you understand is Italian, and you want to provide a Chinese translation, we prefer
+this translation compared to not getting one at all :)</p>
+<p>4. Here is a link to the most recent translation files available for eduCommons (plone.po and
+eduCommons.po). Remember, unless there is already an existing translation available, you need
+to grab the .pot files.</p>
+<blockquote>
+<p><a class="reference external" href="http://cosl.usu.edu/svndev/eduCommons3/trunk/i18n/">http://cosl.usu.edu/svndev/eduCommons3/trunk/i18n/</a></p>
+<p>Here are links to the latest translations for each of the eduCommons products on the Plone
+Collective site (these links may change, so check back for the most accurate information):</p>
+<p><a class="reference external" href="http://svn.plone.org/svn/collective/ZipFileTransport/branches/cosl-plone3/i18n/">http://svn.plone.org/svn/collective/ZipFileTransport/branches/cosl-plone3/i18n/</a></p>
+<p><a class="reference external" href="http://svn.plone.org/svn/collective/IMSTransport/branches/cosl-plone3/i18n/">http://svn.plone.org/svn/collective/IMSTransport/branches/cosl-plone3/i18n/</a></p>
+<p><a class="reference external" href="http://svn.plone.org/svn/collective/ContentLicensing/branches/cosl-plone3/i18n/">http://svn.plone.org/svn/collective/ContentLicensing/branches/cosl-plone3/i18n/</a></p>
+<p><a class="reference external" href="http://svn.plone.org/svn/collective/PloneBookmarklets/branches/plone3/i18n/">http://svn.plone.org/svn/collective/PloneBookmarklets/branches/plone3/i18n/</a></p>
+</blockquote>
+<p>5. Open poEdit or your editor of choice and load the first of the master files. In poEdit
+select File --&gt; Open (for existing .po translation files) or File --&gt; New catalog from POT file.
+(to create a new translation from a .pot file). Be sure to set the language and language code in
+Catalog --&gt; Settings. With poEdit or other editors you will need to save your new translation files
+as &lt;product&gt;-&lt;language-code&gt;.po (e.g. for a French translation: plone-fr.po, eduCommons-fr.po, etc).
+Have a look at <a class="reference external" href="http://www.i18nguy.com">http://www.i18nguy.com</a> for the correct language code.</p>
+<p>6. In poEdit, the first line shows the exact string that you have to translate. Your translation is
+entered in the area below the original string. It's easy. This is why we recommend poEdit.</p>
+<ol class="arabic simple" start="7">
+<li>In other text editors things will look a little different. An example section can look like this:</li>
+</ol>
+<blockquote>
+<div class="line-block">
+<div class="line">#. Default: &quot;Export&quot;</div>
+<div class="line">#: ../skins/eduCommons/Export_form.cpt</div>
+<div class="line">msgid &quot;Export&quot;</div>
+<div class="line">msgstr &quot;&quot;</div>
+<div class="line"><br /></div>
+</div>
+<p>The first line (marked with Default) shows the exact string that you have to translate.
+Message attributes in the form ${foo} have to be included in the translated string exactly
+as they are. These are variables that will be filled in the rendering process. Do not touch
+this.</p>
+<p>The next lines (marked with :) list which templates inside eduCommons use this string. There
+might be several templates re-using the same string, but it is normally in the same context.
+Do not touch this.</p>
+<p>The next to last line (starting with msgid) holds the unique identifier for the string. Do
+not touch this.</p>
+<p>Finally, the last line is where your job starts. Enter the text in your language, be careful
+to keep the same casing (where appropriate, some languages have different rules that should
+be applied).</p>
+</blockquote>
+<p>8. If there is programming code in a string, only translate the string, not the code. For example in,
+Default: &quot;${number} items matching your criteria.&quot; you would only translate &quot;items matching your
+criteria.&quot; The code in the first part should be left as it is, so the translation will look like this:
+${number} TRANSLATION.</p>
+<p>9. Keep translating (but take breaks, this isn't done in one sitting - it's repetetive (but
+rewarding) work. After you have translated all of plone.pot, you should start on eduCommons.pot.
+Don't worry, you have already completed the biggest part.</p>
+<p>10. If you can, test your files. Get other people from your own country to test. This means having other
+people check your file and putting your file in an eduCommons test instance, browsing it in
+your language.</p>
+<p>11. If you are unsure about the best translation of a message, you can set it to fuzzy, so
+others can look at these. Setting a message to fuzzy means adding a &quot;#, fuzzy&quot;-line directly
+above the line starting with msgid (poEdit has a button for this).</p>
+<p>12. Since some of the translation files are hosted on the Plone Collective, if you know how SVN
+works, you can get an account with Plone (Here's how to request write access to the Collective.)
+and maintain the files in SVN yourself (see next section). If not, no problem, just e-mail your
+translation to us at eduCommons [at] cosl [dot] usu [dot] edu, and we will add it for you and put it into the
+eduCommons distribution in the next release. We will also add you to our our <a class="reference external" href="./educommons-localization-team">eduCommons
+Localization Team page.</a></p>
+<p>13. Please check on your translations periodically to keep them updated as new versions are
+released. A quick find for &quot;&quot; will reveal any new or missing stings that need to be translated.</p>
+<p>14. If you have other questions or about contributing a translation to eduCommons please contact
+us at educommons [at] cosl [dot] usu [dot] edu. Thank you for you help!</p>
+</blockquote>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="LOCALIZATION.txt">View document source</a>.
+Generated on: 2009-01-14 23:51 UTC.
+Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/MIGRATION.html
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/MIGRATION.html	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/MIGRATION.html	(revision 126)
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!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">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<title>Migrating to eduCommons 3.1.1-final</title>
+<link rel="stylesheet" href="./default.css" type="text/css" />
+</head>
+<body>
+<div class="document" id="migrating-to-educommons-3-1-1-final">
+<h1 class="title">Migrating to eduCommons 3.1.1-final</h1>
+
+<div class="section" id="preparation">
+<h1>Preparation</h1>
+<p>A few things you should do before beginning the migration:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>VERY IMPORTANT: SAVE A BACKUP OF YOUR Data.fs FILE, which is located in the [old instance home]/var directory of your eduCommons site. This file contains all of the content for your site. (This way you will able to restore your file from this Data.fs file if anything goes wrong.)</li>
+<li>Using the Zope Management Interface (ZMI), export any customizations you have made in your [old site] --&gt; portal_skins --&gt; custom folder and then delete all files in the custom folder. You can re-import these customizations once you have migrated the site.</li>
+<li>Verify that your current instance is eduCommons-3.0.2-final.</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="migration-of-educommons-3-0-2-final-to-3-1-1-final">
+<h1>Migration of eduCommons 3.0.2-final to 3.1.1-final</h1>
+<p>The migration eduCommons from version 3.0.2-final to version 3.1.1-final
+includes the following:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Movement of Data.fs file to a new 3.1.1-final instance</li>
+<li>Migration to Plone 3.0.6</li>
+<li>Migration to the eduCommons 3.1.1-final instance</li>
+<li>Final steps</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="movement-of-data-fs-file-to-a-new-3-1-1-final-instance">
+<h1>Movement of Data.fs file to a new 3.1.1-final instance</h1>
+<p>For the first step, you will move the Data.fs file from the old instance to
+the new instance. First of all, install an eduCommons-3.1.1-final
+instance using the installations instructions found in [new instance home]/eduCommons/docs/. Stop both sites. Then
+copy the Data.fs file from the var directory of the old site to the
+var directory of the new site:</p>
+<pre class="literal-block">
+sudo cp -rvfp [old instance home]/var/Data.fs [new instance home]/var/
+</pre>
+</div>
+<div class="section" id="migration-of-plone">
+<h1>Migration of Plone</h1>
+<p>The following steps need to be performed in the ZMI, as eduCommons-3.1.1-final utlizes Plone 3.0.6, instead of 3.0.4:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Open your 3.1.1-final eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)</li>
+<li>Run portal_migration migration (click the upgrade button on the migrate tab)</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="installation-of-filesystemstorage-product">
+<h1>Installation of FileSystemStorage Product</h1>
+<p>At this point in time, we need to ensure that the FileSystemStorage AddOn Product is installed:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Open your 3.1.1-final eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)</li>
+<li>Navigate to portal_quickinstaller</li>
+<li>Select FileSystemStorage</li>
+<li>Press Install</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="migration-of-the-educommons-3-1-1-final-instance">
+<h1>Migration of the eduCommons 3.1.1-final instance</h1>
+<p>eduCommons 3.1.1-final uses the portal_setup tool to perform the necessary upgrade from 3.0.2 to 3.1.1-final:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Open your 3.1.1-final eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)</li>
+<li>Navigate to portal_setup</li>
+<li>Press the 'Upgrades' tab</li>
+<li>From the drop down menu, select 'Products.eduCommons:default' and click Choose Profile button.</li>
+<li>Choose the 'Migration :: 3.0.2 to 3.1.0' option</li>
+<li>Press Upgrade</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="final-steps">
+<h1>Final Steps</h1>
+<blockquote>
+Your site should now be migrated. Navigate to your site in the browser and ensure it has migrated.</blockquote>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="MIGRATION.txt">View document source</a>.
+Generated on: 2009-01-14 23:51 UTC.
+Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/MIGRATIONS_OLD.html
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/MIGRATIONS_OLD.html	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/MIGRATIONS_OLD.html	(revision 126)
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!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">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<title>Migrating to eduCommons 3.0.2</title>
+<link rel="stylesheet" href="./default.css" type="text/css" />
+</head>
+<body>
+<div class="document" id="migrating-to-educommons-3-0-2">
+<h1 class="title">Migrating to eduCommons 3.0.2</h1>
+
+<div class="section" id="preparation">
+<h1>Preparation</h1>
+<p>A few things you should do before beginning the migration:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>VERY IMPORTANT: SAVE A BACKUP OF YOUR Data.fs FILE, which is located in the [old instance home]/var directory of your eduCommons site. This file contains all of the content for your site. (This way you will able to restore your file from this Data.fs file if anything goes wrong.)</li>
+<li>Using the Zope Management Interface (ZMI), export any customizations you have made in your [old site] --&gt; portal_skins --&gt; custom folder and then delete all files in the custom folder. You can re-import these customizations once you have migrated the site.</li>
+<li>Verify that your current instance is eduCommons-2.3.1-final.</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="migration-of-educommons-2-3-1-final-to-3-0-2">
+<h1>Migration of eduCommons 2.3.1-final to 3.0.2</h1>
+<p>The migration eduCommons from version 2.3.1-final to version 3.1.1-final
+includes the following:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Pre-migration of Data.fs in version 2.3.1-final</li>
+<li>Movement of Data.fs file to a new 3.0.2 instance</li>
+<li>Migration of Plone 3.0.4</li>
+<li>Migration of the eduCommons 3.1.1-final instance</li>
+<li>Final steps</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="pre-migration-of-data-fs-in-version-2-3-1-final">
+<h1>Pre-migration of Data.fs in version 2.3.1-final</h1>
+<p>For this step, you will need to copy the migration source code found in version 3.1.1-final.  The file is located at eduCommons/extras/PreMigrate.py .
+Copy this into [old instance]/Products/eduCommons/Extensions.</p>
+<p>Run the migration script by following these steps:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Open your 2.3.1-final eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)</li>
+<li>From the drop down menu, select &quot;External method&quot; and click the Add button.</li>
+<li>Enter the following parameters:<ul>
+<li>Id: Pre_Migrate_eduCommons3.0.2</li>
+<li>Title: Pre_Migrate_eduCommons3.0.2</li>
+<li>Module Name: eduCommons.Migrate</li>
+<li>Function Name: pre_migrate_2_3_1_to_3_0_2</li>
+</ul>
+</li>
+<li>Click Add</li>
+<li>Click on the Pre_Migrate_eduCommons3.0.2 script you just added</li>
+<li>Click the test tab.</li>
+<li>Verify that the method ran successfully. (It should give you feedback.)</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="movement-of-data-fs-file-to-a-new-3-0-2-instance">
+<h1>Movement of Data.fs file to a new 3.0.2 instance</h1>
+<p>For the next step you will move the Data.fs file from the old instance to
+the new instance. First of all, install an eduCommons-3.0.2
+instance using the installations instructions found in [new instance home]/eduCommons/docs/. Stop both sites. Then
+copy the Data.fs file from the var directory of the old site to the
+var directory of the new site:</p>
+<pre class="literal-block">
+sudo cp -rvfp [old instance home]/var/Data.fs [new instance home]/var/
+</pre>
+</div>
+<div class="section" id="migration-of-plone">
+<h1>Migration of Plone</h1>
+<p>The following steps need to be performed in the ZMI, as eduCommons-3.1.1-final utlizes Plone 3.0.4, instead of 2.5.x:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Open your 3.0.2 eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)</li>
+</ol>
+<ol class="arabic simple" start="3">
+<li>Run portal_migration migration (click the upgrade button on the migrate tab)</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="migration-of-the-educommons-3-0-2-instance">
+<h1>Migration of the eduCommons 3.0.2 instance</h1>
+<p>Run the migration script included with the 3.1.1-final instance by following these steps:</p>
+<blockquote>
+<ol class="arabic simple">
+<li>Copy the migration script found in Products/eduCommons/extras/Migrate.py to [new_instance]/Extensions/</li>
+<li>Open your 3.1.1-final eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)</li>
+<li>Navigate to the root of the ZMI (click the Root Folder link located in the upper left portion of the page)</li>
+<li>From the drop down menu, select &quot;External method&quot; and click the Add button.</li>
+<li>Enter the following parameters:<ul>
+<li>Id: Migrate_eduCommons3.0.2</li>
+<li>Title: Migrate_eduCommons2.0.2</li>
+<li>Module Name: Migrate</li>
+<li>Function Name: migrate_2_3_1_to_3_0_2</li>
+</ul>
+</li>
+</ol>
+<ol class="arabic simple" start="4">
+<li>Click Add</li>
+<li>Click on the Migrate_eduCommons3.0.2 script you just added</li>
+<li>Click the test tab.</li>
+<li>Verify that the method ran successfully. (It should give you feedback.)</li>
+</ol>
+</blockquote>
+</div>
+<div class="section" id="final-steps">
+<h1>Final Steps</h1>
+<blockquote>
+<p>Your site should now be migrated. Navigate to your site in the browser and ensure it has migrated.
+Based on the nature of the changes from Plone 2.5.x to Plone 3.0.4, if you performed major customizations, you may or may not need to refactor those changes to work properly in a Plone 3 environment.</p>
+<p>Here are some additional steps you may need to follow after migration, depending on how you have customized your site:</p>
+<ol class="arabic simple">
+<li>Check Course Homepage and About the Professor pages to see if the images render. In past versions of eduCommons, some of these image links may be broken, but rendered due to acquisition. The course folder appears twice in the link (i.e. department/course/course/page).</li>
+<li>The Site homepage links to the Courses List, Frequently Asked Questions, and Help will need to be modified as follows:<ul>
+<li>OLD: &lt;a title=&quot;List of Courses&quot; href=&quot;/Courses_listing/&quot;&gt;list of courses&lt;/a&gt;.</li>
+<li>NEW: &lt;a title=&quot;List of Courses&quot; href=&quot;/courselist/&quot;&gt;list of courses&lt;/a&gt;.</li>
+<li>OLD: &lt;a title=&quot;Frequently Asked Questions&quot; href=&quot;/Help/&quot;&gt;Frequently Asked Questions&lt;/a&gt;</li>
+<li>NEW: &lt;a title=&quot;Frequently Asked Questions&quot; href=&quot;/help/&quot;&gt;Frequently Asked Questions&lt;/a&gt;</li>
+<li>OLD: &lt;a title=&quot;Feedback&quot; href=&quot;/Feedback/&quot;&gt;feedback&lt;/a&gt;</li>
+<li>NEW: &lt;a title=&quot;Feedback&quot; href=&quot;/feedback/&quot;&gt;feedback&lt;/a&gt;</li>
+</ul>
+</li>
+<li>The Site's About page links to the Terms of Use and Privacy Policy will need to be modified as follows:<ul>
+<li>OLD: &lt;a title=&quot;Terms of Use&quot; href=&quot;../About/terms_of_use&quot;&gt;Terms of Use&lt;/a&gt;</li>
+<li>NEW: &lt;a title=&quot;Terms of Use&quot; href=&quot;../about/terms_of_use&quot;&gt;Terms of Use&lt;/a&gt;</li>
+<li>OLD: &lt;a title=&quot;Privacy Policy&quot; href=&quot;../About/privacy_policy&quot;&gt;Privacy Policy&lt;/a&gt;</li>
+<li>NEW: &lt;a title=&quot;Privacy Policy&quot; href=&quot;../about/privacy_policy&quot;&gt;Privacy Policy&lt;/a&gt;</li>
+</ul>
+</li>
+<li>The top banner, portal logo, and top nav color setting can be checked and adjusted by managers and administrators via Site Setup --&gt; Left Skin Settings. Any changes made to these settings must be done after having checked the Development Mode box. In order to change the background color in the top nav color, a 1px x 1px transparent gif needs to be loaded first to hide the top nav background image. Be sure to uncheck the Development Mode box after Left Skin changes have been saved to improve site performance.</li>
+<li>In order to restore the &quot;Join&quot; link, login to the site as manager and click Site Setup --&gt; Security. Then check the &quot;Enable self-registration&quot; box and click save.</li>
+</ol>
+</blockquote>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="MIGRATIONS_OLD.txt">View document source</a>.
+Generated on: 2009-01-14 23:51 UTC.
+Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/PORTLETS.html
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/PORTLETS.html	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/PORTLETS.html	(revision 126)
@@ -0,0 +1,165 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!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">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<meta name="generator" content="Docutils 0.5: http://docutils.sourceforge.net/" />
+<title></title>
+<link rel="stylesheet" href="./default.css" type="text/css" />
+</head>
+<body>
+<div class="document">
+
+
+<div class="section" id="adding-portlets-to-educommons">
+<h1>Adding Portlets To eduCommons</h1>
+<p>A portlet is a user-interface component that can be &quot;plugged-in&quot; to the architecture of Plone, the framework upon which eduCommons is based. There are several portlets that are natively available when you install eduCommons: the Course Info portlet that appears in the right navigation is an example, the Course Builder portlet is another. This tutorial will explain how portlets can be added and removed and how you can create your own portlet from scratch.</p>
+<ul class="simple">
+<li><a class="reference internal" href="#adding-and-removing-existing-portlets">Adding and Removing Existing Portlets</a></li>
+<li><a class="reference internal" href="#creating-your-own-portlet">Creating Your Own Portlet</a>.</li>
+<li><a class="reference internal" href="#customizing-portlets">Customizing Portlets</a>.</li>
+<li><a class="reference internal" href="#oerrecommender-portlet">OerRecommender Portlet</a>.</li>
+<li><a class="reference internal" href="#coursebuilder-portlet">CourseBuilder Portlet</a>.</li>
+<li><a class="reference internal" href="#courseinfo-portlet">CourseInfo Portlet</a>.</li>
+<li><a class="reference internal" href="#additional-resources">Additional Resources</a>.</li>
+</ul>
+</div>
+<div class="section" id="id1">
+<span id="adding-and-removing-existing-portlets"></span><h1>Adding and Removing Existing Portlets</h1>
+<p>If a portlet already exists that you either want to remove or add, follow these steps.</p>
+<ul class="simple">
+<li>navigate to the site as an administrator.</li>
+<li>click on the <em>manage portlets</em> link.</li>
+</ul>
+<p>The <em>manage portlets</em> page allows you to add and remove portlets.</p>
+<ul class="simple">
+<li>To add a portlet click on the <em>Add portlet...</em> drop down menu and select the portlet to add.</li>
+<li>To delete a portlet click on the small red <em>x</em> next to the portlet to remove.</li>
+</ul>
+<p>You can also change the order that the portlets appear by using the small blue arrows next to the porlets.</p>
+</div>
+<div class="section" id="id2">
+<span id="creating-your-own-portlet"></span><h1>Creating Your Own Portlet</h1>
+<p>One of the simplest ways to create a portlet is to use the ZopeSkel tool to create a skeleton product that you can then modify for your own purposes. The Plone site has an <a class="reference external" href="http://plone.org/documentation/how-to/use-paster/">excellent article describing how to install and use the ZopeSkel tool</a>. Once you have ZopeSkel installed you can create a new portlet package using the plone3_portlet template.</p>
+<pre class="literal-block">
+paster create -t plone3_portlet
+</pre>
+<p>Enter the information, as prompted, for the portlet you are creating. To select the defaults, just press enter.</p>
+<pre class="literal-block">
+Enter project name: SamplePortletProject
+Variables:
+  egg:      SamplePortletProject
+  package:  sampleportletproject
+  project:  SamplePortletProject
+Enter namespace_package (Namespace package (like plone)) ['collective']: sample_portlet_project
+Enter namespace_package2 (Nested namespace package (like app)) ['portlet']:
+Enter package (The package contained namespace package (like example)) ['example']:
+Enter zope2product (Are you creating a Zope 2 Product?) [True]:
+Enter version (Version) ['0.1']:
+Enter description (One-line description of the package) ['']: This is a sample portlet product
+Enter long_description (Multi-line description (in reST)) ['']:
+Enter author (Author name) ['Plone Foundation']:
+Enter author_email (Author email) ['plone-developers&#64;lists.sourceforge.net']:
+Enter keywords (Space-separated keywords/tags) ['']:
+Enter url (URL of homepage) ['http://plone.org']:
+Enter license_name (License name) ['GPL']:
+Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]:
+Enter portlet_name (Portlet name (human readable)) ['Example portlet']: Sample Portlet
+Enter portlet_type_name (Portlet type name (should not contain spaces)) ['ExamplePortlet']: SamplePortlet
+</pre>
+<p>A portlet package will be created in the folder where you ran the script. Follow the directions in the Plone article to install the new portlet package using easy_install. Another option is to tell the paster script to create a Plone 2 product and then copy this product into the Products directory of your plone instance (the Plone 2 product is buried down a few levels in the package). In either case, after you restart your Plone instance and navigate to the <em>Add-on Products</em> page of your Plone site you will see the new product listed. After installing the product into your Plone site you will be able to manage it as you do the other portlets in your site.</p>
+</div>
+<div class="section" id="id3">
+<span id="customizing-portlets"></span><h1>Customizing Portlets</h1>
+<p>If you look at the code, generated in the last section, you will see that this new product is relatively simple. It contains a configure.zcml file, a template file, a python file, a profile folder, and a tests folder. Often the only places that will need to be changed to customize the portlet will be the template file and the renderer within the python file. Here are some examples of portlets that do just that:</p>
+<div class="section" id="id4">
+<span id="oerrecommender-portlet"></span><h2>OerRecommender Portlet</h2>
+<p>This is the <a class="reference external" href="http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/oerrecommender.pt">oerrecommender.pt</a> template file for the oerrecommender. The file consists of a script tag that retrieves a series of recommendations from oerrecommender.org.</p>
+<pre class="literal-block">
+&lt;div id=&quot;recommendations&quot;&gt;
+  &lt;script language=&quot;JavaScript&quot;
+          tal:define=&quot;url here/absolute_url&quot;
+          tal:attributes=&quot;src string:http://www.oerrecommender.org/recommendations.pjs?educommons=true&amp;u=${url}&amp;title=true;&quot;
+          type=&quot;text/javascript&quot;&gt;
+  &lt;/script&gt;
+&lt;/div&gt;
+</pre>
+<p>Here is the renderer for the <a class="reference external" href="http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/oerrecommenderportlet.py">oerrecommenderportlet.py</a> file.</p>
+<pre class="literal-block">
+class Renderer(base.Renderer):
+    &quot;&quot;&quot; Render the OER Portlet &quot;&quot;&quot;
+    render = ViewPageTemplateFile('oerrecommender.pt')
+
+    def __init__(self, context, request, view, manager, data):
+        super(Renderer, self).__init__(context, request, view, manager, data)
+        self.props = self.context.portal_properties.educommons_properties
+
+    &#64;property
+    def available(self):
+        return self.props.oerrecommender_enabled
+</pre>
+<p>You'll notice that the renderer is where we define which page template to use when rendering the template. This file also contains a property that allows the portlet to be conditionally displayed based on whether the oerrecommender is enabled.</p>
+</div>
+<div class="section" id="id5">
+<span id="coursebuilder-portlet"></span><h2>CourseBuilder Portlet</h2>
+<p>The Course Builder tool allows users to quickly create a course with its associated files and departments.  In this <a class="reference external" href="http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/coursebuilder.pt">coursebuilder.pt</a> template file you can see the portlet displaying a link to the Course Builder form (the '&#64;&#64;' symbol signifies that the resource is a view).</p>
+<pre class="literal-block">
+&lt;dl class=&quot;portlet portletCourseBuilder&quot;
+    i18n:domain=&quot;eduCommons&quot;&gt;
+
+  &lt;dt class=&quot;portletHeader&quot;
+      i18n:translate=&quot;box_course_builder&quot;&gt;
+    Course Builder
+  &lt;/dt&gt;
+
+  &lt;dd class=&quot;portletItem even&quot;&gt;
+    &lt;a href=&quot;&quot;
+         i18n:translate=&quot;text_build_course&quot;
+         tal:attributes=&quot;href string:${here/portal_url}/&#64;&#64;coursebuilderform&quot;&gt;Build a Course&lt;/a&gt;
+  &lt;/dd&gt;
+
+&lt;/dl&gt;
+</pre>
+</div>
+<div class="section" id="courseinfo-portlet">
+<span id="courseinfo-example"></span><h2>CourseInfo Portlet</h2>
+<p>The CourseInfo portlet displays course statistics for the objects within each course. Methods are defined with the python file that are then used with the template file. For example, the renderer for the portlet in the <a class="reference external" href="http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/courseinfoportlet.py">courseinfoportlet.py</a> file contains several methods</p>
+<pre class="literal-block">
+...
+def statePercent(self, state=''):
+  &quot;&quot;&quot; return the percent value for a given state &quot;&quot;&quot;
+
+  if 0 == self.total:
+    return '0%'
+  else:
+    width = float(self.stateCounts[state])/float(self.total) * 100.0
+    return '%d%%' %int(width)
+...
+</pre>
+<p>that are then used in the <a class="reference external" href="http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/courseinfo.pt">courseinfo.pt</a> template file.</p>
+<pre class="literal-block">
+...
+    &lt;img alt=&quot;barchart&quot; class=&quot;statecolumnimage&quot;
+                 tal:attributes=&quot;width python:view.statePercent(item);
+                 src string:bargraphic.gif&quot; /&gt;
+...
+</pre>
+</div>
+</div>
+<div class="section" id="id6">
+<span id="additional-resources"></span><h1>Additional Resources</h1>
+<p>There are some great resources to help you in customizing existing portlets and for adding functionality to portlets that you've created using the ZopeSkel product.</p>
+<p>If you would like to do some quick and dirty customization through-the-web you'll probably want to <a class="reference external" href="http://plone.org/documentation/tutorial/customization-for-developers/tutorial-all-pages">use the portal_view_customizations tool</a> in the ZMI. It's similar to portal_skins but for view, viewlets, and portlets.</p>
+<p>Martin Aspeli has a whole tutorial on customizing a plone site which includes a section on <a class="reference external" href="http://plone.org/documentation/tutorial/customization-for-developers/portlet-renderers">customizing portlet renderers</a>.</p>
+<p>The Plone site also has a tutorial that shows how to <a class="reference external" href="http://plone.org/documentation/how-to/override-the-portlets-in-plone-3.0/?searchterm=add%20new%20portlet">override existing portlets</a>.</p>
+</div>
+</div>
+<div class="footer">
+<hr class="footer" />
+<a class="reference external" href="PORTLETS.txt">View document source</a>.
+Generated on: 2009-01-14 23:51 UTC.
+Generated by <a class="reference external" href="http://docutils.sourceforge.net/">Docutils</a> from <a class="reference external" href="http://docutils.sourceforge.net/rst.html">reStructuredText</a> source.
+
+</div>
+</body>
+</html>
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/default.css
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/default.css	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/default.css	(revision 126)
@@ -0,0 +1,331 @@
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:Date: $Date: 2005-09-23 15:58:00 -0600 (Fri, 23 Sep 2005) $
+:Revision: $Revision: 1964 $
+:Copyright: This stylesheet has been placed in the public domain.
+t
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+
+body {
+  
+  background: #B49F78;
+  margin-top: 0px;
+  font-family: Verdana, Arial, Helvetica, sans-serif;
+  text-align:center;
+}
+
+.document {
+  width: 800px;
+  margin:0 auto;
+  padding: 0 5px 0 5px;
+  color: #666;
+  background: #FFF;
+  border: 1px solid black;
+  text-align: left;
+}
+
+.document a:link, .document a:visited, .document a:hover, .document a:active {
+  color: #CC6600;
+}
+
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+   }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+   }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em }
+
+div.header {
+  clear: both;
+  font-size: smaller;
+  text-align: center;
+  
+}
+
+div.footer {
+  clear: both;
+  font-size: smaller;
+  text-align: center;
+  padding-top: 5px;
+
+}
+
+hr.footer {
+  display: none;
+}
+
+
+
+
+
+div.footer a {
+  color: #fff;
+  text-decoration: underline;
+}
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+   ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1, h1, h3, h4, h5, h6 {
+  font-size: 1em;
+}
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+   ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+   ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.line-block {
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em ;
+  background-color: #eeeeee }
+
+span.classifier {
+   ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+   ;
+  font-weight: bold }
+
+span.interpreted {
+   }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid thin gray }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid thin black }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+tt.docutils {
+  background-color: #eeeeee }
+
+ul.auto-toc {
+  list-style-type: none }
+  
+.reference {
+  color: #FFF;
+}
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/CHANGES.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/CHANGES.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/CHANGES.txt	(revision 126)
@@ -0,0 +1,311 @@
+========================
+Changes in version 3.1.0
+========================
+
+"Download Course" Additions 
+   Moved "download this course" into a "Reuse Course" portlet. The course downloads now include IMS information. Using a portlet will also allow for additional formats, such as Common Cartridge, to be added in the future.  
+
+Display License and Caption for Embedded Objects 
+   Using the Kupu editor, eduCommons can now display separate licenses and citations for image objects embedded in a page, distinct from the overall page license. 
+
+Captcha integration 
+   We now integrate captcha on the registration page to prevent spambot submissions.
+
+Lingua Plone 2.0 Integration 
+   LinguaPlone 2.0 has been implemented into eduCommons 3.1.0, allowing users to localize content and support multiple languages on a single OpenCourseWare site. 
+
+Add accessibility check 
+   This is intended to help institutions who want to include accessibility check into their workflow. 
+
+Enable Javascript/Page-specific CSS and embed tags by default
+   We have enabled Javascript and page-specific CSS and embed tags by default.
+
+Documentation for Adding Small Widgets 
+   Add eduCommons-specific documentation and examples for adding Plone 3 portlets. 
+
+Add "Remix this course" functionality 
+   This feature is designed to allow courses from MIT OpenCourseWare (pending implementation by MIT OCW) as well as other eduCommons OCWs to be easily imported into OpenOCW (or another eduCommons site if specified, but OpenOCW will be the default). On published eduCommons OCW courses that have been packaged, a "Remix this course" link appears. This allows unauthenticated users to send the entire course to OpenOCW (OpenOCW login credentials must be provided).  
+
+Update "download this course" to improve handling of large courses 
+   "Download this course" is no longer auto-generated when a course is published or changed. Instead, a new "Package course" button appears in the contents view of the course once it has been published. The "Download this course" .zip file now includes IMS information. It now appears in its own portlet, along with the "Remix this course" link.
+
+Other updates
+   Updated eduCommons to exclude new content from showing in the left nav by default (including zip imports).
+   Improved IE 6 and 7 compatibility.
+
+========================
+Changes in version 3.0.2
+========================
+
+Fixed bugs in 3.0.1 migration release
+
+
+========================
+Changes in version 3.0.1
+========================
+
+Added migration support for from eduCommons 2.3.1
+
+
+========================
+Changes in version 3.0.0
+========================
+
+Added full support for Plone 3.0
+   Inline editing
+   Working Copy support
+   Link and reference integrity checking
+   Automatic locking and unlocking
+   Easy collaboration and sharing
+   Versioning, history and reverting content
+   Upgraded visual HTML editor 
+
+Added OpenOCW Functionality
+   Simplified Workflow
+   Refactored Security
+   Eased Production processes
+
+Simplified Course Building
+   Course Builder Widget allows 'one step' production of Division, Course, and templates Course objects (syllabus, etc).
+
+
+========================
+Changes in version 2.3.1
+========================
+
+Added Migration from 2.2.0
+   The migration process has been improved and simplified.
+
+ 
+========================
+Changes in version 2.3.0
+========================
+
+Added i18n Support for Spanish, Dutch, French, and Chinese
+   Translations are now available for the aforementioned languages.
+
+Added Support for MOCSL Tools
+   The Folksemantic AddOn Product allows for seamless interaction with
+   Annorate, Make A Path, and Send2Wiki.
+
+Fixed Metadata Bugs
+   The Citations were presenting incorrect metadata; now pulling in correct
+   metadata per object.
+
+Added Course Wide Instructor Metadata
+   A flag is now available to note if the Instructor of the Course is also the
+   principal creator for objects within the course.
+
+Added MIT CP Import Support
+   Via the IMS Transport Tool, an end user can now import IMS Content Packages.
+   eduCommons will strip the package of it's chrome and import content, navigation,
+   and metadata.
+
+Added Zip File Download for Courses
+   End Users can now get a Zip File download of a course object, stripped of eduCommons
+   chrome and ready for reuse
+
+Extended RSS Feed Support
+   Departments and Courses now have configurable feeds per object, and the ability to turn
+   feeds on and off
+
+Added Recursive Copyright Clearance
+   Folderish Objects may now recrusively clear or revoke copyight
+
+
+========================
+Changes in version 2.2.0
+========================
+
+Front end UI Enhancements
+
+Auto-citation generation (from metadata) displayed inline with documents and included in skinless content. Simplify conformance with Attribution terms of Creative Commons licenses for those who build derivative works.
+
+Social Bookmarking Dropdown. Help users bookmark and later find OERs hosted in eduCommons using popular social bookmarking services.
+
+Integration with MyOCW (pending MyOCW release dates).
+
+Expanded support for IMS Content Packaging, including a transform engine that can translate from popular IMS CP formats to and from eduCommons.
+
+Updated internationalization support, with translation updates for a predetermined set of languages.
+
+Finalized support for content translation using the LinguaPlone product. 
+
+
+========================
+Changes in version 2.1.1
+========================
+
+Updated Internationalization Files
+  Updated internationalization files to reflect the latest eduCommons changes.
+
+Added Support for Inline Translations
+  Integrated the LinguaPlone product with eduCommons, making it now possible 
+  to have multiple translations of content within the same eduCommons instance.
+
+RSS Feeds on front page, and RSS feeds for departments
+  RSS feed icon now appears on the front page of eduCommons, as well as on the 
+  courses listing page. A new RSS feed now appears for departments, which
+  lists the latest published courses in a department.
+
+Added Support for Social Bookmarking Services
+  Added support for bookmarking services, starting with del.icio.us. Support
+  for more to come.
+
+Added a Skinless View for Documents
+  eduCommons now provides a skinless view of documents, making it both possible
+  and easy to reuse content.
+
+==============================
+Changes in version 2.1.0-final
+==============================
+
+A new IMS Transport Engine
+  A refactored IMS Content Packaging engine that provides a more robust import
+  and export functionality. On import eduCommons will identify where required 
+  tags missing in the manifest file, if it is not able to read it directly.
+
+IMS Content Packaging Documentation
+  This version ships with detailed documentation on how to write out an IMS 
+  Content Package that eduCommons can consume. The documentation is provided
+  in raw text, web based, and in a standalone (PDF) file.
+
+A New Content Licensing Engine
+  eduCommons now allows a default content license and a rights holder to be
+  set sitewide. It also includes the ability to license an individual piece 
+  of content, should the need arise to publish content under a license 
+  different to the site wide one.
+
+Copyright Bylines
+  Content is now published with the appropriate copyright byline, including
+  the ability to specify copyright dates, the rights holder, and the license
+  itself. The license includes a hyper-link to the legal terms of the license
+  as well as an icon (if the license includes one).
+
+Creative Commons License Support
+  eduCommons now includes a license selector that integrates with Creative
+  Commons Licenses (www.creativecommons.org), allowing eduCommons to remain
+  flexible with the latest CC offerings.
+
+Support for Other Licenses
+  eduCommons supports other licenses, including the traditional all rights 
+  reserved, and GNU Free Document Licenses, as well as allowing content
+  developers to input their own license.
+
+RDF and machine readable Creative Commons License Support
+  eduCommons will publish by default any metadata for a content object in
+  embedded RDF format. eduCommons will also publish machine readable creative
+  commons licenses, that can be read and processed by search engines.
+
+Content Licensing Product for Plone 2.5
+  The content licensing features in eduCommons are shipped in a standalone product
+  that can also be used in a default Plone 2.5 instance.
+
+Native Support for Plone 2.5
+  This version of eduCommons supports the latest version of Plone (2.5), with some 
+  functionality now taking advantage of the new Zope 3 component architecture.
+
+Improved HTML Validation/Fixing Engine
+  The HTML Validation/Fixer Engine has been updated, and now displays a detailed
+  report of problems within the body of an HTML document, and provides a simple
+  method to fix most problems, and identify remaining ones that need extra
+  attention. This functionality works when a content developer's editor is not
+  set to use the FCKeditor.
+
+
+
+
+==============================
+Changes in version 2.0.0-final
+==============================
+
+Human Readable URLS
+  URLs are human readable, instead of being based on an auto generated id.
+
+Recursive Folder Change State
+  Can change workflow state recursively on content in subfolders.
+
+Native Support for Plone 2.1
+  Integrated eduCommons custom skin files with new Plone 2.1 functionality. 
+  Content objects are now based on ATContentTypes. Substantial changes across 
+  the code base. eduCommons is currently based on Plone-2.1.2 and Zope-2.8.6.
+
+Content Status History on Object Views in Edit Mode
+  The content status history of an object is now available in the view from 
+  a history link at the top of the page while in edit mode.
+
+No Redirect on Front Page
+  Front page no longer redirects to an ECIndex folder, but renders directly.
+
+Removed Forum Support
+  Forum support is being replaced by new social software in the future, which 
+  means that the old OLS code base is no longer being maintained. If you require 
+  forum support it is recommended that you use the excellent zForum 
+  (http://www.zforum.org) plone product until the new software is in place.
+
+Improved IMS Content packaging
+  Workflow status history is now written in the IMS content package instead 
+  of being stored in a binary blob.
+
+eduCommons Custom Skin Support
+  eduCommons can now reskinned in release mode without requiring eduCommons 
+  to be restarted.
+
+Courses Object Removed
+  The courses object has been removed, and departments are now put in the 
+  root of the site. This simplifies the UI and removes confusion over what 
+  the Courses object is/was.
+
+Improved Default Templates
+  Default templates for the front page, FAQ and about pages propagate the 
+  eduCommons site title, making it easier to customize default site text.
+
+Department and Course IDs
+  Departments and Courses now support the display of ID's in front of their 
+  titles. Courses also support the display of the year and semester that the 
+  course was taught in.
+
+==============================
+Changes in version 1.6.1-final
+==============================
+
+eduCommons Document HTML Fixer
+  Implement an HTML engine that can fix HTML mistakes automatically in ecDocuments.
+
+RDF Headers/Metadata
+  Add RDF headers to ECDocuments implementing the RDF/Dublin Core standard.
+
+Support for Plone 2.1.1/Zope 2.8.2
+  Implementing support for the latest Plone (2.1.1) and Zope (2.8.2) code bases.
+
+Support for Default Templates
+  Support for adding default templates for commonly used pages within eduCommons.
+
+
+Review and Revise IMS Export Rights
+  Changes in the UI to only present IMS import/export to administrators and managers. 
+  This is necessary because producers do not have rights on content that is not in the 
+  "In Progress" state, which prevents producers from being able to import/export 
+  content not in the appropriate state. 
+
+
+Zip export (non-ims)
+  Allow a producer administrator or manager to export course content in a zip file format.
+
+Creative Commons metadata header
+  Add a metadata header to ECDocuments for the creative commons license.
+
+Removal of "Courses" link in bread crumb
+  Remove the "Courses" link in the breadcrumb due to the fact that is is confusing to users.
+
+XHTML Validation of an Entire Course
+  Adding the ability to do validation of XHTML across a course, while reporting 
+  errors in a log file.
+
+Add Folders to Course Contents
+  Add folders to course content pages so that objects which externally link to other 
+  objects will retain their links with out having to rewrite them.
+
+Migration from 1.5.2-final
+  Implement the ability to migrate existing 1.5.2-final sites to 1.6.1-final.
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/IMSContentPackaging.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/IMSContentPackaging.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/IMSContentPackaging.txt	(revision 126)
@@ -0,0 +1,529 @@
+IMS Content Packaging and eduCommons $$version$$
+================================================
+
+This document details how to write IMS Content packages that are compatible with
+eduCommons $$version$$. 
+
+eduCommons uses version 1.2 of the IMS Content Packaging Specification. XML Schemas
+for the specification can be found at http://imsglobal.org/xsd/imscp_v1p2.xsd and
+http://imsglobal.org/xsd/imsmd_v1p2p4.xsd.
+
+Using XML Schemas and a Validating XML Editor
+=============================================
+
+In the process of writing software that exports eduCommons supported IMS Content
+Packages, it is highly recommended to use a validating XML editor and associated
+schema files to check manifests for validity. eduCommons in some circumstances 
+will expect import manifests to meet validity standards, and the chances of 
+creating content packages that will work with eduCommons will be greatly increased. 
+eduCommons provides XML schema files on export for this purpose.
+
+An XML schema file for eduCommons specific metadata can be found both online
+(http://cosl.usu.edu/xsd/eduCommonsv1.1.xsd) and in eduCommons IMS Content
+Packages.
+
+To use the IMS Content Package XML schemas along with the eduCommons schema, make
+sure your manifest specifies these packages and the relevant XML schema informtation
+in the header. Below is an example of attributes which you may want to set on the 
+*manifest* tag.
+
+::
+
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1" 
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.1" 
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2" 
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd 
+                        http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p4.xsd 
+                        http://cosl.usu.edu/xsd/eduCommonsv1.2 eduCommonsv1.2.xsd">
+
+
+
+Specifying and Using eduCommons Namespaces
+==========================================
+
+The IMS CP specification allows content packages to be extended using custom
+metadata fields. eduCommons takes advantage of this to pass information that
+does not fit into the LOM metadata format. Using the eduCommons extensions
+requires the use of the eduCommons namespace in typical XML style.
+
+eduCommons can read values from colon prefixed tags, or by using an *xmlns*
+attribute on the top level eduCommons tag as shown below. Although both methods
+are acceptable, the latter is preferred due to the fact that it makes the
+corresponding XML more readable. Examples in the rest of the document will
+be given in this format.
+
+::
+
+   <manifest xmlns="....
+             xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+             ...
+             >
+
+       ...
+
+       <eduCommons:eduCommons>
+           <eduComons:objectType>
+               Course
+           </eduCommons:objectType>
+       </eduCommons:eduCommons>
+
+       ...
+    </manifest>
+
+::
+
+    <eduCommons xmlns="http://cosl.usu.edu/xsd/eduCommonsv1.2">
+        <objectType>
+            Course
+        </objectType>
+    </eduCommons> 
+
+
+How to Make Items Appear in the Left Hand Navigation
+====================================================
+
+eduCommons will add links to objects in the left hand navigation of a course
+view through the use of the *organizations* section in an IMS content package.
+Becuase IMS CP standards support multiple organizations within a manifest,
+eduCommons will use the default organization if it is specified. If no default
+is specified eduCommons will read from the first *organization* tag listed
+in the organizations section.
+
+eduCommons gets its left hand navigation information from the *isVisible* attribute
+on items. If this attribute is present and set to true, eduCommons will mark
+this object as displayable in the left hand navigation. eduCommons will order 
+left hand navigation items based on the ordering of *item* tags within the 
+organization section.
+
+An example of how to write an organizations section that eduCommons can read is
+given below. Notice how the default organization section is set, and how unique
+identifiers are used to link the item to the resource in the resources section.
+
+The IMS CP specification requires that any id value use be unique to the manifest,
+otherwise anything can be used.
+
+::
+
+   <oganizations default="ORG1234">
+       <organization identifier="ORG1234">
+           <item identifier="ITM1234" identifierref="RES1234" isVisible="true">
+               <title>
+                   Hello World
+               </title>
+           </item>
+           ...
+       </organization>
+   </organizations>
+   <resources>
+       <resource identifier="RES1234">
+          ...
+       </resource>
+       ...
+   </resources>
+
+Setting Metadata on eduCommons Enabled IMS Content Packages
+===========================================================
+
+eduCommons stores metadata for every content object entered into its repository.
+In order to write a content package that eduCommons can process, it is necessary
+to include a metadata section for every resource specified in the manifest.
+
+It is also important to note that eduCommons currently will not read top level
+metadata sections, nor will it support nested manifests within IMS Content
+Packages. Support for nested manifests, and non eduCommons content packages
+are currently listed as future eduCommons features.
+
+An example of how to lay out your manifest section to be eduCommons friendly is
+given below.
+
+::
+
+    <manifest>
+        <organizations>
+            <organization>
+            </organization>
+        </organizations>
+        <metadata>
+            ... any metadata specified here is ignored by eduCommons ...
+        </metadata>
+        <resources>
+            <resource>
+                <metadata>
+                   ... metadata specified here is used to apply metadata
+                       to content objects ...
+                </metadata>
+                <file href=" ... used by eduCommons to name the content object
+                                 and find it within the package ..."/>
+            </resource>
+            ...
+        </resources>
+        <manifest>
+            ... nested manifests are not currently supported by eduCommons,
+                but may be at a future date ...
+        </manifest>            
+    </manifest>
+
+
+The eduCommons Course Object
+============================
+
+The eduCommons course object is different to other content objects in that
+it has extra requirements. eduCommons represents courses as both a document
+and a container for content objects. This means in an IMS Manifest it will
+appear as a content object that is connected to an HTML file (used to 
+render the front course page) and is also a folder which contains  all content
+related to the course. It appears in the manifest as both.
+
+Courses also have additional metadata associated with them in the eduCommons 
+specific metadata section. This extra metadata is specified in a further section
+below.
+
+Each manifest should specify a course object as the initial resource.
+
+
+LOM Metadata Fields Read By eduCommons on Import
+================================================
+
+eduCommons uses Dublin Core fields to store metadata internally. In order to
+be able to support IEEE LOM metadata standards in IMS Content Packages, some
+mapping between metadata standards must be done. Not all LOM metadata fields
+are supported, and although eduCommons may populate some of these extra fields
+on output, it only supports reading data from the following fields:
+
+1. General
+----------
+
+1.2 Title
+~~~~~~~~~
+
+eduCommons uses this field to set the title on an object. This field is 
+required.
+
+1.3 Language
+~~~~~~~~~~~~
+
+eduCommons uses the language setting to set the language of the content object
+and its metadata. eduCommons does not support setting language values on metadata
+or individual metadata fields. All LOM language attributes in "langstring" nodes
+are ignored by eduCommons. This field is optional, but recommended.
+
+1.4 Description
+~~~~~~~~~~~~~~~
+
+eduCommons sets descriptions on content objects using this field. This field is
+optional, but recommended.
+
+1.5 Keyword
+~~~~~~~~~~~
+
+eduCommons supports the use of keywords for search purposes over content. It 
+uses this LOM field. This field is optional.
+
+
+2. Lifecycle
+------------
+
+2.3 Contribute
+~~~~~~~~~~~~~~
+
+eduCommons supports a number of fields based on the LOM Contribute node.
+
+When the role in a contribute node is set to "creator", eduCommons will
+set the eduCommons creator field to the name value in the VCARD of this
+section. When the role is set to "creator" it will also use the date field
+to set the creation date on the eduCommons content object.
+
+eduCommons will set its contributors field with the names listed in any other
+LOM based contribute nodes. The roles defined in additional LOM based contribute
+nodes are not read or stored by eduCommons.
+
+eduCommons also supports a number of eduCommons specific contribute nodes
+which are detailed in the next section.
+
+Other
+-----
+
+eduCommons may support a larger number of LOM fields in the future. The current 
+supported set is likely to be expanded. However, attempts will be made to remain
+compatible with the above listed fields.
+
+
+LOM Based eduCommons Metadata Fields
+====================================
+
+The *rights holder* field
+-------------------------
+
+eduCommons supports setting a rights holder for every content object. However, it
+also supports setting content to use a site wide default, making it possible to
+set a default rights holder over the whole eduComomns site. To use the site wide
+default setting, use "(site default)" as the rights holder name.
+
+eduCommons will read an write the rights holder information in a *contribute*
+section in the LOM metadata section of an IMS content package. The *source*
+tag in this contribute section is set to "eduCommonsv1.1" signifying that this
+role is defined by eduCommons and is not a standard LOM role. An example of how
+the rights holder is given below. The date field can be set to a publication or 
+creation date. It does not matter, as eduCommons does not use the date field in
+this section. 
+
+::
+
+    <contribute>
+        <role>
+            <source>
+                <langstring xml:lang="en">
+                    eduCommonsv1.2
+                </langstring>
+            </source>
+            <value>
+                <langstring xml:lang="en">
+                    rights holder
+                </langstring>
+            </value>
+        </role>
+        <centity>
+            <vcard>
+                BEGIN:VCARD
+                FN: John Smith
+                END:VCARD
+            </vcard>
+        </centity>
+        <date>
+            <datetime>
+                2006-08-07 15:59:23
+            </datetime>
+        </date>
+    </contribute>
+
+Note
+  The VCARD Section In The Xml File Should Be Left Aligned, With No Whitespace In
+  Order To Comply With VCARD Standards.
+
+
+The *Instructor* and *InstructorEmail* fields
+---------------------------------------------
+
+The instructor field is also encoded in a LOM contribute node, similar to the 
+rights holder field above. Things to note here are that eduCommons will read both
+the *FN:* and *EMAIL;INTERNET:* fields out of the VCARD, and use them to set
+the *Instructor* and *InstructorEmail* settings accordingly.
+
+::
+
+    <contribute>
+        <role>
+            <source>
+                eduCommonsv1.2
+            </source>
+            <value>
+                instructor
+            </value>
+        </role>
+        <centity>
+            <vcard>
+                BEGIN:VCARD
+                FN: John Smith
+                EMAIL;INTERNET: johnsmith@somewhere.com
+                END:VCARD
+            </vcard>
+        </centity>
+        <date>
+            <datetime>
+                2006-08-07 15:59:23
+            </datetime>
+        </date>
+    </contribute>
+
+Note
+  The VCARD Section In The Xml File Should Be Left Aligned, With No Whitespace In
+  Order To Comply With VCARD Standards.
+
+
+
+eduCommons Specific Metadata
+============================
+
+This section details eduCommons metadata that does not appear within the LOM
+metadata section. Instead it appears in a section following the LOM metadata as
+follows.
+
+::
+
+    <metadata>
+        <lom xmlns="http://www.imsglobal.org/xsd/imsmd_v1p2">
+            <general>
+            </general>
+            <lifecycle>
+            </lifecycle>
+            ...
+        </lom>
+        <eduCommons xmlns="http://cosl.usu.edu/xsd/eduCommonsv1.2">
+           <objectType>
+           </objectType>
+           ...
+        </eduCommons>
+    </metadata>
+
+
+The following section describes the tags supported by eduCommons in detail.
+
+eduCommons Metadata Tags
+========================
+
+The *objectType* tag
+--------------------
+
+The *objectType* tag is used to signify what type of content object eduCommons
+should create for the given resource. Possible values are Course, Document, 
+File, Image, or Link. This field is required. HTML or plain text resources
+should use the document setting. Images should use the image setting. All other
+resources should use the File setting, unless they are an external link. If
+a resource is in HTML format and represents a course home page, use the Course
+setting and make sure the resource appears first in the manifest resources 
+section.
+
+::
+
+    <objectType>
+        Course
+    </objectType>
+
+The *copyright* tag
+-------------------
+
+The *copyright* tag is used by eduCommons to license content objects. It also uses
+the field to render copyright bylines for objects. The field should specify both
+the copyright and the date. e. g. "Copyright 2006". This field is optional. If 
+it is not included, the site default copyright string will be used instead.
+
+::
+
+    <copyright>
+        Copyright 2006
+    </copyright>
+
+The *license* tag
+-----------------
+
+The license tag is used to assign a copyright license to a content object. It
+is also used to render a copyright byline for an object.
+
+The license field supports four parameters:
+
+- License Cateogory
+- License Name
+- License URL
+- License Icon URL
+
+The category field appears as an attribute in the *license* tag, and must be
+set to one of the following: 
+
+- (site default) 
+- All Rights Reserved 
+- GNU Free Document License
+- Creative Commons License 
+- Other
+
+The category field is also used as a label by eduCommons to allow a user to
+select a copyright license for a content object. It is a required field.
+
+The *licenseName* tag is used to identify the name of the license. This name 
+will be used in the copyright byline, and should slot into the following sentence:
+This resource is licensed under a ____________. This is an optional field only 
+if "(site default)" is chosen. Otherwise it must be specified.
+
+The *licenseUrl* tag is used to specify a public web site where the legal definition
+of the license is displayed. It allows the license name in the copyright byline to
+be linked directly to the definition. It is optional.
+
+The *licenseIconUrl* tag is used to specify a public icon image that represents
+the content license. This field is optional, and likely not to be included, unless
+the license includes a representative icon. An example where you would want 
+to include this field would be to specify a creative commons icon along with
+the license.
+
+Below is an example of how the license field would be encoded within the eduCommons
+metadata.
+
+::
+
+    <license category="Creative Commons License">
+        <licenseName>
+            Attribution 2.5
+        </licenseName>
+        <licenseUrl>
+            http://creativecommons.org
+        </licenseUrl>
+        <licenseIconUrl>
+            http://creativecommons.org
+        </licenseIconUrl>
+    </license>
+
+The *clearedCopyright* tag
+--------------------------
+
+The *clearedCoypright* field is used by eduCommons to keep track of whether or not
+a content object has been cleared for publication in an open content environment. 
+It can be set to either "true" or "false". This field is optional, and is set to
+"false" by default.
+
+::
+
+    <clearedCopyright>
+        true
+    </clearedCopyright>
+
+Course related metadata
+=======================
+
+The following metadata is only applicable when the *objectType* field is set
+to Course. It contains metadata that is specific to course objects.
+
+The *courseId* tag
+------------------
+
+The *courseId* tag is used to identify the course catalog number at an institution.
+It is used by eduComomns to render a full title of a course. Although this tag not
+required, is highly recommended.
+
+::
+
+    <courseId>
+        INST7000
+    </courseId>
+
+The *term* tag
+--------------
+
+The *term* tag is used by eduCommons to specify which term, or semester the course
+was taught in. It is used by eduCommons to render a full title of a course. Although
+this tag is not required, it is highly recommended.
+
+::
+ 
+    <term>
+        Fall 2005
+    </term>
+
+The *displayInstructorEmail* tag
+--------------------------------
+
+The *displayInstructorEmail* tag is used to specify whether or not an Instructor's
+Email address should be published or not. It can be set to "true" or "false".
+This tag is optional and defaults to "false".
+
+::
+
+    <displayInstructorEmail>
+        false
+    </displayInstructorEmail>
+
+
+Example IMS Content Packages
+============================
+
+You can create example IMS packages by building content in eduCommons and then
+use the IMS export functionality to export them. This feature can be useful
+in figuring out how to write compatible packages.
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/INSTALL.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/INSTALL.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/INSTALL.txt	(revision 126)
@@ -0,0 +1,481 @@
+===================================
+eduCommons $$version$$ Installation
+===================================
+
+-------------------------
+Installation Instructions
+-------------------------
+
+Installation
+============
+
+This section describes how to install a server based instance of eduCommons on 
+a UNIX based platform (linux, OSX). 
+
+Installation involves the following packages:
+
+   * Python-2.4.4.tar.gz (http://python.org/2.4.4/) 
+   * Zope-2.10.5-final.tar.gz (http://www.zope.org/Products/Zope/2.10.5)
+
+Python library packages:
+
+   * Imaging-1.1.6.tar.gz (http://www.pythonware.com/products/pil/)
+   * PyXML-0.8.4.tar.gz (http://sourceforge.net/project/showfiles.php?group_id=6473)
+   * elementtree-1.2.6.tar.gz (http://effbot.org/downloads/#elementtree)
+   * libxml2-python-2.6.15.tar.gz (ftp://xmlsoft.org/libxml2/python/)
+   * Beautiful Soup 3.0.4 (http://www.crummy.com/software/BeautifulSoup/download/)
+
+Plone package:
+
+   * Plone-3.0.6.tar.gz (http://plone.org/products/plone/releases/3.0.6)
+
+eduCommons-related Packages:
+
+(Correct versions of these products are shipped in the eduCommons archive unless ohterwise noted)
+
+   * eduCommons (3.1.0-final)
+   * leftskin (1.0.2-final)
+   * ContentLicensing (2.0.0)
+   * ZipFileTransport (2.0.1)
+   * IMSTransport (2.0.1)
+   * PloneBookmarklets (2.0.0)
+   * ProxyIndex (1.2.1)
+   * FileSystemStorage (2.6.2)
+   * LinguaPlone (2.0)
+   * easy_install (download here: http://peak.telecommunity.com/dist/ez_setup.py)
+   * collective.captcha (installed via easy_install)
+
+I. Installation Steps
+---------------------
+
+1. Installing Python:
+
+   It is likely that the Python programming language is already installed on 
+   your server. Try typing:
+   ::
+
+      $ python
+
+   on the command line to see what version you have installed (Ctrl-D will exit). 
+   You should see something like the following:
+   ::
+
+      Python 2.4.4 (#1, Oct  7 2006, 21:17:24) 
+      [GCC 3.4.6 20060404 (Red Hat 3.4.6-3)] on linux2
+      Type "help", "copyright", "credits" or "license" for more information.
+      >>>
+
+   eduCommons and its supporting software requires version 2.4.4. If your server 
+   does not have Python, or if the version of Python installed is not 2.4.4, you 
+   will have to install a new version.
+
+   Some platforms may have an updated version of Python available through their
+   package managers (yum, apt, fink). If you can not find a suitable version, or 
+   if you prefer to build Python from source, simply download the source package
+   and use a command line interface to type in the following instructions:
+   ::
+
+      tar -zxvf Python-2.4.4.tar.gz
+      cd Python-2.4.4
+      ./configure
+      make
+      sudo make install
+
+   By default this will install a new version of Python in the /usr/local directory
+   on your server.
+
+2. Installing Python library packages
+
+   Once you have Python installed it will be necessary to include a number of
+   libraries that extend the functionality of your Python installation. If you 
+   have installed Python using a package manager, it may be likely that some
+   (or all) of these packages may also be available for installation. As long
+   as suitable library versions can be found, it should be fine to use them. In
+   cases where it is not possible to load prebuilt packages, use the following
+   instructions below:
+
+   a. Installing Python Imaging Libary (PIL)
+
+      PIL is now a required package for the latest version of Plone.
+
+      Unpack and install Imaging-1.1.6:
+      ::
+
+         tar -zxvf Imaging-1.1.6.tar.gz
+         cd Imaging
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+      You may require additional packages to build the imaging library. See
+      the PIL website for additional installation instructions.
+
+   b. Installing PyXML
+
+      Unpack and install PyXML:
+      ::
+
+         tar -zxvf PyXML-0.8.4.tar.gz
+         cd PyXML-0.8.4
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+   c. Installing elementtree
+
+      elementtree is now a required dependency for the latest version of Plone.
+
+      Unpack and install elementtree:
+      ::
+
+         tar -zxvf elementtree-1.2.6.tar.gz
+         cd elementtree-1.2.6
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+   d. Installing libxml2-python
+
+      If your target platform includes binary only distributions of libxml2 and
+      libxslt, you may need to also include the development packages in order for
+      the following to work. 
+
+      Unpack and install libxml2-python:
+      ::
+
+         tar -zxvf libxml2-python-2.6.15.tar.gz
+         cd libxml2-python-2.6.15
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+   e. Install Beautiful Soup
+
+      Unpack and install Beautiful Soup 3.0.4 into your python library.
+      ::
+
+         tar -zxvf BeautifulSoup-3.0.4.tar.gz
+         cd BeautifulSoup-3.0.4
+         /usr/local/bin/python setup.py build
+         sudo /usr/local/bin/python setup.py install
+
+  f. Install Easy Install
+
+      Easy Install (easy_install) is a python module bundled with setuptools
+      that lets you automatically download, build, install, and manage Python packages.
+
+      Download http://peak.telecommunity.com/dist/ez_setup.py and install it using the 
+      correct version of python:
+      ::
+
+         /usr/local/bin/python ez_setup.py
+
+   g. Install collective.captcha
+
+      collective.captcha is a Python package that is installable via Easy Install
+      ::
+
+         /usr/local/bin/easy_install collective.captcha
+
+3. Installing Zope
+
+   Unpack, build and install Zope:
+   ::
+
+      tar -zxvf Zope-2.10.5-final.tar.gz 
+      cd Zope-2.10.5-final
+      ./configure --with-python=/usr/local/bin/python --prefix /opt/Zope-2.10.5
+      make
+      sudo make install
+
+4. Create a Zope instance
+
+   Create an instance in your Zope install:
+   ::
+
+      sudo /opt/Zope-2.10.5/bin/mkzopeinstance.py
+
+   When prompted for a directory enter in the following:
+   ::
+ 
+      /opt/Zope-2.10.5/web
+
+   You can substitute the *web* directory for a name that better describes your site. 
+   The documentation will assume that you have chosen web as your instance directory.
+
+   When prompted for a username and password, enter in the username/password you will 
+   use for managing your Zope instance.
+
+5. Install Zope Products
+
+   eduCommons relies on several Zope products in order to run. You will need to install
+   the following packages in the following order. The commands listed below assume that
+   you have the source tarballs in the root of your home account:
+
+   a. Plone-3.0.6
+
+      Install Plone into your Zope instance Products folder.lib/python directory 
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         sudo tar -zxvf ~/Plone-3.0.6.tar.gz
+
+      Once you have unpacked Plone you need to move the products back up to the Products 
+      directory as follows:
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         sudo su
+         cd Plone-3.0.6
+         mv * ..
+         cd ..
+         sudo rm -rf Plone-3.0.6
+      
+      The Plone tarball came with a lib/python directory. The contents of it need to go 
+      up one level, into the lib/python of your Zope install.
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         cp -r lib/* ../lib/
+         sudo rm -rf /opt/Zope-2.10.5/web/Products/lib
+
+      The Plone tarball also contains a Products directory. The contents of it need to go
+      up one level, into the web/Products directory of your Zope install.
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         cp -r Products/* ../Products/
+         sudo rm -rf /opt/Zope-2.10.5/web/Products/Products
+
+   b. eduCommons
+
+      This is the eduCommons product source package. To install use the following:
+      ::
+
+         cd /opt/Zope-2.10.5/web/Products
+         sudo tar -zxvf ~/eduCommons-$$version$$.tar.gz
+
+      eduCommons includes a number of products which need to be put in the root
+      of the Products folder. To do this use the following:
+      ::
+         
+         cd /opt/Zope-2.10.5/web/Products
+	 sudo mv eduCommons-$$version$$/* .
+         sudo rm -rf eduCommons-$$version$$
+
+      The products that now ship with eduCommons are as follows:
+         
+      1. eduCommons
+
+         A Plone product which implements the core functionality of eduCommons.
+
+      2. leftskin
+
+         A Plone product which customizes the Plone layout.
+
+      3. ContentLicensing
+
+         A Plone product that adds the ability to set copyright licenses on content
+         objects. Auto installed with the eduCommons product.
+
+      4. ZipFileTransport
+
+         A Plone product that adds the ability to import and export content via
+         ZIP archives. Auto installed with the eduCommons product.
+
+      5. IMSTransport
+
+         A Plone product that imports and exports contents in IMS content packages. 
+         Auto installed with the eduCommons product.
+
+      6. PloneBookmarklets
+
+         A Plone product that adds the ability to integrate documents with popular social
+         bookmarking sites.
+
+      7. ProxyIndex
+
+         ProxyIndex is a plugin to zope catalog index.
+
+      8. FileSystemStorage
+
+         FileSystemStorage is a product that provides the framework for content types to store data
+         directly on the filesystem, rather than in the ZODB.  
+
+      9. LinguaPlone
+
+         A tool to manage and maintain multilingual Plone content.
+
+6. Configure your Zope site
+
+   Now that all the necessary Zope products are installed it is time to clean up and
+   configure the site. The first task is to create a zope user and group in which 
+   zope can run under. This can be done via the following:
+   ::
+
+      sudo /usr/sbin/groupadd zope
+      sudo /usr/sbin/adduser -g zope -s /bin/false -d /opt/Zope-2.10.5 zope
+
+   Once that is done we can now set the proper permissions needed for Zope to run
+   securely. This can be done via the following:
+   ::
+
+      cd /opt/Zope-2.10.5/web/Products
+      sudo chgrp -R zope *
+      sudo chmod go-w *
+
+   FileSystemStorage comes with its own documentation and we recommend you read it 
+   (/opt/Zope-2.10.5/web/Products/FileSystemStorage/README.txt). Create folders for
+   storage and backup. We suggest setting things up in the following way:
+   ::
+
+      cd /opt/Zope-2.10.5/web/var
+      mkdir fss_storage
+      mkdir fss_backup
+
+   Now edit the filesystemstorage.conf.in configuration file for FileSystemStorage located 
+   in /opt/Zope-2.10.5/web/Products/FileSystemStorage/etc. There are several configuration 
+   options here (see README.txt), but most can be left at the default. We suggest a 
+   hierarchical file structure, which can be set up by uncommenting and editing this line:
+   ::
+
+      # storage-strategy flat
+      change to:
+      storage-strategy site1
+
+   Zope needs to be able to write to the log directory, and its database files. To
+   enable this enter the following:
+   ::
+
+      cd /opt/Zope-2.10.5/web
+      sudo chgrp -R zope log var
+      sudo chmod -R g+w log var
+
+   The last bit of configuration that needs to be done is to edit the zope.conf file.
+   found in the *etc/* directory of your Zope Instance. Uncomment and edit the 
+   following settings:
+   ::
+
+      effective-user zope
+
+   And set the default port you want the Zope server to run on:
+   ::
+
+      <http-server>
+        # valid keys are "address and "force-connection-close"
+        address 8080
+        # force-connection-close on
+      </http-server>
+
+7. Apply Security Patch
+
+   Plone's Security Panel is broken for Products that add Roles that come alphabetically
+   before 'Anonymous'. eduCommons adds the Administrator Role, which breaks the Security 
+   Panel.  This is a documented bug (http://dev.plone.org/plone/ticket/7690).
+
+   In order to remedy this problem, apply the patch found in the eduCommons/extras folder.
+   Copy the patch to /opt/Zope-2.10.5/web/lib/python/plone/app/controlpanel. 
+   ::
+
+      cd /opt/Zope-2.10.5/web/lib/python/plone/app/controlpanel
+      cp /opt/Zope-2.10.5/web/Products/eduCommons/extras/plone.app.controlpanel.security.py.patch .
+
+   Apply the patch by running the following command:
+   ::
+
+      patch -p0 < plone.app.controlpanel.security.py.patch
+
+   You may get this message: "can't find file to patch at input line 1 Perhaps you used 
+   the wrong -p or --strip option? File to patch:" Enter the following:
+   ::
+
+      security.py
+
+8. Overwrite Kupu's html2captioned transform
+
+   Kupu allows for dynamically generated captions on inserted images. eduCommons utilizes
+   this feature to provide license and copyright holder information for embedded images 
+   in documents.  In order for this functionality to occur, the default transformation 
+   must be customized
+   ::
+
+      cp /opt/Zope-2.10.5/web/Products/eduCommons/extras/html2captioned.py /opt/Zope-2.10.5/web/Products/kupu/plone
+
+
+II. Configuration Steps
+-----------------------
+
+1. Launch Zope
+
+   Once Zope has been properly configured it can then be launched via the following
+   commands:
+   ::
+
+      cd /opt/Zope-2.10.5/web
+      sudo bin/zopectl start
+
+   You should now be able to open a browser and go to the ZMI with the following URL
+   (assuming that you configured Zope to run on port 8080)
+   ::
+
+      http://<server name>:8080/manage
+
+   You should then get a dialog prompt asking for your Zope admin username and password.
+
+2. Install eduCommons Product
+
+   Once you have logged into the ZMI via the management interface, you are now ready 
+   to create the site. Start by creating a plone site with the pull down menu in the 
+   top right corner. Give the plone site an ID and title. The ID will be used in the 
+   URL to access the site, so name it appropriately. The title will appear several 
+   places within the eduCommons install, and should be based on your group or institution.
+
+   Under "Extension Profiles" you need to do a multi-select (hold down the CTRL or the 
+   Apple key). Select Working Copy Support (Iterate), ContentLicensing, IMSTransport, LinguaPlone,
+   PloneBookmarklets, Zip File Transport, eduCommons, and Left Skin so they are all highlighted.
+   Then click "Add Plone Site."
+
+   Once the eduCommons instance has been created, you will need to QuickInstall the FileSystemStorage Product.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_quickinstaller
+       3. Select the checkbox to the left of FileSystemStorage
+       4. Click Install
+
+   If you wish to localize content in other languages you will need to QuickInstall install LinguaPlone.
+   This can be done either now from the ZMI or later, via Site Setup --> Add-on Products.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_quickinstaller
+       3. Select the checkbox to the left of LinguPlone
+       4. Click Install
+
+   If you have installed LinguaPlone you will also need to select your supported languages.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_languages
+       3. Select one or more Allowed languages (use the control or apple key to multi-select)
+       4. Click Save 
+
+   Additional instructions for localizing content using LinguaPlone are available in LOCALIZATION.txt.
+
+   Finally, you need to reorder the Layers in your eduCommons Skins Selections.
+   In the ZMI:
+   ::
+
+       1. Navigate to your eduCommons instance
+       2. Navigate to portal_skins
+       3. Click on the Properties tab
+       4. Under the Skins Selections, in the Layers textbox for LeftSkin, cut the LinguaPlone entry 
+          and paste it one a new line below the eduCommons entry 
+       5. Click Save (be sure to click the Save button for the Skins selection section)
+
+3. Configure eduCommons
+
+   Additional configuration information is provided in SETUP.txt (or online at
+   http://cosl.usu.edu/projects/educommons/documentation/how-to/educommons-setup-instructions).
+   This will help you to further customize eduCommons.
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/LOCALIZATION.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/LOCALIZATION.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/LOCALIZATION.txt	(revision 126)
@@ -0,0 +1,165 @@
+====================================
+LinguaPlone Translation Instructions
+====================================
+
+In the context of Department, Course, and ECObjects, translations must occur in a 'top down'
+manner.  A Department must be translated prior to translating a Course, which must be
+translated prior to any objects in the Course being translated.
+
+By default, LinguaPlone will tag newly created content objects in the default language setting 
+for the instance. Objects that exist in the ZODB prior to LinguaPlone being installed will be 
+'neutral', in terms of their language setting. In order to maintain the correct relationships 
+between languages, existing objects must have their language 'set'. 
+
+To set an existing object's language, click translate into on the management toolbar, and then 
+click manage translations.... This interface will allow you to change the content language 
+setting from neutral to the appropriate setting for your instance.  
+
+
+========================================
+Localization with eduCommons $$version$$
+========================================
+
+Overview
+--------
+If you want to translate eduCommons into your language, here are instructions on how to get 
+started, as well as some guidelines that you should follow when performing a translation. You do
+not need to know anything about programming to create an eduCommons translation. This 
+has been adapted for eduCommons from the `plone translator guidelines 
+<http://plone.org/development/teams/i18n/translators-guidelines>`__. Please see our `eduCommons
+Localization Team page <./educommons-localization-team>`__ for a list of our volunteer translators.
+
+Introduction
+------------
+Since eduCommons is customized from Plone, it has built-in support for internationalization. As of 
+June 2006 Plone has 56 different translations. eduCommons requires some additional 
+translation work, but follows the same process as Plone. Adding an eduCommons translation is much 
+less time consuming because most of the translation work has already been done in Plone.
+
+There are about 400 strings needed for a translation of eduCommons (compared to about 1600 strings 
+for a Plone translation). Some of these are sentences or paragraphs, but the major part are one or 
+two words. These strings are scattered around in Plone, for example in page templates. Other items 
+to translate are widget labels, and workflow states. All those strings are collected in master 
+files. Currently eduCommons contains six .pot files. Each language requires its own .po files that
+corresponds to the strings or message ids declared in the .pot files. The .pot is the blueprint for
+the .po files.
+
+
+Tools
+-----
+When creating the .po files, we strongly recommend using a specialized tool called poEdit 
+(http://www.poedit.net). This makes the translation process very easy. But a normal 
+text editor work fine if you prefer that (both vim and emacs are great for this, and have special 
+modes for PO files). poEdit exists for both Linux and Windows, and Mac OS X.
+
+If you use a plain text editor instead of a dedicated tool, you should make sure you use utf-8 
+as your charset, even if your country usually uses iso-8859-* or similar. The reason for this is 
+that Plone uses a few characters (like the ellipsis) that don't have representations in other 
+charsets.
+
+
+Step-by-step guide
+------------------
+    1. Check if somebody is working on your language already. Even if they do, contact them and 
+    offer to help with testing. There's no way the eduCommons team can know what is a high-quality 
+    translation in a language they don't know, so your input is very valuable to us. We want 
+    good translations, not just a translation. So if you think something is badly done, tell us. 
+    Give polite feedback if something feels wrong with the translation to your language. A 
+    translation can always be made better.
+    
+    2. Be sure that you have used eduCommons enough to grasp the general concepts and how they 
+    interact. eduCommons is an advanced system, so be sure you know enough before you start 
+    translating key concepts like workflow. Check the language specific terms for your language, 
+    or create one if it doesn't exist. This will help you keep consistent translations for your 
+    language.
+    
+    3. Download the files to base your translation on. We recommend that you always use the 
+    English language files as your starting point, both because they are always the most current 
+    ones (other translations will usually lag a bit behind), and because you should try to match 
+    the original text. Translating between similar languages may be tempting (like Danish and 
+    Norwegian), but will usually result in a lower quality translation. Of course, if the only 
+    language you understand is Italian, and you want to provide a Chinese translation, we prefer 
+    this translation compared to not getting one at all :)
+    
+    4. Here is a link to the most recent translation files available for eduCommons (plone.po and 
+    eduCommons.po). Remember, unless there is already an existing translation available, you need 
+    to grab the .pot files.
+ 
+	http://cosl.usu.edu/svndev/eduCommons3/trunk/i18n/
+	
+	Here are links to the latest translations for each of the eduCommons products on the Plone 
+	Collective site (these links may change, so check back for the most accurate information): 
+
+	http://svn.plone.org/svn/collective/ZipFileTransport/branches/cosl-plone3/i18n/ 
+
+	http://svn.plone.org/svn/collective/IMSTransport/branches/cosl-plone3/i18n/ 
+
+	http://svn.plone.org/svn/collective/ContentLicensing/branches/cosl-plone3/i18n/
+
+        http://svn.plone.org/svn/collective/PloneBookmarklets/branches/plone3/i18n/
+    
+    
+    5. Open poEdit or your editor of choice and load the first of the master files. In poEdit 
+    select File --> Open (for existing .po translation files) or File --> New catalog from POT file. 
+    (to create a new translation from a .pot file). Be sure to set the language and language code in 
+    Catalog --> Settings. With poEdit or other editors you will need to save your new translation files 
+    as <product>-<language-code>.po (e.g. for a French translation: plone-fr.po, eduCommons-fr.po, etc). 
+    Have a look at http://www.i18nguy.com for the correct language code.
+
+    6. In poEdit, the first line shows the exact string that you have to translate. Your translation is 
+    entered in the area below the original string. It's easy. This is why we recommend poEdit.
+    
+    7. In other text editors things will look a little different. An example section can look like this:
+
+      |   #. Default: "Export"
+      |	  #: ../skins/eduCommons/Export_form.cpt
+      |	  msgid "Export"
+      |	  msgstr ""
+      |
+      
+      The first line (marked with Default) shows the exact string that you have to translate. 
+      Message attributes in the form ${foo} have to be included in the translated string exactly 
+      as they are. These are variables that will be filled in the rendering process. Do not touch 
+      this.
+    
+      The next lines (marked with :) list which templates inside eduCommons use this string. There 
+      might be several templates re-using the same string, but it is normally in the same context. 
+      Do not touch this.
+    
+      The next to last line (starting with msgid) holds the unique identifier for the string. Do 
+      not touch this.
+    
+      Finally, the last line is where your job starts. Enter the text in your language, be careful 
+      to keep the same casing (where appropriate, some languages have different rules that should 
+      be applied).
+    
+    8. If there is programming code in a string, only translate the string, not the code. For example in, 
+    Default: "${number} items matching your criteria." you would only translate "items matching your 
+    criteria." The code in the first part should be left as it is, so the translation will look like this:  
+    ${number} TRANSLATION.
+
+    9. Keep translating (but take breaks, this isn't done in one sitting - it's repetetive (but 
+    rewarding) work. After you have translated all of plone.pot, you should start on eduCommons.pot. 
+    Don't worry, you have already completed the biggest part.
+    
+    10. If you can, test your files. Get other people from your own country to test. This means having other 
+    people check your file and putting your file in an eduCommons test instance, browsing it in 
+    your language.
+    
+    11. If you are unsure about the best translation of a message, you can set it to fuzzy, so 
+    others can look at these. Setting a message to fuzzy means adding a "#, fuzzy"-line directly 
+    above the line starting with msgid (poEdit has a button for this).
+    
+    12. Since some of the translation files are hosted on the Plone Collective, if you know how SVN
+    works, you can get an account with Plone (Here's how to request write access to the Collective.)
+    and maintain the files in SVN yourself (see next section). If not, no problem, just e-mail your
+    translation to us at eduCommons [at] cosl [dot] usu [dot] edu, and we will add it for you and put it into the
+    eduCommons distribution in the next release. We will also add you to our our `eduCommons
+    Localization Team page. <./educommons-localization-team>`__
+    
+    13. Please check on your translations periodically to keep them updated as new versions are 
+    released. A quick find for "" will reveal any new or missing stings that need to be translated.
+    
+    14. If you have other questions or about contributing a translation to eduCommons please contact
+    us at educommons [at] cosl [dot] usu [dot] edu. Thank you for you help!
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/MIGRATION.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/MIGRATION.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/MIGRATION.txt	(revision 126)
@@ -0,0 +1,82 @@
+===================================
+Migrating to eduCommons $$version$$
+===================================
+
+
+Preparation
+-----------
+A few things you should do before beginning the migration:
+
+  1. VERY IMPORTANT: SAVE A BACKUP OF YOUR Data.fs FILE, which is located in the [old instance home]/var directory of your eduCommons site. This file contains all of the content for your site. (This way you will able to restore your file from this Data.fs file if anything goes wrong.)
+
+  2. Using the Zope Management Interface (ZMI), export any customizations you have made in your [old site] --> portal_skins --> custom folder and then delete all files in the custom folder. You can re-import these customizations once you have migrated the site.
+
+  3. Verify that your current instance is eduCommons-3.0.2-final.
+
+
+Migration of eduCommons 3.0.2-final to $$version$$
+--------------------------------------------------
+
+The migration eduCommons from version 3.0.2-final to version $$version$$
+includes the following:
+
+  1. Movement of Data.fs file to a new $$version$$ instance
+
+  2. Migration to Plone 3.0.6
+
+  3. Migration to the eduCommons $$version$$ instance
+
+  4. Final steps
+
+Movement of Data.fs file to a new $$version$$ instance
+------------------------------------------------------
+
+For the first step, you will move the Data.fs file from the old instance to
+the new instance. First of all, install an eduCommons-$$version$$
+instance using the installations instructions found in [new instance home]/eduCommons/docs/. Stop both sites. Then
+copy the Data.fs file from the var directory of the old site to the
+var directory of the new site:
+::
+
+  sudo cp -rvfp [old instance home]/var/Data.fs [new instance home]/var/
+
+
+Migration of Plone
+------------------
+The following steps need to be performed in the ZMI, as eduCommons-$$version$$ utlizes Plone 3.0.6, instead of 3.0.4:
+
+  1. Open your $$version$$ eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)
+
+  2. Run portal_migration migration (click the upgrade button on the migrate tab)
+
+
+Installation of FileSystemStorage Product
+-----------------------------------------
+At this point in time, we need to ensure that the FileSystemStorage AddOn Product is installed:
+
+  1. Open your $$version$$ eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)
+
+  2. Navigate to portal_quickinstaller
+ 
+  3. Select FileSystemStorage
+
+  4. Press Install
+
+Migration of the eduCommons $$version$$ instance
+------------------------------------------------
+eduCommons $$version$$ uses the portal_setup tool to perform the necessary upgrade from 3.0.2 to $$version$$:
+
+  1. Open your $$version$$ eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)
+  2. Navigate to portal_setup
+  3. Press the 'Upgrades' tab
+  4. From the drop down menu, select 'Products.eduCommons:default' and click Choose Profile button.
+  5. Choose the 'Migration :: 3.0.2 to 3.1.0' option
+  6. Press Upgrade
+
+
+Final Steps
+-----------
+
+  Your site should now be migrated. Navigate to your site in the browser and ensure it has migrated.
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/MIGRATIONS_OLD.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/MIGRATIONS_OLD.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/MIGRATIONS_OLD.txt	(revision 126)
@@ -0,0 +1,133 @@
+===================================
+Migrating to eduCommons 3.0.2
+===================================
+
+
+Preparation
+-----------
+A few things you should do before beginning the migration:
+
+  1. VERY IMPORTANT: SAVE A BACKUP OF YOUR Data.fs FILE, which is located in the [old instance home]/var directory of your eduCommons site. This file contains all of the content for your site. (This way you will able to restore your file from this Data.fs file if anything goes wrong.)
+
+  2. Using the Zope Management Interface (ZMI), export any customizations you have made in your [old site] --> portal_skins --> custom folder and then delete all files in the custom folder. You can re-import these customizations once you have migrated the site.
+
+  3. Verify that your current instance is eduCommons-2.3.1-final.
+
+
+Migration of eduCommons 2.3.1-final to 3.0.2
+--------------------------------------------------
+
+The migration eduCommons from version 2.3.1-final to version $$version$$
+includes the following:
+
+  1. Pre-migration of Data.fs in version 2.3.1-final
+
+  2. Movement of Data.fs file to a new 3.0.2 instance
+
+  3. Migration of Plone 3.0.4
+
+  4. Migration of the eduCommons $$version$$ instance
+
+  5. Final steps
+
+Pre-migration of Data.fs in version 2.3.1-final
+-----------------------------------------------
+
+For this step, you will need to copy the migration source code found in version $$version$$.  The file is located at eduCommons/extras/PreMigrate.py .
+Copy this into [old instance]/Products/eduCommons/Extensions.
+
+Run the migration script by following these steps:
+
+  1. Open your 2.3.1-final eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)
+
+  2. From the drop down menu, select "External method" and click the Add button.
+
+  3. Enter the following parameters:
+
+     * Id: Pre_Migrate_eduCommons3.0.2
+     * Title: Pre_Migrate_eduCommons3.0.2
+     * Module Name: eduCommons.Migrate
+     * Function Name: pre_migrate_2_3_1_to_3_0_2
+
+  4. Click Add
+
+  5. Click on the Pre_Migrate_eduCommons3.0.2 script you just added
+
+  6. Click the test tab.
+
+  7. Verify that the method ran successfully. (It should give you feedback.)
+
+
+Movement of Data.fs file to a new 3.0.2 instance
+------------------------------------------------------
+
+For the next step you will move the Data.fs file from the old instance to
+the new instance. First of all, install an eduCommons-3.0.2
+instance using the installations instructions found in [new instance home]/eduCommons/docs/. Stop both sites. Then
+copy the Data.fs file from the var directory of the old site to the
+var directory of the new site:
+::
+
+  sudo cp -rvfp [old instance home]/var/Data.fs [new instance home]/var/
+
+
+Migration of Plone
+------------------
+The following steps need to be performed in the ZMI, as eduCommons-$$version$$ utlizes Plone 3.0.4, instead of 2.5.x:
+
+  1. Open your 3.0.2 eduCommons site in the ZMI. (click educommons setup, then click Zope Management Interface.)
+
+  3. Run portal_migration migration (click the upgrade button on the migrate tab)
+
+
+Migration of the eduCommons 3.0.2 instance
+------------------------------------------------
+Run the migration script included with the $$version$$ instance by following these steps:
+
+  1. Copy the migration script found in Products/eduCommons/extras/Migrate.py to [new_instance]/Extensions/
+  2. Open your $$version$$ eduCommons site in the ZMI. (click educommons Setup, then click Zope Management Interface.)
+  3. Navigate to the root of the ZMI (click the Root Folder link located in the upper left portion of the page)
+  4. From the drop down menu, select "External method" and click the Add button.
+  5. Enter the following parameters:
+
+     * Id: Migrate_eduCommons3.0.2
+     * Title: Migrate_eduCommons2.0.2
+     * Module Name: Migrate
+     * Function Name: migrate_2_3_1_to_3_0_2
+
+  4. Click Add
+  5. Click on the Migrate_eduCommons3.0.2 script you just added
+  6. Click the test tab.
+  7. Verify that the method ran successfully. (It should give you feedback.)
+
+
+Final Steps
+-----------
+
+  Your site should now be migrated. Navigate to your site in the browser and ensure it has migrated.
+  Based on the nature of the changes from Plone 2.5.x to Plone 3.0.4, if you performed major customizations, you may or may not need to refactor those changes to work properly in a Plone 3 environment.
+
+  Here are some additional steps you may need to follow after migration, depending on how you have customized your site:
+
+  1. Check Course Homepage and About the Professor pages to see if the images render. In past versions of eduCommons, some of these image links may be broken, but rendered due to acquisition. The course folder appears twice in the link (i.e. department/course/course/page).
+
+  2. The Site homepage links to the Courses List, Frequently Asked Questions, and Help will need to be modified as follows:
+
+     * OLD: <a title="List of Courses" href="/Courses_listing/">list of courses</a>.
+     * NEW: <a title="List of Courses" href="/courselist/">list of courses</a>.
+     * OLD: <a title="Frequently Asked Questions" href="/Help/">Frequently Asked Questions</a>
+     * NEW: <a title="Frequently Asked Questions" href="/help/">Frequently Asked Questions</a>
+     * OLD: <a title="Feedback" href="/Feedback/">feedback</a>
+     * NEW: <a title="Feedback" href="/feedback/">feedback</a>
+
+  3. The Site's About page links to the Terms of Use and Privacy Policy will need to be modified as follows:
+
+     * OLD: <a title="Terms of Use" href="../About/terms_of_use">Terms of Use</a>
+     * NEW: <a title="Terms of Use" href="../about/terms_of_use">Terms of Use</a>
+     * OLD: <a title="Privacy Policy" href="../About/privacy_policy">Privacy Policy</a>
+     * NEW: <a title="Privacy Policy" href="../about/privacy_policy">Privacy Policy</a>
+
+  4. The top banner, portal logo, and top nav color setting can be checked and adjusted by managers and administrators via Site Setup --> Left Skin Settings. Any changes made to these settings must be done after having checked the Development Mode box. In order to change the background color in the top nav color, a 1px x 1px transparent gif needs to be loaded first to hide the top nav background image. Be sure to uncheck the Development Mode box after Left Skin changes have been saved to improve site performance.
+
+  5. In order to restore the "Join" link, login to the site as manager and click Site Setup --> Security. Then check the "Enable self-registration" box and click save.
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/Makefile
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/Makefile	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/Makefile	(revision 126)
@@ -0,0 +1,47 @@
+# Makefile for eduCommons Documentation
+
+PYTHON=/usr/local/bin/python
+RST2HTML=/usr/local/bin/rst2html.py
+RST2LATEX=/usr/local/bin/rst2latex.py
+LATEX=/usr/bin/latex
+DVIPDF=/usr/bin/dvipdf
+HTMLDOCS=../INSTALL.html ../CHANGES.html ../MIGRATION.html ../MIGRATIONS_OLD.html ../IMSContentPackaging.html ../LOCALIZATION.html ../SETUP.html ../PORTLETS.html ../SeleniumRCTests.html
+STYLESHEET=./default.css
+PDFDOCS=../INSTALL.pdf ../CHANGES.pdf ../MIGRATION.pdf ../MIGRATIONS_OLD.pdf ../IMSContentPackaging.pdf ../LOCALIZATION.pdf ../SETUP.pdf ../PORTLETS.pdf ../SeleniumRCTests.pdf
+TEXTDOCS=../INSTALL.txt ../CHANGES.txt ../MIGRATION.txt ../MIGRATIONS_OLD.txt ../IMSContentPackaging.txt ../LOCALIZATION.txt ../SETUP.txt ../PORTLETS.txt ../SeleniumRCTests.txt
+
+all: htmldocs pdfdocs
+
+htmldocs: $(HTMLDOCS) ../$(STYLESHEET)
+
+pdfdocs: $(PDFDOCS)
+
+textdocs: $(TEXTDOCS)
+
+install: $(TEXTDOCS)
+	mv ../*.txt ../../.
+	
+
+../%.pdf: %.dvi
+	$(DVIPDF) $< $@
+
+%.dvi: %.tex
+	$(LATEX) $<
+	$(LATEX) $<
+
+%.tex: ../%.txt
+	$(RST2LATEX) $< $@
+
+../%.html: ../%.txt ../$(STYLESHEET)
+	$(RST2HTML) --stylesheet=$(STYLESHEET) $< $@
+
+../%.css: %.css
+	cp $< ../.
+
+../%.txt: %.txt
+	cp $< ../.
+	$(PYTHON) makedocs.py $@
+
+clean:
+	-rm ../*.pdf ../*.html ../*.css ../*.txt ../*.out
+	-rm *.log *.aux *~ *.out
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/PORTLETS.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/PORTLETS.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/PORTLETS.txt	(revision 126)
@@ -0,0 +1,202 @@
+Adding Portlets To eduCommons
+------------------------------
+
+A portlet is a user-interface component that can be "plugged-in" to the architecture of Plone, the framework upon which eduCommons is based. There are several portlets that are natively available when you install eduCommons: the Course Info portlet that appears in the right navigation is an example, the Course Builder portlet is another. This tutorial will explain how portlets can be added and removed and how you can create your own portlet from scratch.
+
+- `Adding and Removing Existing Portlets`_
+
+- `Creating Your Own Portlet`_.
+
+- `Customizing Portlets`_.
+
+- `OerRecommender Portlet`_.
+
+- `CourseBuilder Portlet`_.
+
+- `CourseInfo Portlet`_.
+
+- `Additional Resources`_.
+
+.. _Adding and Removing Existing Portlets:
+
+Adding and Removing Existing Portlets
+-------------------------------------
+If a portlet already exists that you either want to remove or add, follow these steps.
+
+- navigate to the site as an administrator.
+- click on the *manage portlets* link. 
+
+The *manage portlets* page allows you to add and remove portlets. 
+
+- To add a portlet click on the *Add portlet...* drop down menu and select the portlet to add. 
+- To delete a portlet click on the small red *x* next to the portlet to remove.
+
+You can also change the order that the portlets appear by using the small blue arrows next to the porlets.
+
+.. _Creating Your Own Portlet:
+
+Creating Your Own Portlet
+-------------------------
+One of the simplest ways to create a portlet is to use the ZopeSkel tool to create a skeleton product that you can then modify for your own purposes. The Plone site has an `excellent article describing how to install and use the ZopeSkel tool`_. Once you have ZopeSkel installed you can create a new portlet package using the plone3_portlet template.
+
+.. _excellent article describing how to install and use the ZopeSkel tool: http://plone.org/documentation/how-to/use-paster/
+
+::
+
+  paster create -t plone3_portlet
+
+Enter the information, as prompted, for the portlet you are creating. To select the defaults, just press enter.
+
+::
+
+  Enter project name: SamplePortletProject
+  Variables:
+    egg:      SamplePortletProject
+    package:  sampleportletproject
+    project:  SamplePortletProject
+  Enter namespace_package (Namespace package (like plone)) ['collective']: sample_portlet_project 
+  Enter namespace_package2 (Nested namespace package (like app)) ['portlet']: 
+  Enter package (The package contained namespace package (like example)) ['example']: 
+  Enter zope2product (Are you creating a Zope 2 Product?) [True]: 
+  Enter version (Version) ['0.1']: 
+  Enter description (One-line description of the package) ['']: This is a sample portlet product
+  Enter long_description (Multi-line description (in reST)) ['']: 
+  Enter author (Author name) ['Plone Foundation']: 
+  Enter author_email (Author email) ['plone-developers@lists.sourceforge.net']: 
+  Enter keywords (Space-separated keywords/tags) ['']: 
+  Enter url (URL of homepage) ['http://plone.org']: 
+  Enter license_name (License name) ['GPL']: 
+  Enter zip_safe (True/False: if the package can be distributed as a .zip file) [False]: 
+  Enter portlet_name (Portlet name (human readable)) ['Example portlet']: Sample Portlet
+  Enter portlet_type_name (Portlet type name (should not contain spaces)) ['ExamplePortlet']: SamplePortlet
+
+A portlet package will be created in the folder where you ran the script. Follow the directions in the Plone article to install the new portlet package using easy_install. Another option is to tell the paster script to create a Plone 2 product and then copy this product into the Products directory of your plone instance (the Plone 2 product is buried down a few levels in the package). In either case, after you restart your Plone instance and navigate to the *Add-on Products* page of your Plone site you will see the new product listed. After installing the product into your Plone site you will be able to manage it as you do the other portlets in your site.
+
+
+.. _Customizing Portlets:
+
+Customizing Portlets
+----------------------
+
+If you look at the code, generated in the last section, you will see that this new product is relatively simple. It contains a configure.zcml file, a template file, a python file, a profile folder, and a tests folder. Often the only places that will need to be changed to customize the portlet will be the template file and the renderer within the python file. Here are some examples of portlets that do just that:
+
+.. _OerRecommender Portlet:
+
+OerRecommender Portlet
+======================
+This is the oerrecommender.pt_ template file for the oerrecommender. The file consists of a script tag that retrieves a series of recommendations from oerrecommender.org. 
+
+::
+    
+  <div id="recommendations">
+    <script language="JavaScript"
+            tal:define="url here/absolute_url"
+            tal:attributes="src string:http://www.oerrecommender.org/recommendations.pjs?educommons=true&u=${url}&title=true;"
+            type="text/javascript">
+    </script>
+  </div>
+
+.. _oerrecommender.pt: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/oerrecommender.pt
+
+Here is the renderer for the oerrecommenderportlet.py_ file.
+
+::
+
+  class Renderer(base.Renderer):
+      """ Render the OER Portlet """
+      render = ViewPageTemplateFile('oerrecommender.pt')
+
+      def __init__(self, context, request, view, manager, data):
+          super(Renderer, self).__init__(context, request, view, manager, data)
+          self.props = self.context.portal_properties.educommons_properties
+
+      @property
+      def available(self):
+          return self.props.oerrecommender_enabled
+
+.. _oerrecommenderportlet.py: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/oerrecommenderportlet.py
+
+You'll notice that the renderer is where we define which page template to use when rendering the template. This file also contains a property that allows the portlet to be conditionally displayed based on whether the oerrecommender is enabled.
+
+.. _CourseBuilder Portlet:
+
+CourseBuilder Portlet
+======================
+The Course Builder tool allows users to quickly create a course with its associated files and departments.  In this coursebuilder.pt_ template file you can see the portlet displaying a link to the Course Builder form (the '@@' symbol signifies that the resource is a view).
+
+.. _coursebuilder.pt: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/coursebuilder.pt 
+
+::
+
+  <dl class="portlet portletCourseBuilder"
+      i18n:domain="eduCommons">
+
+    <dt class="portletHeader"
+        i18n:translate="box_course_builder">
+      Course Builder
+    </dt>
+
+    <dd class="portletItem even">
+      <a href=""
+           i18n:translate="text_build_course"
+           tal:attributes="href string:${here/portal_url}/@@coursebuilderform">Build a Course</a>
+    </dd>
+
+  </dl>
+
+.. _CourseInfo Example:
+
+CourseInfo Portlet
+======================
+The CourseInfo portlet displays course statistics for the objects within each course. Methods are defined with the python file that are then used with the template file. For example, the renderer for the portlet in the courseinfoportlet.py_ file contains several methods
+
+.. _courseinfoportlet.py: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/courseinfoportlet.py 
+
+::
+
+  ...
+  def statePercent(self, state=''):
+    """ return the percent value for a given state """
+
+    if 0 == self.total:
+      return '0%'
+    else:
+      width = float(self.stateCounts[state])/float(self.total) * 100.0
+      return '%d%%' %int(width)
+  ...
+
+that are then used in the courseinfo.pt_ template file.
+
+::
+
+  ...
+      <img alt="barchart" class="statecolumnimage"
+                   tal:attributes="width python:view.statePercent(item);
+                   src string:bargraphic.gif" />
+  ...
+
+
+.. _courseinfo.pt: http://cosl.usu.edu/svndev/eduCommons3/tags/3.1.0-final/portlet/courseinfo.pt 
+
+.. _Additional Resources:
+
+Additional Resources
+--------------------
+
+There are some great resources to help you in customizing existing portlets and for adding functionality to portlets that you've created using the ZopeSkel product.
+
+If you would like to do some quick and dirty customization through-the-web you'll probably want to `use the portal_view_customizations tool`_ in the ZMI. It's similar to portal_skins but for view, viewlets, and portlets.
+
+.. _use the portal_view_customizations tool: http://plone.org/documentation/tutorial/customization-for-developers/tutorial-all-pages
+
+Martin Aspeli has a whole tutorial on customizing a plone site which includes a section on `customizing portlet renderers`_.
+
+.. _customizing portlet renderers: http://plone.org/documentation/tutorial/customization-for-developers/portlet-renderers
+
+The Plone site also has a tutorial that shows how to `override existing portlets`_.
+
+.. _override existing portlets: http://plone.org/documentation/how-to/override-the-portlets-in-plone-3.0/?searchterm=add%20new%20portlet
+
+
+
+ 
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/SETUP.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/SETUP.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/SETUP.txt	(revision 126)
@@ -0,0 +1,149 @@
+Table of Contents
+=================
+
+
+`How To Setup eduCommons`_
+
+`Add/Remove Products`_
+
+`Customizing eduCommons Skin`_
+
+`Mail Settings`_
+
+`Site Settings`_
+
+`Setting the Default Language for your Site`_
+
+`Search Settings`_
+
+`Adding Users/Assigning Roles`_
+
+`Customizing Default Pages`_
+
+`Setting a Default Site-Wide Copyright License`_
+
+`Other Customizations`_
+
+
+This documentation assumes that you have already successfully installed eduCommons and are now ready to set it up for use. If you have not yet have a running instance of eduCommons, you may want to refer back to the installation instructions first. They can be found here_, or in a file titled "INSTALL.txt" in the root of the eduCommons software tarball. Check to make sure that the version of the documentation matches the version of software you are attempting to install.
+
+.. _here: ./installation-instructions
+
+How To Setup eduCommons
+=======================
+
+Most of the settings described below can be found by clicking on the *Site Setup* link found in the upper right corner of every page. If you do not see this link, it is most likely because you are not logged in as an administrator, or a manager. Also some of the links described below are only available to managers, and will not appear when logged in as an administrator. If you have not yet done any configuration on the site, use the username and password you used to create your Zope instance during installation. This account should automatically assume a manager role. More information about users and roles can be found below in the section titled `Adding Users/Assigning Roles`_.
+
+
+Add/Remove Products
+===================
+
+By default when you install eduCommons all additional addons and products will be installed at the same time. It may be necessary to integrate additional Plone packages into eduCommons. If this is the case for you, use the *Add/Remove Products* link to do so. You should note that this is definitely within the realm of advanced functionality, and it is likely that more work will need to be done to make any additional packages work correctly with eduCommons. The good news is that for the majority of users, there is no need to add any additional products in order for your instance of eduCommons to function correctly.
+
+
+Customizing eduCommons Skin
+===========================
+
+You can customize the look and feel of your eduCommons site by selecting the *Left Skin* link from within Site Setup. This is a great place to add any institutional branding that may be required for your site. From here you can adjust the colors and images of your eduCommons instance, as well as provide replacement banners and images. Details as to what can be set, and how to set it are included in the form. Any changes made to these settings must be done after having checked the Development Mode box. In order to change the background color in the top nav color, a 1px x 1px transparent gif needs to be loaded first to hide the top nav background image. Be sure to uncheck the Development Mode box after Left Skin changes have been saved to improve site performance.*Remember: you may need to clear your browser's cache in order to see updates made using this form*.
+
+
+Mail Settings
+=============
+
+eduCommons has a couple of ways to record and verify user email addresses. It also uses email as a primary mechanism for providing you with feedback from users of your site. In order to take advantage of this functionality, it is necessary configure eduCommons to be able to use an email server, and to provide a username/email address which can receive email. 
+
+Registration
+------------
+
+By default, eduCommons provides a Log in link, but not a Register link. To enable registration on the site, you much login as a manager or administrator. A Site Setup link will appear in the top right corner of the screen. Click on the Security settings link and check the box next to "Enable self-registration." Be sure to set the Mail Settings in the section below. 
+
+Mailhost Settings
+-----------------
+
+eduCommons provides email settings via the *Site Setup* link found in the upper right corner. You must be logged in as a manager or administrator in order for the appropriate settings to appear. Once you have clicked on the *Site Setup* link, there should be a list of configuration options available. In the list should be a link titled *Mail*. 
+
+When you click on this link, eduCommons will give you the opportunity to specify an email server to use to send mail through. By default it is set to connect to a mailserver over the localhost network interface. It also contains extra fields to allow eduCommons to authenticate with a mail server not running locally. Care should be taken not to connect to mail servers over hostile networks (e.g. the internet) as authentication details may be passed in the clear. Currently there is not yet support for encrypted connection to mail servers. This should not be a huge limitation as long as you have access to a local mail server.
+
+If you have additional needs you can consider using sendmail or an equivalent mail server package which could run on the same server as eduCommons, which could be configured to forward mail to a trusted mail server using whatever forms of encryption that are appropriate to your situation. Much information on how to configure advanced setups such as these can easily be found on the Internet. Unfortunately further discussion on email server network topologies is beyond the scope of this documentation.
+
+Feedback
+--------
+
+eduCommons now uses a feedback form to collect feedback from users. A name and a corresponding email address can be specified in the Site Setup --> Mail, under the Mail Sender tab. Simply fill in the fields marked *Site 'From' Name* and *Site 'From' address*. 
+
+
+Site Settings
+=============
+
+The *Site Title* and *Site Description* fields should contain values that were initially set during the installation process. If you want to change these fields, you can do so here. The *Site Title* field is referred to throughout the site. It is important to remember that eduCommons will only change the portal title on a page when a template is applied. If you change this setting here, it will be necessary to also change it throughout the site, or to reapply templates that refer to it.
+
+eduCommons provides a number of settings that can be used with your site. The *Site 'From" Name* and *Site 'From' Address* are already discussed in the section titled `Mail Settings`_. 
+
+*JavaScript for web statistics support* is an area for enabling web statistics support from external providers (for e.g. Google Analytics). Paste the code snippets provided. It will be included in the rendered HTML as entered near the end of the page.
+
+The *Default Language* setting is discussed in the next section.
+
+Setting the Default Language for your Site
+==========================================
+
+Using the *Language* link you can set a default language for your site. This will have the effect of localizing all menu links, navigation and general eduCommons features into the language of your choice. 
+
+What If Only Part of the eduCommons Site Appears to be Localized?
+-----------------------------------------------------------------
+
+The software that eduCommons is built upon (Plone) supports a large number of localizations out of the box. eduCommons is a customization of this software, and has a much more limited support for additional languages. The net result of this is that if you select a language that is supported by Plone but not eduCommons, you may find that some of the items on a page are translated and some are not. If you require localization in a language we do not yet support we would be happy to work with you to help provide this functionality for your site and also to others who may need it. We are always looking for volunteers to help localize eduCommons into new languages. Please visit: http://cosl.usu.edu/projects/educommons/documentation/how-to/educommons-localization-team for more information.
+
+Search Settings
+===============
+
+eduCommons uses live AJAX enabled search functionality to display search results as you type. If you prefer to use non AJAX enabled search behavior, you can disable the live search feature by unchecking the *Enable LiveSearch* checkbox from Site Setup --> Search. All other settings should be left at their default setting.
+
+Adding Users/Assigning Roles
+============================
+
+You must be logged in as a manager or administrator to add users and assign user roles. This can be done from the *Users and Groups* link within Site Setup.
+
+After clicking *Add New User*, fill out the registration form and register the user. (If you chose to send an email to the new member, be sure you have set up eduCommons to use an email server as described in the `Mail Settings`_ section above.) Once you have set up the desired user accounts, click *Show All* from the User Overview page to display all users. From this view you can assign roles to each user using the check boxes. You may assign multiple roles to a single user if this meets your needs. 
+
+For sites with large numbers of users, you may want to use the search feature to search for the name of a user.
+
+There are also check boxes for resetting user passwords and removing users. (Please note that resetting passwords also requires eduCommons to be set up with an email server.) Once you are finished be sure to click *Apply changes*.
+
+Another way to add users is to allow self-registration via a "Join" link in the upper right-hand corner of the page. To enable this, login to the site as manager and click Site Setup --> Security. Then check the "Enable self-registration" box and click save.
+
+Customizing Default Pages
+=========================
+
+A default install of eduCommons provides a number of informational pages, namely a front page, and pages in the help and about sections. These pages are typically only meant to be place holders. You should edit these pages accordingly to fit within your institutional guidelines. The front page is meant to be a showcase for your OpenCourseware collection. You can edit and update it as often as you like. You may choose to stick with the default template, or you may change it to suit whatever need you may have.
+
+The help tab points to a page containing frequently asked questions about eduCommons. This document will need to be edited to reflect your specific institution. Also you may want to add or remove questions according to your circumstances.
+
+The about link is a place where you can add any other information about your eduCommons site. The default page links to two other important pages you will want to customize to your site. These are the *Terms of Use* and *Privacy Policy* pages. 
+
+The terms of use page contains default template text. You will probably want to either edit this text, or provide completely new text that describes your terms of use policy.
+
+The privacy policy page by default simply states that your site has not yet posted a privacy policy, and to use the feedback link to request privacy policy information. Once you have a privacy policy in place you will most likely want to replace the default text on this page.
+
+The number of pages you can have in each of these locations is not limited to the default pages provided by eduCommons. As an administrator, you can create new pages, and link to them from existing pages as much as you like. Feel free to include other pages that provide additional information to your users (or potential users) in any of these sections.
+
+Setting a Default Site-Wide Copyright License
+=============================================
+
+eduCommons contains a very powerful copyright licensing engine that can be used both to set default licenses, and to override these licenses on a per object basis. The site-wide content licensing settings can be accessed through Site Setup --> Content Licensing. The form provided can be used to change any existing settings. (Individual licensing settings can be set from the metadata of each content object.) By default, the content licensing engine is set to use a Creative Commons `Attribution-NonCommercial-ShareAlike 3.0`_ license.
+
+.. _`Attribution-NonCommercial-ShareAlike 3.0`: http://creativecommons.org/licenses/by-nc-sa/3.0/
+
+Other Customizations
+====================
+
+If you have a need for further customizations in your eduCommons site, it is possible to change things at a number of levels. This flexibility comes at a cost. The more a site is customized, the harder it is to upgrade when new versions become available. It is important to consider carefully the cost of additional functionality before you make any decisions on customizations.
+
+There are other options that are available if you find yourself needing extra functionality. The `development site`_ for eduCommons can be used to check to see if your bug is being or has been fixed, or to see what features have been scheduled for development on the `roadmap`_. There are also `forums`_ where you can post issues and get responses from the development team and/or other eduCommons users.
+
+.. _development site: http://cosl.usu.edu/trac
+.. _roadmap: http://cosl.usu.edu/trac/roadmap
+.. _forums: http://cosl.usu.edu/forums
+
+eduCommons depends on community support, and participation in the user community/development process is both appreciated and welcome.
+
+For additional documentation, including updates to these setup instructions, please visit: http://cosl.usu.edu/projects/educommons/documentation, specifically http://cosl.usu.edu/projects/educommons/documentation/how-to
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/SeleniumRCTests.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/SeleniumRCTests.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/SeleniumRCTests.txt	(revision 126)
@@ -0,0 +1,241 @@
+=========================================
+eduCommons $$version$$ SeleniumRC Testing
+=========================================
+
+:Title: eduCommons SeleniumRC Testing
+:Author: Santiago Suarez OrdoÃ±ez <santiycr @ gmail..com>
+:Copyright: This document has been placed in the public domain.
+
+.. contents::
+
+Introduction
+-------------
+
+This guide aims to help people writing and 
+running tests using the Selenium RC environment and framework
+built within eduCommons.
+
+Tests buildout
+--------------
+
+Originally, the test environment is not being 
+deployed within the production buildout.
+To create an instance in which the tests can be
+executed, you should run the buildout using the 
+test.cfg configuration::
+
+        $ ./bin/buildout -c tests.cfg
+
+Once the buildout is complete, a test runner script should
+be located inside the bin folder and a new clean instance will be
+created and prepared to run the tests.
+
+.. Note::
+
+    The plone zope instance tu use for the tests will be stored in a 
+    sepparate ZODB to ensure integrity on any production instance.
+
+Running the tests
+-----------------
+
+To run the suite of tests buldled with eduCommons, the first thing to do after
+the tests buildout has been run is to prepare an eduCommons site to test (if the the
+user doesn't have a Plone site to test, yet).
+For this to be done, you must first wake up the instance::
+
+    ./bin/instance start
+
+And then go to the ZMI and follow the procedure of creating an eduCommons Plone site.
+Once the site is ready, the user should setup the different user accounts that the tests
+will use. This accounts should have the following roles and passwords:
+
+ ====     =========   =========
+ Role      Username   Password  
+ ====     =========   =========
+ admin      admin       admin
+ producer  producer   producer
+ reviewer  reviewer  reviewer
+ qa          qa          qa       
+ publisher publisher publisher
+ viewer    viewer   viewer  
+ =======  =========   =========
+
+ Once the instance and the eduCommons test site are ready, the user can run the tests.
+
+
+The seleniumrunner script
++++++++++++++++++++++++++
+
+The selenium runner is a scipt created to find and run **selenium tests** 
+for a product.
+It receives different parameters and it's main objective is to simplify the 
+tests execution and reporting procedure.
+This script will wake-up the selenium RC server, search and run the tests
+and then shutdown the server and report the tests result.
+
+Basic tests execution
++++++++++++++++++++++
+
+To run all the selenium tests for a product (e.g. eduCommons)
+the user should pass at least two parameters:
+
+-i instance
+        The Plone site's name. This is defaulted to "educommons".
+
+-s product
+        The product in which the runner will search for tests to run.
+
+An example test execution will be::
+
+        $ ./bin/seleniumrunner -i educommonsSite -s enpraxis.educommons
+
+This will search all the **selenium** tests for the educommons product and 
+run them on http://localhost:<port_used>/educommonsSite.
+
+For running  a particular test, the -t parameter should be passed to the runner::
+
+        $ ./bin/seleniumrunner -i educommonsSite -s enpraxis.educommons -t createPage
+
+.. Note::
+    
+    Please notice that the createPage.py test should be stored in the
+    respective location and added to the __init__py file (See `Creating a test`_)
+
+Additional parameters
++++++++++++++++++++++
+
+-p port
+        Set the port in which Selenium server will communicate
+        with the tests.
+        The default if 4444.
+
+
+-b browser
+        Set the browser that will be used to run the tests.
+        **Note**: The tests written to ignore this will still
+        run using another browser. See the -f parameter to force
+        these tests to run on a specified browser.
+        The default value is: "\*firefox", but any browser supported 
+        by selenium can be used ("\*iexplore", "\*opera", even 
+        "\*firefox /path/to/firefox-bin").
+
+-f
+        Force all the tests to use the desired browser.
+
+-o 
+        Generate an HTML output as a summary of the results.
+
+for more details on this, please run::
+        
+        $ ./bin/seleniumrunner -h
+
+Creating a test
+---------------
+
+The seleniumrunner script will look for all the classes that inherit from
+unittest.TestCase on a specified package or module located under this kind of
+path::
+
+        namespace.product/namespace/product/tests/seleniumtests
+
+.. Note::
+    Notice that for adding tests to educommons' selenium tests, the path to add
+    the tests will end up being::
+
+        src/enpraxis.educommons/enpraxis/educommons/tests/seleniumtests
+
+Once the test script has been added to the tests location, it should be
+included in the run by adding an import of the test in the *__init__.py*
+file located in the same directory::
+
+        src/enpraxis.educommons/enpraxis/educommons/tests/seleniumtests/__init__.py
+
+
+For a test to be correctly executed by the seleniumrunner script,
+it must follow certain basic rules.
+
+Tests development guidelines
+++++++++++++++++++++++++++++
+
+To create a test, there are certain basic rules to follow:
+
+#) The test should inherit from unittest.TestCase class (this can be done 
+   indirectly also).
+#) The test should use certain global variables for the code to work
+   on different environments and eduCommons instances. These are:
+
+        - browser: For the browser used for the tests
+
+        - port: For the port used to communicate with the server
+
+        - url: For the url of the application under test
+
+        - instance: The Plone site name (this depends on 
+          the name used for the site's creation).
+   This variables should never be changed inside the test code, as the 
+   seleniumrunner script will set them on runtime according with the parameters
+   received.
+#) The selenium client driver used should be seleniumWrapper instead of
+   the classic selenium.py that's installed with the recipe (we will go
+   deeper on this later_).
+
+All this rules can be seen applied to the following `Example test`_.
+
+Example test
+++++++++++++
+
+The following is an example test, it can be used as the basic
+structure for future tests::
+
+        from seleniumWrapper import selenium
+        import unittest
+
+        class NewTest(unittest.TestCase):
+            def setUp(self):
+                self.verificationErrors = []
+                self.selenium = selenium("localhost", port, browser, url, instance)
+                self.selenium.start()
+            
+            def test_new(self):
+                sel = self.selenium
+                sel.login("admin","test1234")
+                # Do specific tests in here
+
+            def tearDown(self):
+                self.selenium.stop()
+                self.assertEqual([], self.verificationErrors)
+
+Notice that the test doesn't have much changes from the basic
+test exported using `Selenium IDE <http://seleniumhq.org/projects/ide/>`_,
+the firefox extension. The only differences are the import of the eduCommons
+wrapper instead of the standard selenium driver and the variables used for the 
+instanciation inside the *setUp* method.
+
+.. Note::
+
+    Please notice that the "instance" variable will have to be used in
+    each *open* command for the users to provide the correct location
+    of the eduCommons plone site to test.
+
+.. _later: 
+
+The seleniumWrapper module
+++++++++++++++++++++++++++
+
+This module is (as it's name says) a wrapper for the selenium standard lib.
+The reason why we created it is to make tests clean and easier to maintain
+by centralizing commonly used code.
+
+Some examples of common methods that the wrapper includes are:
+
+login(username, password):
+    This method wraps all the steps needed to log a user and go to the home
+    page to start a test.
+
+validate_breadcrumbs(*args):
+    This method receives multiple strings as parameters and validates that they
+    are included in the breadcrumbs. Notice that the last string received should
+    be the page where the test is located at that moment.
+
+To see the methods included in the wrapper please read the source code, it is 
+located on *enpraxis.educommons/enpraxis/educommons/tests/seleniumtests/seleniumWrapper.py*
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/default.css
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/default.css	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/default.css	(revision 126)
@@ -0,0 +1,331 @@
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:Date: $Date: 2005-09-23 15:58:00 -0600 (Fri, 23 Sep 2005) $
+:Revision: $Revision: 1964 $
+:Copyright: This stylesheet has been placed in the public domain.
+t
+Default cascading style sheet for the HTML output of Docutils.
+
+See http://docutils.sf.net/docs/howto/html-stylesheets.html for how to
+customize this style sheet.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+
+body {
+  
+  background: #B49F78;
+  margin-top: 0px;
+  font-family: Verdana, Arial, Helvetica, sans-serif;
+  text-align:center;
+}
+
+.document {
+  width: 800px;
+  margin:0 auto;
+  padding: 0 5px 0 5px;
+  color: #666;
+  background: #FFF;
+  border: 1px solid black;
+  text-align: left;
+}
+
+.document a:link, .document a:visited, .document a:hover, .document a:active {
+  color: #CC6600;
+}
+
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+/* Uncomment (and remove this text!) to get bold-faced definition list terms
+dl.docutils dt {
+  font-weight: bold }
+*/
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+   }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+   }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em }
+
+div.header {
+  clear: both;
+  font-size: smaller;
+  text-align: center;
+  
+}
+
+div.footer {
+  clear: both;
+  font-size: smaller;
+  text-align: center;
+  padding-top: 5px;
+
+}
+
+hr.footer {
+  display: none;
+}
+
+
+
+
+
+div.footer a {
+  color: #fff;
+  text-decoration: underline;
+}
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+   ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1, h1, h3, h4, h5, h6 {
+  font-size: 1em;
+}
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1.title {
+  text-align: center }
+
+h2.subtitle {
+  text-align: center }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+   ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+   ;
+  font-weight: bold }
+
+p.topic-title {
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.line-block {
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em ;
+  background-color: #eeeeee }
+
+span.classifier {
+   ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+   ;
+  font-weight: bold }
+
+span.interpreted {
+   }
+
+span.option {
+  white-space: nowrap }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid thin gray }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid thin black }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+table.docutils th.field-name, table.docinfo th.docinfo-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+tt.docutils {
+  background-color: #eeeeee }
+
+ul.auto-toc {
+  list-style-type: none }
+  
+.reference {
+  color: #FFF;
+}
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/docutils.conf
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/docutils.conf	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/docutils.conf	(revision 126)
@@ -0,0 +1,16 @@
+[general]
+# These entries affect all processing:
+source-link: yes
+datestamp: %Y-%m-%d %H:%M UTC
+generator: on
+embed-stylesheet: no
+
+[html4css1 writer]
+# These entries affect HTML output:
+stylesheet-path: stylesheets/default.css
+field-name-limit: 20
+
+[pep_html writer]
+# These entries affect reStructuredText-style PEPs:
+template: pep-html-template
+stylesheet-path: stylesheets/pep.css
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/makedocs.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/makedocs.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/makedocs.py	(revision 126)
@@ -0,0 +1,20 @@
+# Quick and dirty script to replace all instances of $$version$$ with the version number.
+
+import sys
+import string
+
+f = open('../../version.txt', 'r')
+ver = f.readline()[:-1]
+f.close()
+
+f = open(sys.argv[1], 'r')
+ft = f.read()
+f.close()
+
+nft = string.replace(ft, '$$version$$', ver)
+
+f = open(sys.argv[1], 'w')
+f.write(nft)
+f.close()
+
+print 'Done.'
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/latex.tex
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/latex.tex	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/latex.tex	(revision 126)
@@ -0,0 +1,1108 @@
+\makeatletter
+
+% Development notes at
+% http://docutils.python-hosting.com/wiki/NewLatex
+
+
+\providecommand{\Dprinting}{false}
+
+
+\providecommand{\DSearly}{}
+\providecommand{\DSlate}{}
+
+\providecommand{\Ddocumentclass}{scrartcl}
+\providecommand{\Ddocumentoptions}{a4paper}
+
+\documentclass[\Ddocumentoptions]{\Ddocumentclass}
+
+\DSearly
+
+
+\providecommand{\DSfontencoding}{
+  % Set up font encoding.
+  % AE is a T1-emulation.  It provides most characters and features
+  % as T1-encoded fonts but doesn't use ugly bitmap fonts.
+  \usepackage{ae}
+  % Provide the characters not contained in AE from EC bitmap fonts.
+  \usepackage{aecompl}
+  % Guillemets ("<<", ">>") in AE.
+  \usepackage{aeguill}
+}
+
+
+\providecommand{\DSsymbols}{%
+  % Fix up symbols.
+  % The Euro symbol in Computer Modern looks, um, funny.  Let's get a
+  % proper Euro symbol.
+  \RequirePackage{eurosym}%
+  \renewcommand{\texteuro}{\euro}%
+}
+
+
+% Taken from
+% <http://groups.google.de/groups?selm=1i0n5tgtplti420e1omp4pctlv19jpuhbb%404ax.com>
+% and modified.  Used with permission.
+\providecommand{\Dprovidelength}[2]{%
+  \begingroup%
+    \escapechar\m@ne%
+    \xdef\@gtempa{{\string#1}}%
+  \endgroup%
+  \expandafter\@ifundefined\@gtempa%
+  {\newlength{#1}\setlength{#1}{#2}}%
+  {}%
+}
+
+\providecommand{\Dprovidecounter}[1]{%
+  % Like \newcounter except that it doesn't crash if the counter
+  % already exists.
+  \@ifundefined{c@#1}{\newcounter{#1}}{}
+}
+
+\Dprovidelength{\Dboxparindent}{\parindent}
+\providecommand{\Dmakeboxminipage}[1]{%
+  % Make minipage for use in a box created by \Dmakefbox.
+  \begin{minipage}[t]{0.9\linewidth}%
+    \setlength{\parindent}{\Dboxparindent}%
+    #1%
+  \end{minipage}%
+}
+\providecommand{\Dmakefbox}[1]{%
+  % Make a centered, framed box.  Useful e.g. for admonitions.
+  \vspace{0.4\baselineskip}%
+  \begin{center}%
+    \fbox{\Dmakeboxminipage{#1}}%
+  \end{center}%
+  \vspace{0.4\baselineskip}%
+}
+\providecommand{\Dmakebox}[1]{%
+  % Make a centered, frameless box.  Useful e.g. for block quotes.
+  % Do not use minipages here, but create pseudo-lists to allow
+  % page-breaking.  (Don't use KOMA-script's addmargin environment
+  % because it messes up bullet lists.)
+  \Dmakelistenvironment{}{}{%
+    \setlength{\parskip}{0pt}%
+    \setlength{\parindent}{\Dboxparindent}%
+    \item{#1}%
+  }%
+}
+
+
+\RequirePackage{ifthen}
+\providecommand{\Dfrenchspacing}{true}
+\ifthenelse{\equal{\Dfrenchspacing}{true}}{\frenchspacing}{}
+
+
+\Dprovidelength{\Dblocklevelvspace}{%
+  % Space between block-level elements other than paragraphs.
+  0.7\baselineskip plus 0.3\baselineskip minus 0.2\baselineskip%
+}
+\providecommand{\Dauxiliaryspace}{%
+  \ifthenelse{\equal{\Dneedvspace}{true}}{\vspace{\Dblocklevelvspace}}{}%
+  \par\noindent%
+}
+\providecommand{\Dparagraphspace}{\par}
+\providecommand{\Dneedvspace}{true}
+
+
+\providecommand{\DSlinks}{
+  % Targets and references.
+  \RequirePackage[colorlinks=false,pdfborder={0 0 0}]{hyperref}
+
+  \providecommand{\Draisedlink}[1]{\Hy@raisedlink{##1}}
+  
+  % References.
+  % We're assuming here that the "refid" and "refuri" attributes occur
+  % only in inline context (in TextElements).
+  \providecommand{\DArefid}[5]{%
+    \ifthenelse{\equal{##4}{reference}}{%
+      \Dexplicitreference{\###3}{##5}%
+    }{%
+      % If this is not a target node (targets with refids are
+      % uninteresting and should be silently dropped).
+      \ifthenelse{\not\equal{##4}{target}}{%
+        % If this is a footnote reference, call special macro.
+        \ifthenelse{\equal{##4}{footnotereference}}{%
+          \Dimplicitfootnotereference{\###3}{##5}%
+        }{%
+          \ifthenelse{\equal{##4}{citationreference}}{%
+            \Dimplicitcitationreference{\###3}{##5}%
+          }{%
+            \Dimplicitreference{\###3}{##5}%
+          }%
+        }%
+      }{}%
+    }%
+  }
+  \providecommand{\DArefuri}[5]{%
+    \ifthenelse{\equal{##4}{target}}{%
+      % Hyperlink targets can (and should be) ignored because they are
+      % invisible.
+    }{%
+      % We only have explicit URI references, so one macro suffices.
+      \Durireference{##3}{##5}%
+    }%
+  }
+  % Targets.
+  \providecommand{\DAids}[5]{%
+    \label{##3}%
+    \ifthenelse{\equal{##4}{footnotereference}}{%
+      {%
+        \renewcommand{\HyperRaiseLinkDefault}{%
+          % Dirty hack to make backrefs to footnote references work.
+          % For some reason, \baselineskip is 0pt in fn references.
+          0.5\Doriginalbaselineskip%
+        }%
+        \Draisedlink{\hypertarget{##3}{}}##5%
+      }%
+    }{%
+      \Draisedlink{\hypertarget{##3}{}}##5%
+    }%
+  }
+  % Color in references.
+  \RequirePackage{color}
+  \providecommand{\Dimplicitreference}[2]{%
+    % Create implicit reference to ID.  Implicit references occur
+    % e.g. in TOC-backlinks of section titles.  Parameters:
+    % 1. Target.
+    % 2. Link text.
+    \href{##1}{##2}%
+  }
+  \providecommand{\Dimplicitfootnotereference}[2]{%
+    % Ditto, but for the special case of footnotes.
+    % We want them to be rendered like explicit references.
+    \Dexplicitreference{##1}{##2}%
+  }
+  \providecommand{\Dimplicitcitationreference}[2]{%
+    % Ditto for citation references.
+    \Dimplicitfootnotereference{##1}{##2}%
+  }
+  \ifthenelse{\equal{\Dprinting}{true}}{
+    \providecommand{\Dexplicitreferencecolor}{black}
+  }{
+    \providecommand{\Dexplicitreferencecolor}{blue}
+  }
+  \providecommand{\Dexplicitreference}[2]{%
+    % Create explicit reference to ID, e.g. created with "foo_".
+    % Parameters:
+    % 1. Target.
+    % 2. Link text.
+    \href{##1}{{\color{\Dexplicitreferencecolor}##2}}%
+  }
+  \providecommand{\Durireferencecolor}{\Dexplicitreferencecolor}
+  \providecommand{\Durireference}[2]{%
+    % Create reference to URI.  Parameters:
+    % 1. Target.
+    % 2. Link text.
+    \href{##1}{{\color{\Durireferencecolor}##2}}%
+  }
+}
+
+
+\providecommand{\DSlanguage}{%
+  % Set up babel.
+  \ifthenelse{\equal{\Dlanguagebabel}{}}{}{
+    \RequirePackage[\Dlanguagebabel]{babel}
+  }
+}
+
+
+
+
+\providecommand{\DAclasses}[5]{%
+  \Difdefined{DN#4C#3}{%
+    % Pass only contents, nothing else!
+    \csname DN#4C#3\endcsname{#5}%
+  }{%
+    \Difdefined{DC#3}{%
+      \csname DC#3\endcsname{#5}%
+    }{%
+      #5%
+    }%
+  }%
+}
+
+\providecommand{\Difdefined}[3]{\@ifundefined{#1}{#3}{#2}}
+
+\providecommand{\Dattr}[5]{%
+  % Global attribute dispatcher.
+  % Parameters:
+  % 1. Attribute number.
+  % 2. Attribute name.
+  % 3. Attribute value.
+  % 4. Node name.
+  % 5. Node contents.
+  \Difdefined{DN#4A#2V#3}{%
+    \csname DN#4A#2V#3\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DN#4A#2}{%
+    \csname DN#4A#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DA#2V#3}{%
+    \csname DA#2V#3\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{\Difdefined{DA#2}{%
+    \csname DA#2\endcsname{#1}{#2}{#3}{#4}{#5}%
+  }{#5%
+  }}}}%
+}
+
+\providecommand{\DNparagraph}[1]{%
+  \ifthenelse{\equal{\Dparagraphindented}{true}}{\indent}{\noindent}%
+  #1%
+}
+\providecommand{\Dformatboxtitle}[1]{{\Large\textbf{#1}}}
+\providecommand{\Dformatboxsubtitle}[1]{{\large\textbf{#1}}}
+\providecommand{\Dtopictitle}[1]{%
+  \Difinsidetoc{\vspace{1em}\par}{}%
+  \noindent\Dformatboxtitle{#1}%
+  \ifthenelse{\equal{\Dhassubtitle}{false}}{\vspace{1em}}{\vspace{0.5em}}%
+  \par%
+}
+\providecommand{\Dtopicsubtitle}[1]{%
+  \noindent\Dformatboxsubtitle{#1}%
+  \vspace{1em}%
+  \par%
+}
+\providecommand{\Dsidebartitle}[1]{\Dtopictitle{#1}}
+\providecommand{\Dsidebarsubtitle}[1]{\Dtopicsubtitle{#1}}
+\providecommand{\Ddocumenttitle}[1]{%
+  \begin{center}{\Huge#1}\end{center}%
+  \ifthenelse{\equal{\Dhassubtitle}{true}}{\vspace{0.1cm}}{\vspace{1cm}}%
+}
+\providecommand{\Ddocumentsubtitle}[1]{%
+  \begin{center}{\huge#1}\end{center}%
+  \vspace{1cm}%
+}
+% Can be overwritten by user stylesheet.
+\providecommand{\Dformatsectiontitle}[1]{#1}
+\providecommand{\Dformatsectionsubtitle}[1]{\Dformatsectiontitle{#1}}
+\providecommand{\Dbookmarksectiontitle}[1]{%
+  % Return text suitable for use in \section*, \subsection*, etc.,
+  % containing a PDF bookmark.  Parameter:  The title (as node tree).
+  \Draisedlink{\Dpdfbookmark{\Dtitleastext}}%
+  #1%
+}
+\providecommand{\Dsectiontitlehook}[1]{#1}
+\providecommand{\Dsectiontitle}[1]{%
+  \Dsectiontitlehook{%
+    \Ddispatchsectiontitle{\Dbookmarksectiontitle{\Dformatsectiontitle{#1}}}%
+  }%
+}
+\providecommand{\Ddispatchsectiontitle}[1]{%
+  \@ifundefined{Dsectiontitle\roman{Dsectionlevel}}{%
+    \Ddeepsectiontitle{#1}%
+  }{%
+    \csname Dsectiontitle\roman{Dsectionlevel}\endcsname{#1}%
+  }%
+}
+\providecommand{\Ddispatchsectionsubtitle}[1]{%
+  \Ddispatchsectiontitle{#1}%
+}
+\providecommand{\Dsectiontitlei}[1]{\section*{#1}}
+\providecommand{\Dsectiontitleii}[1]{\subsection*{#1}}
+\providecommand{\Ddeepsectiontitle}[1]{%
+  % Anything below \subsubsection (like \paragraph or \subparagraph)
+  % is useless because it uses the same font.  The only way to
+  % (visually) distinguish such deeply nested sections is to use
+  % section numbering.
+  \subsubsection*{#1}%
+}
+\providecommand{\Dsectionsubtitlehook}[1]{#1}
+\Dprovidelength{\Dsectionsubtitleraisedistance}{0.7em}
+\providecommand{\Dsectionsubtitlescaling}{0.85}
+\providecommand{\Dsectionsubtitle}[1]{%
+  \Dsectionsubtitlehook{%
+    % Move the subtitle nearer to the title.
+    \vspace{-\Dsectionsubtitleraisedistance}%
+    % Don't create a PDF bookmark.
+    \Ddispatchsectionsubtitle{%
+      \Dformatsectionsubtitle{\scalebox{\Dsectionsubtitlescaling}{#1}}%
+    }%
+  }%
+}
+% Boolean variable.
+\providecommand{\Dhassubtitle}{false}
+\providecommand{\DNtitle}[1]{%
+  \csname D\Dparent title\endcsname{#1}%
+}
+\providecommand{\DNsubtitle}[1]{%
+  \csname D\Dparent subtitle\endcsname{#1}%
+}
+\newcounter{Dpdfbookmarkid}
+\setcounter{Dpdfbookmarkid}{0}
+\providecommand{\Dpdfbookmark}[1]{%
+  % Temporarily decrement Desctionlevel counter.
+  \addtocounter{Dsectionlevel}{-1}%
+  %\typeout{\arabic{Dsectionlevel}}%
+  %\typeout{#1}%
+  %\typeout{docutils\roman{Dpdfbookmarkid}}%
+  %\typeout{}%
+  \pdfbookmark[\arabic{Dsectionlevel}]{#1}{docutils\arabic{Dpdfbookmarkid}}%
+  \addtocounter{Dsectionlevel}{1}%
+  \addtocounter{Dpdfbookmarkid}{1}%
+}
+
+%\providecommand{\DNliteralblock}[1]{\begin{quote}\ttfamily\raggedright#1\end{quote}}
+\providecommand{\DNliteralblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      \setlength{\leftmargin}{0pt}%
+    }{}%
+    \setlength{\rightmargin}{0pt}%
+  }{%
+    \raggedright\item\noindent\nohyphens{\textnhtt{#1\Dfinalstrut}}%
+  }%
+}
+\providecommand{\DNdoctestblock}[1]{%
+  % Treat doctest blocks the same as literal blocks.
+  \DNliteralblock{#1}%
+}
+\RequirePackage{hyphenat}
+\providecommand{\DNliteral}[1]{\textnhtt{#1}}
+\providecommand{\DNemphasis}[1]{\emph{#1}}
+\providecommand{\DNstrong}[1]{\textbf{#1}}
+\providecommand{\Dvisitdocument}{\begin{document}\noindent}
+\providecommand{\Ddepartdocument}{\end{document}}
+\providecommand{\DNtopic}[1]{%
+  \ifthenelse{\equal{\DcurrentNtopicAcontents}{1}}{%
+    \addtocounter{Dtoclevel}{1}%
+    \par\noindent%
+    #1%
+    \addtocounter{Dtoclevel}{-1}%
+  }{%
+    \par\noindent%
+    \Dmakebox{#1}%
+  }%
+}
+\providecommand{\Dformatrubric}[1]{\textbf{#1}}
+\Dprovidelength{\Dprerubricspace}{0.3em}
+\providecommand{\DNrubric}[1]{%
+  \vspace{\Dprerubricspace}\par\noindent\Dformatrubric{#1}\par%
+}
+
+\providecommand{\Dbullet}{}
+\providecommand{\Dsetbullet}[1]{\renewcommand{\Dbullet}{#1}}
+\providecommand{\DNbulletlist}[1]{%
+  \Difinsidetoc{%
+    \Dtocbulletlist{#1}%
+  }{%
+    \Dmakelistenvironment{\Dbullet}{}{#1}%
+  }%
+}
+\renewcommand{\@pnumwidth}{2.2em}
+\providecommand{\DNlistitem}[1]{%
+  \Difinsidetoc{%
+    \ifthenelse{\equal{\theDtoclevel}{1}\and\equal{\Dlocaltoc}{false}}{%
+      {%
+        \par\addvspace{1em}\noindent%
+        \sectfont%
+        #1\hfill\pageref{\DcurrentNlistitemAtocrefid}%
+      }%
+    }{%
+      \@dottedtocline{0}{\Dtocindent}{0em}{#1}{%
+        \pageref{\DcurrentNlistitemAtocrefid}%
+      }%
+    }%
+  }{%
+    \item{#1}%
+  }%
+}
+\providecommand{\DNenumeratedlist}[1]{#1}
+\newcounter{Dsectionlevel}
+\providecommand{\Dvisitsectionhook}{}
+\providecommand{\Ddepartsectionhook}{}
+\providecommand{\Dvisitsection}{%
+  \addtocounter{Dsectionlevel}{1}%
+  \Dvisitsectionhook%
+}
+\providecommand{\Ddepartsection}{%
+  \Ddepartsectionhook%
+  \addtocounter{Dsectionlevel}{-1}%
+}
+
+% Using \_ will cause hyphenation after _ even in \textnhtt-typewriter
+% because the hyphenat package redefines \_.  So we use
+% \textunderscore here.
+\providecommand{\Dtextunderscore}{\textunderscore}
+
+\providecommand{\Dtextinlineliteralfirstspace}{{ }}
+\providecommand{\Dtextinlineliteralsecondspace}{{~}}
+
+\Dprovidelength{\Dlistspacing}{0.8\baselineskip}
+
+\providecommand{\Dsetlistrightmargin}{%
+  \ifthenelse{\lengthtest{\linewidth>12em}}{%
+    % Equal margins.
+    \setlength{\rightmargin}{\leftmargin}%
+  }{%
+    % If the line is narrower than 10em, we don't remove any further
+    % space from the right.
+    \setlength{\rightmargin}{0pt}%
+  }%
+}
+\providecommand{\Dresetlistdepth}{false}
+\Dprovidelength{\Doriginallabelsep}{\labelsep}
+\providecommand{\Dmakelistenvironment}[3]{%
+  % Make list environment with support for unlimited nesting and with
+  % reasonable default lengths.  Parameters:
+  % 1. Label (same as in list environment).
+  % 2. Spacing (same as in list environment).
+  % 3. List contents (contents of list environment).
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+    % Unfortunately, vertical spacing doesn't work correctly when
+    % using lists inside tabular environments, so we use a minipage.
+    \begin{minipage}[t]{\linewidth}%
+  }{}%
+    {%
+      \renewcommand{\Dneedvspace}{false}%
+      % \parsep0.5\baselineskip
+      \renewcommand{\Dresetlistdepth}{false}%
+      \ifnum \@listdepth>5%
+      \protect\renewcommand{\Dresetlistdepth}{true}%
+      \@listdepth=5%
+      \fi%
+      \begin{list}{%
+          #1%
+        }{%
+          \setlength{\itemsep}{0pt}%
+          \setlength{\partopsep}{0pt}%
+          \setlength{\topsep}{0pt}%
+                                  % List should take 90% of total width.
+          \setlength{\leftmargin}{0.05\linewidth}%
+          \ifthenelse{\lengthtest{\leftmargin<1.8em}}{%
+            \setlength{\leftmargin}{1.8em}%
+          }{}%
+          \setlength{\labelsep}{\Doriginallabelsep}%
+          \Dsetlistrightmargin%
+          #2%
+        }{%
+          #3%
+        }%
+      \end{list}%
+      \ifthenelse{\equal{\Dresetlistdepth}{true}}{\@listdepth=5}{}%
+    }%
+  \ifthenelse{\equal{\Dinsidetabular}{true}}{\end{minipage}}{}%
+}
+\providecommand{\Dfinalstrut}{\@finalstrut\@arstrutbox}
+\providecommand{\DAlastitem}[5]{#5\Dfinalstrut}
+
+\Dprovidelength{\Ditemsep}{0pt}
+\providecommand{\Dmakeenumeratedlist}[6]{%
+  % Make enumerated list.
+  % Parameters:
+  % - prefix
+  % - type (\arabic, \roman, ...)
+  % - suffix
+  % - suggested counter name
+  % - start number - 1
+  % - list contents
+  \newcounter{#4}%
+  \Dmakelistenvironment{#1#2{#4}#3}{%
+    % Use as much space as needed for the label.
+    \setlength{\labelwidth}{10em}%
+    % Reserve enough space so that the label doesn't go beyond the
+    % left margin of preceding paragraphs.  Like that:
+    %
+    %    A paragraph.
+    %
+    %   1. First item.
+    \setlength{\leftmargin}{2.5em}%
+    \Dsetlistrightmargin%
+    \setlength{\itemsep}{\Ditemsep}%
+    % Use counter recommended by Python module.
+    \usecounter{#4}%
+    % Set start value.
+    \addtocounter{#4}{#5}%
+  }{%
+    % The list contents.
+    #6%
+  }%
+}
+
+
+% Single quote in literal mode.  \textquotesingle from package
+% textcomp has wrong width when using package ae, so we use a normal
+% single curly quote here.
+\providecommand{\Dtextliteralsinglequote}{'}
+
+
+% "Tabular lists" are field lists and options lists (not definition
+% lists because there the term always appears on its own line).  We'll
+% use the terminology of field lists now ("field", "field name",
+% "field body"), but the same is also analogously applicable to option
+% lists.
+%
+% We want these lists to be breakable across pages.  We cannot
+% automatically get the narrowest possible size for the left column
+% (i.e. the field names or option groups) because tabularx does not
+% support multi-page tables, ltxtable needs to have the table in an
+% external file and we don't want to clutter the user's directories
+% with auxiliary files created by the filecontents environment, and
+% ltablex is not included in teTeX.
+%
+% Thus we set a fixed length for the left column and use list
+% environments.  This also has the nice side effect that breaking is
+% now possible anywhere, not just between fields.
+%
+% Note that we are creating a distinct list environment for each
+% field.  There is no macro for a whole tabular list!
+\Dprovidelength{\Dtabularlistfieldnamewidth}{6em}
+\Dprovidelength{\Dtabularlistfieldnamesep}{0.5em}
+\providecommand{\Dinsidetabular}{false}
+\providecommand{\Dsavefieldname}{}
+\providecommand{\Dsavefieldbody}{}
+\Dprovidelength{\Dusedfieldnamewidth}{0pt}
+\Dprovidelength{\Drealfieldnamewidth}{0pt}
+\providecommand{\Dtabularlistfieldname}[1]{\renewcommand{\Dsavefieldname}{#1}}
+\providecommand{\Dtabularlistfieldbody}[1]{\renewcommand{\Dsavefieldbody}{#1}}
+\Dprovidelength{\Dparskiptemp}{0pt}
+\providecommand{\Dtabularlistfield}[1]{%
+  {%
+    % This only saves field name and field body in \Dsavefieldname and
+    % \Dsavefieldbody, resp.  It does not insert any text into the
+    % document.
+    #1%
+    % Recalculate the real field name width everytime we encounter a
+    % tabular list field because it may have been changed using a
+    % "raw" node.
+    \setlength{\Drealfieldnamewidth}{\Dtabularlistfieldnamewidth}%
+    \addtolength{\Drealfieldnamewidth}{\Dtabularlistfieldnamesep}%
+    \Dmakelistenvironment{%
+      \makebox[\Drealfieldnamewidth][l]{\Dsavefieldname}%
+    }{%
+      \setlength{\labelwidth}{\Drealfieldnamewidth}%
+      \setlength{\leftmargin}{\Drealfieldnamewidth}%
+      \setlength{\rightmargin}{0pt}%
+      \setlength{\labelsep}{0pt}%
+    }{%
+      \item%
+      \settowidth{\Dusedfieldnamewidth}{\Dsavefieldname}%
+      \setlength{\Dparskiptemp}{\parskip}%
+      \ifthenelse{%
+        \lengthtest{\Dusedfieldnamewidth>\Dtabularlistfieldnamewidth}%
+      }{%
+        \mbox{}\par%
+        \setlength{\parskip}{0pt}%
+      }{}%
+      \Dsavefieldbody%
+      \setlength{\parskip}{\Dparskiptemp}%
+      %XXX Why did we need this?
+      %\@finalstrut\@arstrutbox%
+    }%
+    \par%
+  }%
+}
+
+\providecommand{\Dformatfieldname}[1]{\textbf{#1:}}
+\providecommand{\DNfieldlist}[1]{#1}
+\providecommand{\DNfield}[1]{\Dtabularlistfield{#1}}
+\providecommand{\DNfieldname}[1]{%
+  \Dtabularlistfieldname{%
+    \Dformatfieldname{#1}%
+  }%
+}
+\providecommand{\DNfieldbody}[1]{\Dtabularlistfieldbody{#1}}
+
+\providecommand{\Dformatoptiongroup}[1]{%
+  % Format option group, e.g. "-f file, --input file".
+  \texttt{#1}%
+}
+\providecommand{\Dformatoption}[1]{%
+  % Format option, e.g. "-f file".
+  % Put into mbox to avoid line-breaking at spaces.
+  \mbox{#1}%
+}
+\providecommand{\Dformatoptionstring}[1]{%
+  % Format option string, e.g. "-f".
+  #1%
+}
+\providecommand{\Dformatoptionargument}[1]{%
+  % Format option argument, e.g. "file".
+  \textsl{#1}%
+}
+\providecommand{\Dformatoptiondescription}[1]{%
+  % Format option description, e.g.
+  % "\DNparagraph{Read input data from file.}"
+  #1%
+}
+\providecommand{\DNoptionlist}[1]{#1}
+\providecommand{\Doptiongroupjoiner}{,{ }}
+\providecommand{\Disfirstoption}{%
+  % Auxiliary macro indicating if a given option is the first child
+  % of its option group (if it's not, it has to preceded by
+  % \Doptiongroupjoiner).
+  false%
+}
+\providecommand{\DNoptionlistitem}[1]{%
+  \Dtabularlistfield{#1}%
+}
+\providecommand{\DNoptiongroup}[1]{%
+  \renewcommand{\Disfirstoption}{true}%
+  \Dtabularlistfieldname{\Dformatoptiongroup{#1}}%
+}
+\providecommand{\DNoption}[1]{%
+  % If this is not the first option in this option group, add a
+  % joiner.
+  \ifthenelse{\equal{\Disfirstoption}{true}}{%
+    \renewcommand{\Disfirstoption}{false}%
+  }{%
+    \Doptiongroupjoiner%
+  }%
+  \Dformatoption{#1}%
+}
+\providecommand{\DNoptionstring}[1]{\Dformatoptionstring{#1}}
+\providecommand{\DNoptionargument}[1]{{ }\Dformatoptionargument{#1}}
+\providecommand{\DNdescription}[1]{%
+  \Dtabularlistfieldbody{\Dformatoptiondescription{#1}}%
+}
+
+\providecommand{\DNdefinitionlist}[1]{%
+  \begin{description}%
+    \parskip0pt%
+    #1%
+  \end{description}%
+}
+\providecommand{\DNdefinitionlistitem}[1]{%
+  % LaTeX expects the label in square brackets; we provide an empty
+  % label.
+  \item[]#1%
+}
+\providecommand{\Dformatterm}[1]{#1}
+\providecommand{\DNterm}[1]{\hspace{-5pt}\Dformatterm{#1}}
+% I'm still not sure what's the best rendering for classifiers.  The
+% colon syntax is used by reStructuredText, so it's at least WYSIWYG.
+% Use slanted text because italic would cause too much emphasis.
+\providecommand{\Dformatclassifier}[1]{\textsl{#1}}
+\providecommand{\DNclassifier}[1]{~:~\Dformatclassifier{#1}}
+\providecommand{\Dformatdefinition}[1]{#1}
+\providecommand{\DNdefinition}[1]{\par\Dformatdefinition{#1}}
+
+\providecommand{\Dlineblockindentation}{2.5em}
+\providecommand{\DNlineblock}[1]{%
+  \Dmakelistenvironment{}{%
+    \ifthenelse{\equal{\Dparent}{lineblock}}{%
+      % Parent is a line block, so indent.
+      \setlength{\leftmargin}{\Dlineblockindentation}%
+    }{%
+      % At top level; don't indent.
+      \setlength{\leftmargin}{0pt}%
+    }%
+    \setlength{\rightmargin}{0pt}%
+    \setlength{\parsep}{0pt}%
+  }{%
+    #1%
+  }%
+}
+\providecommand{\DNline}[1]{\item#1}
+
+
+\providecommand{\DNtransition}{%
+  \raisebox{0.25em}{\parbox{\linewidth}{\hspace*{\fill}\hrulefill\hrulefill\hspace*{\fill}}}%
+}
+
+
+\providecommand{\Dformatblockquote}[1]{%
+  % Format contents of block quote.
+  % This occurs in block-level context, so we cannot use \textsl.
+  {\slshape#1}%
+}
+\providecommand{\Dformatattribution}[1]{---\textup{#1}}
+\providecommand{\DNblockquote}[1]{%
+  \Dmakebox{%
+    \Dformatblockquote{#1}
+  }%
+}
+\providecommand{\DNattribution}[1]{%
+  \par%
+  \begin{flushright}\Dformatattribution{#1}\end{flushright}%
+}
+
+
+% Sidebars:
+\RequirePackage{picins}
+% Vertical and horizontal margins.
+\Dprovidelength{\Dsidebarvmargin}{0.5em}
+\Dprovidelength{\Dsidebarhmargin}{1em}
+% Padding (space between contents and frame).
+\Dprovidelength{\Dsidebarpadding}{1em}
+% Frame width.
+\Dprovidelength{\Dsidebarframewidth}{2\fboxrule}
+% Position ("l" or "r").
+\providecommand{\Dsidebarposition}{r}
+% Width.
+\Dprovidelength{\Dsidebarwidth}{0.45\linewidth}
+\providecommand{\DNsidebar}[1]{
+  \parpic[\Dsidebarposition]{%
+    \begin{minipage}[t]{\Dsidebarwidth}%
+      % Doing this with nested minipages is ugly, but I haven't found
+      % another way to place vertical space before and after the fbox.
+      \vspace{\Dsidebarvmargin}%
+      {%
+        \setlength{\fboxrule}{\Dsidebarframewidth}%
+        \setlength{\fboxsep}{\Dsidebarpadding}%
+        \fbox{%
+          \begin{minipage}[t]{\linewidth}%
+            \setlength{\parindent}{\Dboxparindent}%
+            #1%
+          \end{minipage}%
+        }%
+      }%
+      \vspace{\Dsidebarvmargin}%
+    \end{minipage}%
+  }%
+}
+
+
+% Citations and footnotes.
+\providecommand{\Dformatfootnote}[1]{%
+  % Format footnote.
+  {%
+    \footnotesize#1%
+    % \par is necessary for LaTeX to adjust baselineskip to the
+    % changed font size.
+    \par%
+  }%
+}
+\providecommand{\Dformatcitation}[1]{\Dformatfootnote{#1}}
+\Dprovidelength{\Doriginalbaselineskip}{0pt}
+\providecommand{\DNfootnotereference}[1]{%
+  {%
+    % \baselineskip is 0pt in \textsuperscript, so we save it here.
+    \setlength{\Doriginalbaselineskip}{\baselineskip}%
+    \textsuperscript{#1}%
+  }%
+}
+\providecommand{\DNcitationreference}[1]{{[}#1{]}}
+\Dprovidelength{\Dfootnotesep}{3.5pt}
+\providecommand{\Dsetfootnotespacing}{%
+  % Spacing commands executed at the beginning of footnotes.
+  \setlength{\parindent}{0pt}%
+  \hspace{1em}%
+}
+\providecommand{\DNfootnote}[1]{%
+  % See ltfloat.dtx for details.
+  {%
+    \insert\footins{%
+      \vspace{\Dfootnotesep}%
+      \Dsetfootnotespacing%
+      \Dformatfootnote{#1}%
+    }%
+  }%
+}
+\providecommand{\DNcitation}[1]{\DNfootnote{#1}}
+\providecommand{\Dformatfootnotelabel}[1]{%
+  % Keep \footnotesize in footnote labels (\textsuperscript would
+  % reduce the font size even more).
+  \textsuperscript{\footnotesize#1{ }}%
+}
+\providecommand{\Dformatcitationlabel}[1]{{[}#1{]}{ }}
+\providecommand{\Dformatmultiplebackrefs}[1]{%
+  % If in printing mode, do not write out multiple backrefs.
+  \ifthenelse{\equal{\Dprinting}{true}}{}{\textsl{#1}}%
+}
+\providecommand{\Dthislabel}{}
+\providecommand{\DNlabel}[1]{%
+  \renewcommand{\Dthislabel}{#1}
+  \ifthenelse{\not\equal{\Dsinglebackref}{}}{%
+    \let\Doriginallabel=\Dthislabel%
+    \def\Dthislabel{%
+      \Dsinglefootnotebacklink{\Dsinglebackref}{\Doriginallabel}%
+    }%
+  }{}%
+  \ifthenelse{\equal{\Dparent}{footnote}}{%
+    % Footnote label.
+    \Dformatfootnotelabel{\Dthislabel}%
+  }{%
+    \ifthenelse{\equal{\Dparent}{citation}}{%
+      % Citation label.
+      \Dformatcitationlabel{\Dthislabel}%
+    }{}%
+  }%
+  % If there are multiple backrefs, add them now.
+  \Dformatmultiplebackrefs{\Dmultiplebackrefs}%
+}
+\providecommand{\Dsinglefootnotebacklink}[2]{%
+  % Create normal backlink of a footnote label.  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\Dmultifootnotebacklink}[2]{%
+  % Create generated backlink, as in (1, 2).  Parameters:
+  % 1. ID.
+  % 2. Link text.
+  % Treat like a footnote reference.
+  \Dimplicitfootnotereference{\##1}{#2}%
+}
+\providecommand{\Dsinglecitationbacklink}[2]{\Dsinglefootnotebacklink{#1}{#2}}
+\providecommand{\Dmulticitationbacklink}[2]{\Dmultifootnotebacklink{#1}{#2}}
+
+
+\RequirePackage{longtable}
+\providecommand{\Dmaketable}[2]{%
+  % Make table.  Parameters:
+  % 1. Table spec (like "|p|p|").
+  % 2. Table contents.
+  {%
+    \ifthenelse{\equal{\Dinsidetabular}{true}}{%
+      % Inside longtable; we cannot have nested longtables.
+      \begin{tabular}{#1}%
+        \hline%
+        #2%
+      \end{tabular}%
+    }{%
+      \renewcommand{\Dinsidetabular}{true}%
+      \begin{longtable}{#1}%
+        \hline%
+        #2%
+      \end{longtable}%
+    }%
+  }%
+}
+\providecommand{\DNthead}[1]{%
+  #1%
+  \endhead%
+}
+\providecommand{\DNrow}[1]{%
+  #1\tabularnewline%
+  \hline%
+}
+\providecommand{\Dinsidemulticolumn}{false}
+\providecommand{\Dcompensatingmulticol}[3]{%
+  \multicolumn{#1}{#2}{%
+    {%
+      \renewcommand{\Dinsidemulticolumn}{true}%
+      % Compensate for weird missing vertical space at top of paragraph.
+      \raisebox{-2.5pt}{#3}%
+    }%
+  }%
+}
+\providecommand{\Dcolspan}[2]{%
+  % Take care of the morecols attribute (but incremented by 1).
+  &%
+  \Dcompensatingmulticol{#1}{l|}{#2}%
+}
+\providecommand{\Dcolspanleft}[2]{%
+  % Like \Dmorecols, but called for the leftmost entries in a table
+  % row.
+  \Dcompensatingmulticol{#1}{|l|}{#2}%
+}
+\providecommand{\Dsubsequententry}[1]{%
+  &#1%
+}
+\providecommand{\DNentry}[1]{%
+  % The following sequence adds minimal vertical space above the top
+  % lines of the first cell paragraph, so that vertical space is
+  % balanced at the top and bottom of table cells.
+  \ifthenelse{\equal{\Dinsidemulticolumn}{false}}{%
+    \vspace{-1em}\vspace{-\parskip}\par%
+  }{}%
+  #1%
+  % No need to add an ampersand ("&"); that's done by \Dsubsequententry.
+}
+\providecommand{\DAtableheaderentry}[5]{\Dformattableheaderentry{#5}}
+\providecommand{\Dformattableheaderentry}[1]{{\bfseries#1}}
+
+
+\providecommand{\DNsystemmessage}[1]{%
+  {%
+    \ifthenelse{\equal{\Dprinting}{false}}{\color{red}}{}%
+    \bfseries%
+    #1%
+  }%
+}
+
+
+\providecommand{\Dinsidehalign}{false}
+\newsavebox{\Dalignedimagebox}
+\Dprovidelength{\Dalignedimagewidth}{0pt}
+\providecommand{\Dhalign}[2]{%
+  % Horizontally align the contents to the left or right so that the
+  % text flows around it.
+  % Parameters:
+  % 1. l or r
+  % 2. Contents.
+  \renewcommand{\Dinsidehalign}{true}%
+  % For some obscure reason \parpic consumes some vertical space.
+  \vspace{-3pt}%
+  % Now we do something *really* ugly, but this enables us to wrap the
+  % image in a minipage while still allowing tight frames when
+  % class=border (see \DNimageCborder).
+  \sbox{\Dalignedimagebox}{#2}%
+  \settowidth{\Dalignedimagewidth}{\usebox{\Dalignedimagebox}}%
+  \parpic[#1]{%
+    \begin{minipage}[b]{\Dalignedimagewidth}%
+      % Compensate for previously added space, but not entirely.
+      \vspace*{2.0pt}%
+      \vspace*{\Dfloatimagetopmargin}%
+      \usebox{\Dalignedimagebox}%
+      \vspace*{1.5pt}%
+      \vspace*{\Dfloatimagebottommargin}%
+    \end{minipage}%
+  }%
+  \renewcommand{\Dinsidehalign}{false}%
+}
+
+
+\RequirePackage{graphicx}
+% Maximum width of an image.
+\providecommand{\Dimagemaxwidth}{\linewidth}
+\providecommand{\Dfloatimagemaxwidth}{0.5\linewidth}
+% Auxiliary variable.
+\Dprovidelength{\Dcurrentimagewidth}{0pt}
+\providecommand{\DNimageAalign}[5]{%
+  \ifthenelse{\equal{#3}{left}}{%
+    \Dhalign{l}{#5}%
+  }{%
+    \ifthenelse{\equal{#3}{right}}{%
+      \Dhalign{r}{#5}%
+    }{%
+      \ifthenelse{\equal{#3}{center}}{%
+        % Text floating around centered figures is a bad idea.  Thus
+        % we use a center environment.  Note that no extra space is
+        % added by the writer, so the space added by the center
+        % environment is fine.
+        \begin{center}#5\end{center}%
+      }{%
+        #5%
+      }%
+    }%
+  }%
+}
+% Base path for images.
+\providecommand{\Dimagebase}{}
+% Auxiliary command.  Current image path.
+\providecommand{\Dimagepath}{}
+\providecommand{\DNimageAuri}[5]{%
+  % Insert image.  We treat the URI like a path here.
+  \renewcommand{\Dimagepath}{\Dimagebase#3}%
+  \Difdefined{DcurrentNimageAwidth}{%
+    \Dwidthimage{\DcurrentNimageAwidth}{\Dimagepath}%
+  }{%
+    \Dsimpleimage{\Dimagepath}%
+  }%
+}
+\Dprovidelength{\Dfloatimagevmargin}{0pt}
+\providecommand{\Dfloatimagetopmargin}{\Dfloatimagevmargin}
+\providecommand{\Dfloatimagebottommargin}{\Dfloatimagevmargin}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  % Need to make bottom-alignment dependent on align attribute (add
+  % functional test first).  Need to observe height attribute.
+  %\begin{minipage}[b]{#1}%
+    \includegraphics[width=#1,height=\textheight,keepaspectratio]{#2}%
+  %\end{minipage}%
+}  
+\providecommand{\Dcurrentimagemaxwidth}{}
+\providecommand{\Dsimpleimage}[1]{%
+  % Insert image, without much parametrization.
+  \settowidth{\Dcurrentimagewidth}{\includegraphics{#1}}%
+  \ifthenelse{\equal{\Dinsidehalign}{true}}{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dfloatimagemaxwidth}%
+  }{%
+    \renewcommand{\Dcurrentimagemaxwidth}{\Dimagemaxwidth}%
+  }%
+  \ifthenelse{\lengthtest{\Dcurrentimagewidth>\Dcurrentimagemaxwidth}}{%
+    \Dwidthimage{\Dcurrentimagemaxwidth}{#1}%
+  }{%
+    \Dwidthimage{\Dcurrentimagewidth}{#1}%
+  }%
+}
+\providecommand{\Dwidthimage}[2]{%
+  % Image with specified width.
+  % Parameters:
+  % 1. Image width.
+  % 2. Image path.
+  \Dwidthimage{#1}{#2}%
+}
+
+% Figures.
+\providecommand{\DNfigureAalign}[5]{%
+  % Hack to make it work Right Now.
+  %\def\DcurrentNimageAwidth{\DcurrentNfigureAwidth}%
+  %
+    %\def\DcurrentNimageAwidth{\linewidth}%
+    \DNimageAalign{#1}{#2}{#3}{#4}{%
+      \begin{minipage}[b]{0.4\linewidth}#5\end{minipage}}%
+    %\let\DcurrentNimageAwidth=\relax%
+  %
+  %\let\DcurrentNimageAwidth=\relax%
+}
+\providecommand{\DNcaption}[1]{\par\noindent{\slshape#1}}
+\providecommand{\DNlegend}[1]{\Dauxiliaryspace#1}
+
+\providecommand{\DCborder}[1]{\fbox{#1}}
+% No padding between image and border.
+\providecommand{\DNimageCborder}[1]{\frame{#1}}
+
+
+% Need to replace with language-specific stuff.  Maybe look at
+% csquotes.sty and ask the author for permission to use parts of it.
+\providecommand{\Dtextleftdblquote}{``}
+\providecommand{\Dtextrightdblquote}{''}
+
+% Table of contents:
+\Dprovidelength{\Dtocininitialsectnumwidth}{2.4em}
+\Dprovidelength{\Dtocadditionalsectnumwidth}{0.7em}
+% Level inside a table of contents.  While this is at -1, we are not
+% inside a TOC.
+\Dprovidecounter{Dtoclevel}%
+\setcounter{Dtoclevel}{-1}
+\providecommand{\Dlocaltoc}{false}%
+\providecommand{\DNtopicClocal}[1]{%
+  \renewcommand{\Dlocaltoc}{true}%
+  \addtolength{\Dtocsectnumwidth}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-2\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocindent}{2\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{-2\Dtocadditionalsectnumwidth}%
+  \renewcommand{\Dlocaltoc}{false}%
+}
+\Dprovidelength{\Dtocindent}{0pt}%
+\Dprovidelength{\Dtocsectnumwidth}{\Dtocininitialsectnumwidth}
+% Compensate for one additional TOC indentation space so that the
+% top-level is unindented.
+\addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}
+\addtolength{\Dtocindent}{-\Dtocsectnumwidth}
+\providecommand{\Difinsidetoc}[2]{%
+  \ifthenelse{\not\equal{\theDtoclevel}{-1}}{#1}{#2}%
+}
+\providecommand{\DNgeneratedCsectnum}[1]{%
+  \Difinsidetoc{%
+    % Section number inside TOC.
+    \makebox[\Dtocsectnumwidth][l]{#1}%
+  }{%
+    % Section number inside section title.
+    #1\quad%
+  }%
+}
+\providecommand{\Dtocbulletlist}[1]{%
+  \addtocounter{Dtoclevel}{1}%
+  \addtolength{\Dtocindent}{\Dtocsectnumwidth}%
+  \addtolength{\Dtocsectnumwidth}{\Dtocadditionalsectnumwidth}%
+  #1%
+  \addtolength{\Dtocsectnumwidth}{-\Dtocadditionalsectnumwidth}%
+  \addtolength{\Dtocindent}{-\Dtocsectnumwidth}%
+  \addtocounter{Dtoclevel}{-1}%
+}
+
+
+% For \Dpixelunit, the length value is pre-multiplied with 0.75, so by
+% specifying "pt" we get the same notion of "pixel" as graphicx.
+\providecommand{\Dpixelunit}{pt}
+% Normally lengths are relative to the current linewidth.
+\providecommand{\Drelativeunit}{\linewidth}
+
+
+%\RequirePackage{fixmath}
+%\RequirePackage{amsmath}
+
+
+\DSfontencoding
+\DSlanguage
+\DSlinks
+\DSsymbols
+\DSlate
+
+\makeatother
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/pep.css
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/pep.css	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/pep.css	(revision 126)
@@ -0,0 +1,349 @@
+/*
+:Author: David Goodger
+:Contact: goodger@users.sourceforge.net
+:date: $Date: 2005-09-23 14:49:01 -0600 (Fri, 23 Sep 2005) $
+:version: $Revision: 1961 $
+:copyright: This stylesheet has been placed in the public domain.
+
+Default cascading style sheet for the PEP HTML output of Docutils.
+*/
+
+/* "! important" is used here to override other ``margin-top`` and
+   ``margin-bottom`` styles that are later in the stylesheet or 
+   more specific.  See http://www.w3.org/TR/CSS1#the-cascade */
+.first {
+  margin-top: 0 ! important }
+
+.last, .with-subtitle {
+  margin-bottom: 0 ! important }
+
+.hidden {
+  display: none }
+
+.navigation {
+  width: 100% ;
+  background: #99ccff ;
+  margin-top: 0px ;
+  margin-bottom: 0px }
+
+.navigation .navicon {
+  width: 150px ;
+  height: 35px }
+
+.navigation .textlinks {
+  padding-left: 1em ;
+  text-align: left }
+
+.navigation td, .navigation th {
+  padding-left: 0em ;
+  padding-right: 0em ;
+  vertical-align: middle }
+
+.rfc2822 {
+  margin-top: 0.5em ;
+  margin-left: 0.5em ;
+  margin-right: 0.5em ;
+  margin-bottom: 0em }
+
+.rfc2822 td {
+  text-align: left }
+
+.rfc2822 th.field-name {
+  text-align: right ;
+  font-family: sans-serif ;
+  padding-right: 0.5em ;
+  font-weight: bold ;
+  margin-bottom: 0em }
+
+a.toc-backref {
+  text-decoration: none ;
+  color: black }
+
+blockquote.epigraph {
+  margin: 2em 5em ; }
+
+body {
+  margin: 0px ;
+  margin-bottom: 1em ;
+  padding: 0px }
+
+dl.docutils dd {
+  margin-bottom: 0.5em }
+
+div.section {
+  margin-left: 1em ;
+  margin-right: 1em ;
+  margin-bottom: 1.5em }
+
+div.section div.section {
+  margin-left: 0em ;
+  margin-right: 0em ;
+  margin-top: 1.5em }
+
+div.abstract {
+  margin: 2em 5em }
+
+div.abstract p.topic-title {
+  font-weight: bold ;
+  text-align: center }
+
+div.admonition, div.attention, div.caution, div.danger, div.error,
+div.hint, div.important, div.note, div.tip, div.warning {
+  margin: 2em ;
+  border: medium outset ;
+  padding: 1em }
+
+div.admonition p.admonition-title, div.hint p.admonition-title,
+div.important p.admonition-title, div.note p.admonition-title,
+div.tip p.admonition-title {
+  font-weight: bold ;
+  font-family: sans-serif }
+
+div.attention p.admonition-title, div.caution p.admonition-title,
+div.danger p.admonition-title, div.error p.admonition-title,
+div.warning p.admonition-title {
+  color: red ;
+  font-weight: bold ;
+  font-family: sans-serif }
+
+/* Uncomment (and remove this text!) to get reduced vertical space in
+   compound paragraphs.
+div.compound .compound-first, div.compound .compound-middle {
+  margin-bottom: 0.5em }
+
+div.compound .compound-last, div.compound .compound-middle {
+  margin-top: 0.5em }
+*/
+
+div.dedication {
+  margin: 2em 5em ;
+  text-align: center ;
+  font-style: italic }
+
+div.dedication p.topic-title {
+  font-weight: bold ;
+  font-style: normal }
+
+div.figure {
+  margin-left: 2em }
+
+div.footer, div.header {
+  clear: both;
+  font-size: smaller }
+
+div.footer {
+  margin-left: 1em ;
+  margin-right: 1em }
+
+div.line-block {
+  display: block ;
+  margin-top: 1em ;
+  margin-bottom: 1em }
+
+div.line-block div.line-block {
+  margin-top: 0 ;
+  margin-bottom: 0 ;
+  margin-left: 1.5em }
+
+div.sidebar {
+  margin-left: 1em ;
+  border: medium outset ;
+  padding: 1em ;
+  background-color: #ffffee ;
+  width: 40% ;
+  float: right ;
+  clear: right }
+
+div.sidebar p.rubric {
+  font-family: sans-serif ;
+  font-size: medium }
+
+div.system-messages {
+  margin: 5em }
+
+div.system-messages h1 {
+  color: red }
+
+div.system-message {
+  border: medium outset ;
+  padding: 1em }
+
+div.system-message p.system-message-title {
+  color: red ;
+  font-weight: bold }
+
+div.topic {
+  margin: 2em }
+
+h1.section-subtitle, h2.section-subtitle, h3.section-subtitle,
+h4.section-subtitle, h5.section-subtitle, h6.section-subtitle {
+  margin-top: 0.4em }
+
+h1 {
+  font-family: sans-serif ;
+  font-size: large }
+
+h2 {
+  font-family: sans-serif ;
+  font-size: medium }
+
+h3 {
+  font-family: sans-serif ;
+  font-size: small }
+
+h4 {
+  font-family: sans-serif ;
+  font-style: italic ;
+  font-size: small }
+
+h5 {
+  font-family: sans-serif;
+  font-size: x-small }
+
+h6 {
+  font-family: sans-serif;
+  font-style: italic ;
+  font-size: x-small }
+
+hr.docutils {
+  width: 75% }
+
+img.align-left {
+  clear: left }
+
+img.align-right {
+  clear: right }
+
+img.borderless {
+  border: 0 }
+
+ol.simple, ul.simple {
+  margin-bottom: 1em }
+
+ol.arabic {
+  list-style: decimal }
+
+ol.loweralpha {
+  list-style: lower-alpha }
+
+ol.upperalpha {
+  list-style: upper-alpha }
+
+ol.lowerroman {
+  list-style: lower-roman }
+
+ol.upperroman {
+  list-style: upper-roman }
+
+p.attribution {
+  text-align: right ;
+  margin-left: 50% }
+
+p.caption {
+  font-style: italic }
+
+p.credits {
+  font-style: italic ;
+  font-size: smaller }
+
+p.label {
+  white-space: nowrap }
+
+p.rubric {
+  font-weight: bold ;
+  font-size: larger ;
+  color: maroon ;
+  text-align: center }
+
+p.sidebar-title {
+  font-family: sans-serif ;
+  font-weight: bold ;
+  font-size: larger }
+
+p.sidebar-subtitle {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+p.topic-title {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+pre.address {
+  margin-bottom: 0 ;
+  margin-top: 0 ;
+  font-family: serif ;
+  font-size: 100% }
+
+pre.line-block {
+  font-family: serif ;
+  font-size: 100% }
+
+pre.literal-block, pre.doctest-block {
+  margin-left: 2em ;
+  margin-right: 2em ;
+  background-color: #eeeeee }
+
+span.classifier {
+  font-family: sans-serif ;
+  font-style: oblique }
+
+span.classifier-delimiter {
+  font-family: sans-serif ;
+  font-weight: bold }
+
+span.interpreted {
+  font-family: sans-serif }
+
+span.option {
+  white-space: nowrap }
+
+span.option-argument {
+  font-style: italic }
+
+span.pre {
+  white-space: pre }
+
+span.problematic {
+  color: red }
+
+span.section-subtitle {
+  /* font-size relative to parent (h1..h6 element) */
+  font-size: 80% }
+
+table.citation {
+  border-left: solid thin gray }
+
+table.docinfo {
+  margin: 2em 4em }
+
+table.docutils {
+  margin-top: 0.5em ;
+  margin-bottom: 0.5em }
+
+table.footnote {
+  border-left: solid thin black }
+
+table.docutils td, table.docutils th,
+table.docinfo td, table.docinfo th {
+  padding-left: 0.5em ;
+  padding-right: 0.5em ;
+  vertical-align: top }
+
+td.num {
+  text-align: right }
+
+th.field-name {
+  font-weight: bold ;
+  text-align: left ;
+  white-space: nowrap ;
+  padding-left: 0 }
+
+h1 tt.docutils, h2 tt.docutils, h3 tt.docutils,
+h4 tt.docutils, h5 tt.docutils, h6 tt.docutils {
+  font-size: 100% }
+
+tt.docutils {
+  background-color: #eeeeee }
+
+ul.auto-toc {
+  list-style-type: none }
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/style.tex
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/style.tex	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/docs/src/stylesheets/style.tex	(revision 126)
@@ -0,0 +1,74 @@
+% latex include file for docutils latex writer
+% --------------------------------------------
+%
+% CVS: $Id: style.tex 1961 2005-09-23 20:49:01Z brent $
+%
+% This is included at the end of the latex header in the generated file,
+% to allow overwriting defaults, although this could get hairy.
+% Generated files should process well standalone too, LaTeX might give a
+% message about a missing file.
+
+% donot indent first line of paragraph.
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{5pt plus 2pt minus 1pt}
+
+% sloppy
+% ------
+% Less strict (opposite to default fussy) space size between words. Therefore
+% less hyphenation.
+\sloppy
+
+% fonts
+% -----
+% times for pdf generation, gives smaller pdf files.
+%
+% But in standard postscript fonts: courier and times/helvetica do not fit.
+% Maybe use pslatex.
+\usepackage{times}
+
+% pagestyle
+% ---------
+% headings might put section titles in the page heading, but not if
+% the table of contents is done by docutils.
+% If pagestyle{headings} is used, \geometry{headheight=10pt,headsep=1pt}
+% should be set too.
+%\pagestyle{plain}
+%
+% or use fancyhdr (untested !)
+%\usepackage{fancyhdr}
+%\pagestyle{fancy}
+%\addtolength{\headheight}{\\baselineskip}
+%\renewcommand{\sectionmark}[1]{\markboth{#1}{}}
+%\renewcommand{\subsectionmark}[1]{\markright{#1}}
+%\fancyhf{}
+%\fancyhead[LE,RO]{\\bfseries\\textsf{\Large\\thepage}}
+%\fancyhead[LO]{\\textsf{\\footnotesize\\rightmark}}
+%\fancyhead[RE]{\\textsc{\\textsf{\\footnotesize\leftmark}}}
+%\\fancyfoot[LE,RO]{\\bfseries\\textsf{\scriptsize Docutils}}
+%\fancyfoot[RE,LO]{\\textsf{\scriptsize\\today}}
+
+% geometry 
+% --------
+% = papersizes and margins
+%\geometry{a4paper,twoside,tmargin=1.5cm,
+%          headheight=1cm,headsep=0.75cm}
+
+% Do section number display
+% -------------------------
+%\makeatletter
+%\def\@seccntformat#1{}
+%\makeatother
+% no numbers in toc
+%\renewcommand{\numberline}[1]{}
+
+
+% change maketitle
+% ----------------
+%\renewcommand{\maketitle}{
+%  \begin{titlepage}
+%    \begin{center}
+%    \textsf{TITLE \@title} \\
+%       Date: \today
+%    \end{center}
+%  \end{titlepage}
+%}
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/eventHandlers.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/eventHandlers.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/eventHandlers.py	(revision 126)
@@ -0,0 +1,701 @@
+##################################################################################
+#
+#    Copyright (C) 2004-2006 Utah State University, All rights reserved.
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+##################################################################################
+
+__author__ = '''Brent Lambert, David Ray, Jon Thomas'''
+__docformat__ = 'plaintext'
+__version__ = "$Revision: 3026 $"[11:-2]
+
+# eventHandlers.py
+
+
+from enpraxis.educommons.interfaces import ICourse, IDivision
+from collective.imstransport.ManifestHandlers import LOM_namespace
+from collective.imstransport.IMS_exceptions import ManifestError
+from Products.CMFDefault.SyndicationTool import SyndicationTool
+from Products.CMFDefault.SyndicationInfo import SyndicationInformation
+from collective.contentlicensing.utilities.interfaces import IContentLicensingUtility
+from collective.zipfiletransport.utilities.interfaces import IZipFileTransportUtility
+from zope.annotation.interfaces import IAnnotations
+from zope.app.container.interfaces import IContainerModifiedEvent
+
+from zope.schema.interfaces import IVocabularyFactory
+from zope.formlib.form import action
+from collective.imstransport.browser.imstransportform import ImportForm
+from utilities.interfaces import IECUtility
+from zope.component import getUtility, queryUtility
+import transaction
+from xml.dom import minidom
+import mimetypes
+import re
+from App.config import getConfiguration
+import os
+
+
+RE_BODY = re.compile('<body[^>]*?>(.*)</body>', re.DOTALL )
+
+eduCommons_version = 'eduCommonsv1.2'
+ec_namespace = 'http://cosl.usu.edu/xsd/eduCommonsv1.2'
+
+def setNameSpaces(event):
+    """ Set up namespaces in manifest file """
+    event.writer.addNamespace(('xmlns:eduCommons', 'http://cosl.usu.edu/xsd/eduCommonsv1.2'), 
+                              'http://cosl.usu.edu/xsd/eduCommonsv1.2 eduCommonsv1.2.xsd',
+                              (os.sep.join(['enpraxis.educommons','enpraxis','educommons','IMS']), 'eduCommonsv1.2.xsd'))
+                              
+
+
+def writeECMetadata(event):
+    """ Handle write IMS metadata event, and add custom eduCommons metadata """
+
+    event.writer.addNamespace(('xmlns:eduCommons', 'http://cosl.usu.edu/xsd/eduCommonsv1.2'), 
+                              ('http://cosl.usu.edu/xsd/eduCommonsv1.2 eduCommonsv1.2.xsd'))
+    eduCommons_node = event.writer._createNode(event.node,
+                                               ec_namespace,
+                                               'eduCommons',
+                                               attrs=[('xmlns', ec_namespace)])
+
+    objType = event.object.Type()
+    if 'Page' == objType:
+        objType = 'Document'
+    if 'Link' == objType:
+        objType = 'Link'
+    event.writer._createNode(eduCommons_node, ec_namespace, 'objectType', objType)
+    copyright = event.object.Rights()
+    if copyright:
+        event.writer._createNode(eduCommons_node, ec_namespace, 'copyright', copyright)
+
+    cltool = getUtility(IContentLicensingUtility)
+    linfo = cltool.getLicenseAndHolderFromObject(event.object)
+    if linfo and linfo[1]:
+        license = linfo[1]
+        license_node = event.writer._createNode(eduCommons_node,
+                                                ec_namespace,
+                                                'license',
+                                                attrs=[('category', license[0])])
+        if license[1] and license[1] != 'None':
+            event.writer._createNode(license_node, ec_namespace, 'licenseName', license[1])
+        if license[2] and license[2] != 'None':
+            event.writer._createNode(license_node, ec_namespace, 'licenseUrl', license[2])
+        if license[3] and license[3] != 'None':
+            event.writer._createNode(license_node, ec_namespace, 'licenseIconUrl', license[3])
+
+    if IAnnotations(event.object).has_key('eduCommons.clearcopyright'):  
+        if IAnnotations(event.object)['eduCommons.clearcopyright']:  
+            event.writer._createNode(eduCommons_node, ec_namespace, 'clearedCopyright', 'true')
+        else:
+            event.writer._createNode(eduCommons_node, ec_namespace, 'clearedCopyright', 'false')
+    else:
+        event.writer._createNode(eduCommons_node, ec_namespace, 'clearedCopyright', 'false')
+
+    #access = IAnnotations(event.object)['eduCommons.accessible']
+    #if access:
+    #    event.writer._createNode(eduCommons_node, ec_namespace, 'accessible', 'true')
+    #else:
+    #    event.writer._createNode(eduCommons_node, ec_namespace, 'accessible', 'false')
+
+    if 'Course' == event.object.Type():
+        courseId = event.object.getCourseId()
+        if courseId:
+            event.writer._createNode(eduCommons_node, ec_namespace, 'courseId', courseId)
+        term = event.object.getTerm()
+        if term:
+            event.writer._createNode(eduCommons_node, ec_namespace, 'term', term)
+        if True == event.object.getDisplayInstEmail():
+            event.writer._createNode(eduCommons_node,
+                                     ec_namespace,
+                                     'displayInstEmail',
+                                     'true')
+        else:
+            event.writer._createNode(eduCommons_node,
+                                     ec_namespace,
+                                     'displayInstEmail',
+                                     'false')
+
+        if True == event.object.getInstructorAsCreator():
+            event.writer._createNode(eduCommons_node,
+                                     ec_namespace,
+                                     'instructorAsCreator',
+                                     'true')
+        else:
+            event.writer._createNode(eduCommons_node,
+                                     ec_namespace,
+                                     'instructorAsCreator',
+                                     'false')
+
+
+def readECMetadata(event):
+    """ Handle read IMS metadata event, and add custom eduCommons metadata """
+
+
+    if event.node.nodeName in ['eduCommons', 'eduCommons:eduCommons']:
+        
+        event.mdSections.append(eduCommons_version)
+         
+        objectType_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'objectType')
+        if objectType_nodes:
+            ot = event.reader.getTextValue(objectType_nodes[0])
+            if ot:
+                if ot not in ['Course', 'FSSFile', 'Document', 'File', 'Image', 'Link']:
+                    raise ManifestError, '"%s" is not a recognized object type.' %ot
+                event.metadata['Type'] = '%s' %ot
+
+        copyright_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'copyright')
+        if copyright_nodes:
+            cn = event.reader.getTextValue(copyright_nodes[0])
+            if cn:
+                event.metadata['rights'] = cn
+
+        license_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'license')
+        if license_nodes:
+            license_node = license_nodes[0]
+            license = [str(license_node.getAttribute('category'))]
+            licenseName_nodes = license_node.getElementsByTagNameNS(ec_namespace, 'licenseName')
+            if licenseName_nodes:
+                license.append(str(event.reader.getTextValue(licenseName_nodes[0])))
+            else:
+                license.append('None')
+            licenseUrl_nodes = license_node.getElementsByTagNameNS(ec_namespace, 'licenseUrl')
+            if licenseUrl_nodes:
+                license.append(str(event.reader.getTextValue(licenseUrl_nodes[0])))
+            else:
+                license.append('None')
+            licenseIconUrl_nodes = license_node.getElementsByTagNameNS(ec_namespace, 'licenseIconUrl')
+            if licenseIconUrl_nodes:
+                license.append(str(event.reader.getTextValue(licenseIconUrl_nodes[0])))
+            else:
+                license.append('None')
+            event.metadata['license'] = license
+
+        clearedCopyright_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'clearedCopyright')
+        if clearedCopyright_nodes:
+            cc = event.reader.getTextValue(clearedCopyright_nodes[0])
+            if 'true' == cc:
+                event.metadata['clearedCopyright'] = True
+            else:
+                event.metadata['clearedCopyright'] = False
+
+        accessibility_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'accessible')
+        if accessibility_nodes:
+            access = event.reader.getTextValue(accessibility_nodes[0])
+            if 'true' == access:
+                event.metadata['accessible'] = True
+            else:
+                event.metadata['accessible'] = False
+
+        courseId_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'courseId')
+        if courseId_nodes:
+            cin = event.reader.getTextValue(courseId_nodes[0])
+            if cin:
+                event.metadata['courseId'] = cin
+                
+        term_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'term')
+        if term_nodes:
+            tm = event.reader.getTextValue(term_nodes[0])
+            if tm:
+                event.metadata['term'] = tm
+                
+        displayInsEmail_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'displayInstEmail')
+        if displayInsEmail_nodes:
+            die = event.reader.getTextValue(displayInsEmail_nodes[0])
+            if 'true' == die:
+                event.metadata['displayInstEmail'] = True
+            else:
+                event.metadata['displayInstEmail'] = False
+
+        instrIsPrincipal_nodes = event.node.getElementsByTagNameNS(ec_namespace, 'instructorAsCreator')
+        if instrIsPrincipal_nodes:
+            iis = event.reader.getTextValue(instrIsPrincipal_nodes[0])
+            if 'true' == iis:
+                event.metadata['instructorAsCreator'] = True
+            else:
+                event.metadata['instructorAsCreator'] = False
+
+        excludeFromNav_nodes = event.node.getElementsByTagNameNS(ec_namespace,'excludeFromNav')
+        if excludeFromNav_nodes:
+            efn = event.reader.getTextValue(excludeFromNav_nodes[0])
+            if 'true' == efn:
+                event.metadata['excludeFromNav'] = True
+            else:
+                event.metadata['excludeFromNav'] = False
+        
+        homePagePath_nodes = event.node.getElementsByTagNameNS(ec_namespace,'homePagePath')
+        if homePagePath_nodes:
+            event.metadata['homePagePath'] = event.reader.getTextValue(homePagePath_nodes[0])
+
+    node = event.node
+    manNode = None
+    while node.parentNode:
+        manNode = node
+        node = node.parentNode
+
+    cwsp = manNode.getAttribute("xmlns:cwsp")
+    if cwsp == "http://www.dspace.org/xmlns/cwspace_imscp":
+        event.metadata['license'] = ["MIT OCW License","MIT OCW License","http://ocw.mit.edu/OcwWeb/Global/terms-of-use.htm","http://ocw.mit.edu/NR/rdonlyres/B2A8B934-D6FD-4481-A702-3C9C6E56A355/0/cc_button.jpg"]
+
+
+def writeContributeNode(event):
+    """ Handle a write contributor node event. """
+
+    cltool = getUtility(IContentLicensingUtility)
+    linfo = cltool.getLicenseAndHolderFromObject(event.object)
+    if linfo and linfo[0]:
+        event.mwriter.createContributeElement(event.writer,
+                                              LOM_namespace,
+                                              event.node,
+                                              'eduCommonsv1.2',
+                                              'rights holder',
+                                              linfo[0],
+                                              event.object.ModificationDate())
+
+    if hasattr(event.object.aq_explicit, 'getInstructorName'):
+        instructorName = event.object.getInstructorName()
+    else:
+        instructorName = None
+
+    if hasattr(event.object.aq_explicit, 'getInstructorEmail'):
+        instructorEmail = event.object.getInstructorEmail()
+    else:
+        instructorEmail = None
+
+    if instructorName:
+        event.mwriter.createContributeElement(event.writer,
+                                              LOM_namespace,
+                                              event.node,
+                                              'eduCommonsv1.2',
+                                              'Instructor',
+                                              instructorName,
+                                              event.object.ModificationDate(),
+                                              instructorEmail)
+
+def readContributeNode(event):
+    """ Handle a read contributor node event. """
+
+    if eduCommons_version == event.source:
+        if 'Instructor' == event.value and event.vlist:
+            instructorName, instructorEmail = event.vlist[0]
+            if instructorName:
+                event.metadata['instructorName'] = instructorName
+            if instructorEmail:
+                event.metadata['instructorEmail'] = instructorEmail
+        if 'rights holder' == event.value and event.vlist:
+            holderName, holderEmail = event.vlist[0]
+            if holderName:
+                event.metadata['rightsHolder'] = holderName
+
+
+def writeOrganizations(event):
+    """ Handle write organizations event. """
+    
+    objects = [obj.getObject() for obj in \
+               event.object.portal_catalog.searchResults(
+                   path={'query':'/'.join(event.object.getPhysicalPath())+'/',})]
+
+    orgId = event.writer._createPathId(event.object.virtual_url_path(), 'ORG')
+    org_node = event.writer._createNode(event.node,
+                                        '',
+                                        'organization',
+                                        attrs=[('identifier', orgId)])
+
+    for obj in objects:
+        if not obj.getExcludeFromNav() and 'Course' != obj.portal_type:
+            itemId = event.writer._createPathId(obj.virtual_url_path(), 'ITM')
+            pathId = event.writer._createPathId(obj.virtual_url_path(), 'RES')
+            item_node = event.writer._createNode(org_node,
+                                                 '',
+                                                 'item',
+                                                 attrs=[('identifier', itemId),
+                                                        ('identifierref', pathId),
+                                                        ('isvisible', 'true'),])
+            event.writer._createNode(item_node, '', 'title', obj.title)
+
+
+def readOrganizations(event):
+    """ Handle read organizations event. """
+
+    default = event.node.getAttribute('default')
+    organization_nodes = event.node.getElementsByTagName('organization')
+    if organization_nodes:
+        if default:
+            for org_node in organization_nodes:
+                if org_node.getAttribute('identifier') == default:
+                    organization_node = org_node
+                    break
+        else:
+            organization_node = organization_nodes[0]
+        
+        item_nodes = organization_nodes[0].getElementsByTagName('item')
+        itemnum = 1
+        for item in item_nodes:
+            if 'true' == item.getAttribute('isvisible'):
+                idref = item.getAttribute('identifierref')
+                event.org[idref] = itemnum
+                itemnum += 1
+
+    node = event.node
+    manNode = None
+    while node.parentNode:
+        manNode = node
+        node = node.parentNode
+
+    cwsp = manNode.getAttribute("xmlns:cwsp")
+    if cwsp == "http://www.dspace.org/xmlns/cwspace_imscp":
+        obj = event.object
+        clutil = getUtility(IContentLicensingUtility)
+        licprops = obj.portal_properties.content_licensing_properties
+
+        if "license_mit" not in clutil.getAvailableLicenses(obj):
+            license_mit = ["MIT OCW License","MIT OCW License","http://ocw.mit.edu/OcwWeb/Global/terms-of-use.htm","http://ocw.mit.edu/NR/rdonlyres/B2A8B934-D6FD-4481-A702-3C9C6E56A355/0/cc_button.jpg"]
+            licprops.manage_addProperty("license_mit", license_mit, 'lines')
+            licprops.manage_changeProperties(SupportedLicenses=list(licprops.SupportedLicenses)+["license_mit"])
+            licprops.manage_changeProperties(AvailableLicenses=list(licprops.AvailableLicenses)+["license_mit"])
+
+
+
+class eduCommonsCreator:
+    """ Set the creator to an eduCommons specific creator function. """
+
+    def __call__(self, event):
+        if 'eduCommons' == event.rtype:
+            self.createObject(event.object, event.resource, event.data, event.metadata)
+
+    def createObject(self, object, filepath, data, metadata):
+        """ Create an object with the given parameters. """
+        # Get info
+        id = filepath.split('/')[-1]
+        
+        res_mimetype = mimetypes.guess_type(id)[0]
+        
+        if not metadata.has_key('Type'):       
+            if res_mimetype in ['text/html', 'text/htm' 'text/plain' 'text/x-rst', 'text/structured']:
+                metadata['Type'] = 'Document'
+            elif res_mimetype == None:
+                metadata['Type'] = 'File'
+            elif re.match('^image', res_mimetype):
+                metadata['Type'] = 'Image'
+            else:
+                metadata['Type'] = 'File'        
+
+        objtype = metadata['Type']
+
+        # Must check against type for IMS packages that embed the Course Home Page within folder(s)
+        # If the check is not in place, eduCommons will try to create a Course object within a Course
+        if objtype == 'Course':
+            parent = object
+        else:
+            # Get the ZODB path, create folders if they do not exist
+            pathlist = filepath.split('/')
+            #pathlist = pathlist[1:]
+            parent = object
+            for p in pathlist[:-1]:
+                newparent = getattr(parent.aq_explicit, p, None)
+                if newparent:
+                    parent = newparent
+                else:
+                    parent = self.createFolder(parent, p)
+                    parent.title = parent.id
+
+        # Get the new object if it exists, otherwise create it
+        newobj = None
+        if parent == object and object.portal_type == objtype:
+            newobj = object
+        elif hasattr(parent.aq_explicit, id):
+            # The parent node has the object in it
+            childobj = getattr(parent, id)
+            # Check to see if the child node is the same type
+            # as the new object, as we are going to be rewriting
+            # all of its values.
+            if childobj.portal_type == objtype:
+                newobj = childobj
+            else:
+                # We need to delete this object, as it is not
+                # the same type as the one we are trying to
+                # upload.
+                parent.manage_delObjects([id])
+
+        # If we do not already have an object, create a new oney
+        if not newobj:
+            parent.invokeFactory(objtype, id)
+            newobj = getattr(parent, id)
+            newobj = object.portal_factory.doCreate(newobj, id)
+            
+        # Set the file data on the object
+        if objtype in ['Course', 'Document']:
+            data = self.stripHeader(data)
+            if metadata.has_key('Format'):
+                newobj.setText(data, mimetype=metadata['Format'], filename=id)
+            else:
+                mimetype = mimetypes.guess_type(newobj.absolute_url())[0]
+                newobj.setText(data, mimetype=mimetype, filename=id)           
+        elif objtype in ['File', 'FSSFile']:
+            newobj.setFile(data)
+            newobj.setFormat(res_mimetype)
+        elif 'Image' == objtype:
+            newobj.setImage(data)
+            newobj.setFormat(res_mimetype)
+        elif 'Link' == objtype:
+            doc = minidom.parseString(data)
+            anchor_nodes = doc.getElementsByTagName('a')
+            if anchor_nodes:
+                newobj.setRemoteUrl(str(anchor_nodes[0].getAttribute('href')))
+
+        # Set the metadata on the object
+        for key in metadata.keys():
+            field = newobj.getField(key)
+            if field:
+                mutator = field.getMutator(newobj)
+                if mutator:
+                    field = metadata[key]
+                    mutator(field)
+
+        if metadata.has_key('accessible'):
+            IAnnotations(newobj)['eduCommons.accessible'] = metadata['accessible']
+        else:
+            IAnnotations(newobj)['eduCommons.accessible'] = False
+
+        if objtype == 'Course':
+            newobj.setExcludeFromNav('False')
+
+        if metadata.has_key('rightsHolder'):
+            getUtility(IContentLicensingUtility).setRightsHolder(newobj, metadata['rightsHolder'])
+
+        if metadata.has_key('license'):
+            getUtility(IContentLicensingUtility).setRightsLicense(newobj, metadata['license'])
+
+        if metadata.has_key('homePagePath'):
+            course = getUtility(IECUtility).FindECParent(newobj)
+            if course.portal_type == 'Course':
+                if course.hasProperty('homePagePath'):
+                    course.manage_changeProperties(homePagePath=metadata['homePagePath'])
+                else:
+                    course.manage_addProperty('homePagePath',metadata['homePagePath'],'string')
+
+        # Reindex the object so that the new stuff appears
+        newobj.reindexObject()
+
+
+    def createFolder(self, parent, id):
+        """ Create an object """
+
+        #hack to avoid IMS import failures from MIT package
+        if 'search' == id:
+            id = '%s-1' %id
+
+        parent.invokeFactory('Folder',id)
+        obj = getattr(parent, id)
+        obj.setExcludeFromNav(True)
+        obj = obj.portal_factory.doCreate(obj, id)
+        obj.reindexObject()
+
+        return obj
+
+
+    def stripHeader(self, data):
+        """ Tidy up any html, if we can. """
+        # get the body text
+        result = RE_BODY.search(data)
+        if result:
+            data = result.group(1)
+        return data
+            
+
+eduCommonsCreateObject = eduCommonsCreator()
+ 
+
+def syndicateFolderishObject(object, event):
+    """ Enable RSS feed upon FolderishObject creation. """
+    if not hasattr(object.aq_explicit, 'syndication_information'):
+        syInfo = SyndicationInformation()
+        object._setObject('syndication_information', syInfo)
+        portal = object.portal_url.getPortalObject()
+        portal_syn = portal.portal_syndication
+        syInfo = object._getOb('syndication_information')
+        syInfo.syUpdatePeriod = portal_syn.syUpdatePeriod
+        syInfo.syUpdateFrequency = portal_syn.syUpdateFrequency
+        syInfo.syUpdateBase = portal_syn.syUpdateBase
+        syInfo.max_items = portal_syn.max_items
+        syInfo.description = "Channel Description"
+
+def addObjPosition(object, event):
+    appendObjPosition(object)
+
+def appendObjPosition(object):
+    if not object.isTemporary():
+        ecutil = queryUtility(IECUtility)
+        if ecutil:
+            parent = ecutil.FindECParent(object)
+            if parent.Type() == 'Course':
+                path = {'path':{'query':'/'.join(parent.getPhysicalPath())+'/'},}
+                brains = object.portal_catalog.searchResults(path)
+                if brains:
+                    pos = [0,]
+                    for brain in brains:
+                        obj = brain.getObject()
+                        annotations = IAnnotations(obj)
+                        if annotations.has_key('eduCommons.objPositionInCourse'):
+                            pos += [annotations['eduCommons.objPositionInCourse'],]
+                    maxpos = max(pos)
+                    if maxpos > 0:
+                        maxpos += 1
+                    else:
+                        maxpos = 1
+                else:
+                    maxpos = 1
+                
+                annotations = IAnnotations(object)
+                annotations['eduCommons.objPositionInCourse'] = maxpos
+
+                zipobj = getattr(parent, parent.id + '.zip', None)
+                if zipobj:
+                    IAnnotations(zipobj)['eduCommons.objPositionInCourse'] = maxpos + 1
+                    zipobj.reindexObject()
+                    
+    
+
+class eduCommonsImportForm(ImportForm):
+    """ Render the import form  """
+
+    @action('Upload')
+    def action_import(self, action, data):
+
+        filename = self.context.REQUEST['form.filename']
+        packagetype = self.context.REQUEST['form.packagetype']
+
+        imsvocab = getUtility(IVocabularyFactory, name='imsvocab')(self.context)
+        package_xform = imsvocab.getTermByToken(packagetype).value
+
+        self.ims_util.importZipfile(self.context,filename,package_xform,rtype='eduCommons')
+
+        self.request.response.redirect('.')
+
+
+
+def updateZipDownload(object, event):
+    """ Check for factors related to editing and adding objects """
+    pw = event.object.portal_workflow
+
+    if pw.getInfoFor(event.object,'review_state') == 'Published':
+        validateContext(object, event)
+
+    
+
+def ZipFileMaker(event):
+    """ Handler for creating zip download for objects that are moving through workflow changes """
+
+    if event.bulkChange and event.target in ['manager_rework','retract']:
+        validateContext(event.object,event)        
+    elif event.initial_state == 'Published' or event.target == 'publish':
+        validateContext(event.object,event)
+    else:
+        pass 
+
+def deleteObjectHandler(event):
+    """ Handlet the delete object event """
+    if event.bulkChange == True:
+        if event.contains_published:
+            validateContext(event.object, event)
+    else:
+        validateContext(event.object, event)
+
+
+def validateContext(object, event):
+    """ create the Zipfile after some final checks """
+
+    parent = getUtility(IECUtility).FindECParent(object)
+    file_id = parent.id + '.zip'
+    pw = event.object.portal_workflow
+    
+    if parent.portal_type == 'Course':
+        if pw.getInfoFor(parent,'review_state') == 'Published':
+            if not event.object.isTemporary():
+                if event.object.id != file_id:
+                    if not IContainerModifiedEvent.providedBy(event):
+                        ZipFileCreator(parent,event).createZipFile()
+
+
+
+
+## Deprecated for 3.1.0, as auto generated Course packages have been disabled
+## Replaced by Package Course functionality :: browser/packagecourseview.py
+class ZipFileCreator:
+
+    def __init__(self, object, event):
+        self.obj = object
+        self.event = event
+
+    def createZipFile(self):
+        """ Create a zip file for when the file is modified. """
+
+        course = self.obj
+        file_id = course.id + '.zip'
+
+        pm = course.portal_membership
+        user_id = pm.getAuthenticatedMember().id
+        roles = pm.getAuthenticatedMember().getRoles()
+        if 'Publisher' in roles:
+            roles += ['Administrator']
+            course.manage_setLocalRoles(user_id, roles)
+            course.reindexObjectSecurity()
+
+        data = self.getZipFileData(course=course)
+
+        if not data:
+            return
+
+        if not hasattr(course,file_id):
+                    
+            course.invokeFactory("File",file_id)
+            fileobj = getattr(course,file_id)
+            fileobj.content_status_modify(workflow_action='submit')
+            fileobj.content_status_modify(workflow_action='release')
+            fileobj.content_status_modify(workflow_action='publish')
+            fileobj.setTitle("Download This Course")
+
+        else:
+            fileobj = getattr(course,file_id)            
+            fileobj.setTitle("Download This Course")
+
+        
+        fileobj.setExcludeFromNav(False)
+        fileobj.setFile(data)
+        appendObjPosition(fileobj)
+
+        course.portal_catalog.reindexObject(fileobj)
+        user_ids = []
+        user_ids += [user_id]
+        course.manage_delLocalRoles(userids=user_ids)
+        course.reindexObjectSecurity()
+
+    def getZipFileData(self, course, obj_paths=[], filename=None):
+        """
+        Return the content for a zip file
+        """
+        objects_list = getUtility(IZipFileTransportUtility)._createObjectList(course, obj_paths, state=['Published'])
+        objects_list.insert(0,course)
+        context_path = str( course.virtual_url_path() )
+
+        # Do not include the zip file for the course
+        mod_objects_list = [object for object in objects_list if object.virtual_url_path().replace(course.virtual_url_path(),'') != '/' + course.id + '.zip']
+        
+        if mod_objects_list:
+            content = getUtility(IZipFileTransportUtility)._getAllObjectsData(mod_objects_list, context_path)
+            return content
+        else:
+            return None
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/events.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/events.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/events.py	(revision 126)
@@ -0,0 +1,102 @@
+from zope.component import getUtility, getMultiAdapter
+from zope.component.interfaces import ComponentLookupError
+from zope.annotation.interfaces import IAnnotations
+from plone.portlets.interfaces import IPortletManager, IPortletAssignmentMapping
+from Products.CMFPlone.utils import _createObjectByType
+from Products.CMFCore.utils import getToolByName
+from enpraxis.educommons import portlet
+from enpraxis.educommons.utilities.interfaces import IECUtility
+from enpraxis.educommons.interfaces import IClearCopyrightable, IClearCopyright, ICourseUpdateEvent, IDeleteCourseObjectEvent, IAccessibilityCompliantable, IAccessibilityCompliant
+from zope.component.interfaces import ObjectEvent
+from zope.interface import implements
+
+
+def add_course_portlets(obj, evt):
+    """ add Course Summary portlet and OER Recommender portlet upon Course Creation  """
+    rightColumn = getUtility(IPortletManager, name=u'plone.rightcolumn', context=obj)
+    right = getMultiAdapter((obj, rightColumn), IPortletAssignmentMapping, context=obj)
+
+    #This code breaks the course object when the server has no outbound access to the web
+    if u'OER Recommender' not in right:
+        right[u'OER Recommender'] = portlet.oerrecommenderportlet.Assignment()
+
+    if u'Course Summary' not in right:
+        right[u'Course Summary'] = portlet.courseinfoportlet.Assignment()
+
+    if u'Reuse Course' not in right:
+        right[u'Reuse Course'] = portlet.reusecourseportlet.Assignment()
+
+
+def set_default_creators(obj, evt):
+    """ sets default value for Creator for newly created objects within a Course  """
+    #Try block for instantiating Plone site
+    try:
+        ecutils = getUtility(IECUtility)
+    except ComponentLookupError: 
+        return
+
+    creators = obj.Schema()['creators']
+
+    if hasattr(obj, 'getECParent'):
+        parent = obj.getECParent()
+
+        #Check to see if this is a temp obj and within a course
+        if obj.isTemporary() and parent.meta_type == 'Course' and obj.Type() != 'Course':
+            creators.set(obj, ('(course_default)', ))
+
+def set_default_excludefromnav(obj, evt):
+    """ sets the default value for excludeFromNav or image, file, and document to True  """
+    exclude = obj.Schema()['excludeFromNav']
+    if obj.isTemporary() and obj.Type() not in ['Division', 'Course']:
+        exclude.set(obj, True)
+
+def update_clear_copyright(obj, evt):
+    """ update clear copyright annotation  """
+    if IClearCopyrightable.providedBy(evt.object):
+	if hasattr(evt.object.REQUEST, 'clearedCopyright'):
+	    if hasattr(evt.object.REQUEST, 'id'):
+	        if evt.object.id == evt.object.REQUEST['id']:
+                    IAnnotations(evt.object)['eduCommons.clearcopyright'] = evt.object.REQUEST['clearedCopyright']
+                    evt.object.reindexObject()
+        else:
+	    IAnnotations(evt.object)['eduCommons.clearcopyright'] = False
+            evt.object.reindexObject()
+
+def update_accessibility_compliant(obj, evt):
+    """ update accessibility compliant annotation  """
+    if IAccessibilityCompliantable.providedBy(evt.object):
+	if hasattr(evt.object.REQUEST, 'accessibilitycompliant'):
+	    if hasattr(evt.object.REQUEST, 'id'):
+	        if evt.object.id == evt.object.REQUEST['id']:
+                    IAnnotations(evt.object)['eduCommons.accessible'] = evt.object.REQUEST['accessibilitycompliant']
+                    evt.object.reindexObject()
+        else:
+	    IAnnotations(evt.object)['eduCommons.accessible'] = False
+            evt.object.reindexObject()
+
+def reindexOnReorder(obj, event):
+    obj.reindexObject()
+
+
+
+class CourseUpdate(ObjectEvent):
+    """ Set namespace information in manifest. """
+    implements(ICourseUpdateEvent)
+
+    def __init__(self, object, workflow_action, bulkChange, initial_state=None):
+        super(CourseUpdate, self).__init__(object)
+        self.object = object
+        self.target = workflow_action
+        self.bulkChange = bulkChange
+        self.initial_state = initial_state
+
+class DeleteObjectEvent(ObjectEvent):
+    """ Set namespace information in manifest. """
+    implements(IDeleteCourseObjectEvent)
+
+    def __init__(self, object, bulkChange, contains_published):
+        super(DeleteObjectEvent, self).__init__(object)
+        self.object = object
+        self.bulkChange = bulkChange
+        self.contains_published = contains_published
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/Archetypes.Field.py.patch
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/Archetypes.Field.py.patch	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/Archetypes.Field.py.patch	(revision 126)
@@ -0,0 +1,13 @@
+--- Field.py	2008-03-04 12:43:18.000000000 -0700
++++ Field.py.PATCHED	2008-03-04 12:42:16.000000000 -0700
+@@ -1320,6 +1320,10 @@
+                                 filename.rfind(':'),
+                                 )+1:]
+ 
++        # temporary hack until http://dev.plone.org/plone/ticket/7893 is resolved:
++        if type(mimetype) is list:
++            mimetype = mimetype[0]
++        # end hack
+ 
+         if mimetype is None or mimetype == 'text/x-unknown-content-type':
+             if body is None:
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/Migrate.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/Migrate.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/Migrate.py	(revision 126)
@@ -0,0 +1,406 @@
+from Products.CMFPlone.utils import _createObjectByType
+from StringIO import StringIO
+from zope.component import getUtility, getMultiAdapter
+from Products.CMFPlone.factory import addPloneSite
+from Products.CMFCore.utils import getToolByName
+from enpraxis.educommons import portlet
+from enpraxis.educommons.setupHandlers import setupTransforms, setupKupu, publishObject
+from enpraxis.educommons.browser.packagecourseview import appendObjPosition
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+from plone.portlets.interfaces import IPortletManager, IPortletAssignmentMapping
+
+def migrate_2_3_1_to_3_0_4(self):
+    out = StringIO()
+    print >> out, '<h3>Starting Migration</h3>\n'
+    print >> out, '<ul>\n'
+
+    oldsite = self.eduCommons
+
+    # If we have a previous attempt, erase it
+    if getattr(self, 'mig_ec', None):
+        self.manage_delObjects(['mig_ec'])
+
+    # Create a new plone site
+    addPloneSite(self, 
+                 'mig_ec', 
+                 extension_ids = ('Products.ContentLicensing:default',
+                                  'Products.IMSTransport:default',
+                                  'Products.PloneBookmarklets:default',
+                                  'Products.ZipFileTransport:default',
+                                  'Products.eduCommons:default',
+                                  'Products.leftskin:default',
+                                  ))
+
+    newsite = self.mig_ec
+    print >> out, '  <li>New eduCommons site Created</li>\n'
+
+    # Copy MailHost Settings
+    newsite.MailHost = oldsite.MailHost
+
+    # Copy about folder contents
+
+    newsite.about.manage_delObjects(['abouttext_text',
+                                     'terms-of-use',
+                                     'privacy-policy'])
+    objs = oldsite.about.manage_copyObjects(oldsite.about.objectIds())
+    newsite.about.manage_pasteObjects(objs)
+    newsite.about.manage_renameObjects(['copy_of_index_html'], ['abouttext_text'])
+    setWorkflow(self, newsite.about, oldsite.about, {'index_html':'abouttext_text'}, False)
+    print >> out, '  <li>Migrated the About folder</li>\n'
+    
+    # Copy Help folder contents
+
+    newsite.help.manage_delObjects(['help_text'])
+    objs = oldsite.help.manage_copyObjects(oldsite.help.objectIds())
+    newsite.help.manage_pasteObjects(objs)
+    newsite.help.manage_renameObjects(['copy_of_index_html'], ['help_text'])
+    setWorkflow(self, newsite.help, oldsite.help, {'index_html':'help_text'}, False)
+    print >> out, '  <li>Migrated the Help folder</li>\n'
+
+    # Copy the old feedback contents
+
+    objs = oldsite.feedback.manage_copyObjects(oldsite.feedback.objectIds())
+    newsite.feedback.manage_pasteObjects(objs)
+    newsite.feedback.manage_renameObjects(['copy_of_index_html'], ['feedback'])
+    setWorkflow(self, newsite.feedback, oldsite.feedback, {'index_html':'feedback'}, False)
+    print >> out, '  <li>Migrated the Feedback folder</li>\n'
+
+    # Migrate other top level content
+
+    objs = oldsite.portal_catalog.searchResults(portal_type=['File', 'Image', 'Document'],
+                                                path={'query':'/',
+                                                      'depth':2,})
+    newsite.manage_delObjects(['front-page'])
+    obj_ids = [x.id for x in objs]
+    co = oldsite.manage_copyObjects(obj_ids)
+    newsite.manage_pasteObjects(co)
+    for x in obj_ids:
+        obj = getattr(oldsite, x)
+        newobj = getattr(newsite, x)
+        if x != 'front-page':
+            newobj.setExcludeFromNav(True)
+        if obj.__annotations__.has_key('review_state'):
+            moveWorkflow(self, newobj, obj.__annotations__['review_state'])
+
+    # Copy OCW content
+
+    depts = oldsite.portal_catalog.searchResults(Type='Folder', 
+                                                 path={'query':'/',
+                                                       'depth':2,})
+    print >> out, '  <li>Migrating Divisions</li>\n'
+    print >> out, '  <ul>\n'
+
+    for dept in depts:
+        obj = dept.getObject()
+        if obj.__annotations__.has_key('dept.text'):
+            migrateDivision(self, newsite, obj)
+            print >> out, '    <li>Migrated %s</li>\n' %obj.Title()
+        elif dept.id not in ['help', 'about', 'feedback']:
+            co = oldsite.manage_copyObjects(obj.id)
+            newsite.manage_pasteObjects(co)
+            setWorkflow(self, getattr(newsite, obj.id), obj)
+            
+    print >> out, '  </ul>\n'
+
+    print >> out, '  <li>Migrated Content</li>\n'
+
+
+
+    # Migrate Theme
+    if getattr(oldsite.portal_skins.custom, 'base_properties', None):
+        oldprops = oldsite.portal_skins.custom.base_properties
+        newprops = newsite.portal_skins.custom.base_properties
+
+        ns = newsite.portal_skins
+        os = oldsite.portal_skins
+
+        copyProperty(os, ns, 'logoName', 'logoName', True)
+        copyProperty(os, ns, 'headerColor', 'portalHeaderBackgroundColor')
+        copyProperty(os, ns, 'bannerImage', 'portalHeaderBackgroundImage', True)
+        copyProperty(os, ns, 'topNavBackground', 'portalTopNavBackgroundColor')
+        copyProperty(os, ns, 'topNavBarBgImage', 'portalTopNavBackgroundImage', True)
+        #copyProperty(os, ns, 'leftNavColor', 'portalColumnOneBackgroundColor') 
+        copyProperty(os, ns, 'leftBgName', 'portalColumnOneBackgroundImage', True)
+        copyProperty(os, ns, 'favicon', 'faviconName', True)
+                                         
+    print >> out, '  <li>Migrated theme</li>\n'
+
+    # Properties
+    #Migrate ContentLicensing Propertiese
+    old_cl_props = oldsite.portal_properties.contentlicensing_properties
+    new_cl_props = newsite.portal_properties.content_licensing_properties
+    for prop in old_cl_props.propertyMap():
+        #Overwrite default new values with default old values
+        if prop['id'] in new_cl_props.propertyIds():
+            id = prop['id']
+            if id != 'Jurisdiction':
+                key_value = {id : old_cl_props.getProperty(id) }
+                new_cl_props.manage_changeProperties(**key_value)
+            else:
+                for value in new_cl_props.jurisdiction_options:
+                    if old_cl_props.getProperty(id) in value:
+                        new_cl_props.manage_changeProperties(Jurisdiction=value)
+        #Add properties if they don't exist in new
+        else:
+            id = prop['id']
+            type = prop['type']
+            value = old_cl_props.getProperty(id)
+            new_cl_props.manage_addProperty(id=id, type=type, value=value)
+            
+    print >> out, '  <li>Migrated ContentLicensing Properties</li>\n'
+
+    #Migrate IMSTransport Properties
+    old_ims_props = oldsite.portal_properties.ims_properties
+    new_ims_props = newsite.portal_properties.ims_transport_properties
+    for prop in old_ims_props.propertyMap():
+        #Overwrite default new values with default old values
+        if prop['id'] in new_ims_props.propertyIds():
+            id = prop['id']
+            key_value = {id : old_ims_props.getProperty(id) }
+            new_ims_props.manage_changeProperties(**key_value)
+        #Add if doesn't exist in new (different engines)
+        else:
+            id = prop['id']
+            type = prop['type']
+            value = old_ims_props.getProperty(id)
+            new_ims_props.manage_addProperty(id=id, type=type, value=value)
+            
+
+    print >> out, '  <li>Migrated IMSTransport Properties</li>\n'
+
+    #Migrate relevant old site properties
+    old_site_props = oldsite.portal_properties.migrateable_properties
+    newsite.manage_changeProperties(title=old_site_props.site_title,
+                                    description=old_site_props.description,
+                                    email_from_address=old_site_props.email_from_address,
+                                    email_from_name=old_site_props.email_from_name
+                                    )
+    ec_props = newsite.portal_properties.educommons_properties
+    ec_props.manage_changeProperties(division_descriptor=old_site_props.division_descriptor,
+                                     course_descriptor=old_site_props.course_descriptor
+                                     )
+  
+    print >> out, '  <li>Migrated Site properties</li>\n'
+
+    #Migrate Users
+    old_users = oldsite.acl_users.manage_copyObjects(['local_roles', 
+                                                      'mutable_properties', 
+                                                      'portal_role_manager',
+                                                      'source_groups', 
+                                                      'source_users'])
+    newsite.acl_users.manage_delObjects(['local_roles', 
+                                         'mutable_properties', 
+                                         'portal_role_manager',
+                                         'source_groups', 
+                                         'source_users'])
+    newsite.acl_users.manage_pasteObjects(old_users)
+
+    #Activate plugins for each copied object
+    acl_users = newsite.acl_users
+    acl_users.local_roles.manage_activateInterfaces(['ILocalRolesPlugin',
+                                                     'IRolesPlugin'])
+    acl_users.mutable_properties.manage_activateInterfaces(['IPropertiesPlugin',
+                                                            'IUserEnumerationPlugin'])
+    acl_users.portal_role_manager.manage_activateInterfaces(['IRoleAssignerPlugin',
+                                                             'IRoleEnumerationPlugin',
+                                                             'IRolesPlugin'])
+    acl_users.source_groups.manage_activateInterfaces(['IGroupEnumerationPlugin',
+                                                       'IGroupIntrospection',
+                                                       'IGroupManagement',
+                                                       'IGroupsPlugin'])
+    acl_users.source_users.manage_activateInterfaces(['IAuthenticationPlugin', 
+                                                      'IUserAdderPlugin', 
+                                                      'IUserEnumerationPlugin', 
+                                                      'IUserIntrospection', 
+                                                      'IUserManagement'])
+
+    old_pgd = oldsite.portal_groupdata
+    newsite.portal_groupdata = old_pgd
+
+    old_pmd = oldsite.portal_memberdata
+    newsite.portal_memberdata = old_pmd
+
+    #Set all users default editor to Kupu
+    users = newsite.acl_users.getUsers()
+    for user in users:
+        user.setProperties(wysiwyg_editor = 'Kupu')
+
+    print >> out, '  <li>Migrated Users</li>\n'
+
+    # Move new site into place
+
+    self.manage_delObjects(oldsite.getId())
+    self.manage_renameObject(newsite.getId(), 'eduCommons', REQUEST=None)
+
+
+    print >> out, '</ul>\n'
+    print >> out, 'Done.\n'
+    return out.getvalue()
+
+
+
+def copyProperty(src, dest, srcprop, destprop, doImage=False):
+    prop = src.custom.base_properties.getProperty(srcprop)
+    if prop:
+        if not doImage:
+            dest.custom.base_properties.manage_changeProperties(**{destprop:prop})
+            return True
+        elif getattr(src.custom, prop, None):
+            dest.custom.base_properties.manage_changeProperties(**{destprop:prop})
+            try:
+                co = src.custom.manage_copyObjects([prop])
+            except AttributeError:
+                pass
+            else:
+                dest.custom.manage_pasteObjects(co)
+            return True
+    return False
+    
+
+def migrateDivision(self, newsite, dobj):
+    """ Migrate a division from the old site to the new. """
+    # Create a new division
+    _createObjectByType('Division',
+                        newsite,
+                        id=dobj.getId(),
+                        title=dobj.Title(),
+                        description=dobj.Description(),
+                        subject=dobj.Subject(),
+                        contributors=dobj.Contributors(),
+                        creators=dobj.Creators(),
+                        language=dobj.Language(),
+                        rights=dobj.Rights(),
+                        creation_date=dobj.CreationDate(),
+                        )
+    # Copy over remaining division attributes
+    div = getattr(newsite, dobj.getId())
+    div.setText(dobj.__annotations__['dept.text'])
+    #div.syndication_information = dobj.syndication_information
+    for x in dobj.__annotations__.keys():
+        if 'review_state' == x:
+            moveWorkflow(self, div, dobj.__annotations__[x])
+        if x != 'dept.text':
+            div.__annotations__[x] = dobj.__annotations__[x]
+
+    # Copy Course sub objects
+    oc = []
+    for oid,obj in dobj.objectItems():
+        if 'Folder' == obj.Type():
+            ann = getattr(obj, '__annotations__', None)
+            if ann and ann.has_key('course.text'):
+                migrateCourse(self, div, obj)
+            elif oid != 'syndication_information':
+                oc.append(oid)
+        else:
+            oc.append(oid)
+
+    # Copy all other sub objects
+    co = dobj.manage_copyObjects(oc)
+    div.manage_pasteObjects(co)
+
+    for oid,obj in div.objectItems():
+        if 'Course' != obj.Type() and 'syndication_information' != oid:
+            moveWorkflow(self, obj, getattr(dobj, oid).__annotations__['review_state'])
+            obj.workflow_history = getattr(dobj, oid).workflow_history
+
+def migrateCourse(self, div, cobj):
+    """ Migrate a course from the old site to the new. """
+    
+    # Create a new course
+    _createObjectByType('Course',
+                        div,
+                        id=cobj.getId(),
+                        title=cobj.Title(),
+                        description=cobj.Description(),
+                        subject=cobj.Subject(),
+                        contributors=cobj.Contributors(),
+                        creators=cobj.Creators(),
+                        language=cobj.Language(),
+                        rights=cobj.Rights(),
+                        creation_date=cobj.CreationDate(),
+                        )
+    
+    # Copy over remaining course attributes
+    course = getattr(div, cobj.getId())
+    course.setText(cobj.__annotations__['course.text'])
+    #course.syndication_information = cobj.syndication_information
+    a2f = {'course.term':'term',
+           'course.courseid':'courseId',
+           'course.instructorname':'instructorName',
+           'course.instructor_principal':'instructorAsCreator',
+           'course.instructoremail':'instructorEmail',
+           'course.displayInstructorEmail':'displayInstEmail'}
+    for x in cobj.__annotations__:
+        if x in a2f:
+            mut = course.getField(a2f[x]).getMutator(course)
+            mut(cobj.__annotations__[x])
+        elif 'review_state' == x:
+            moveWorkflow(self, course, cobj.__annotations__[x])
+        else:
+            course.__annotations__[x] = cobj.__annotations__[x]
+                
+    # Copy Course Objects
+    ids = cobj.objectIds()    
+
+    if '.LogFiles' in ids:
+        ids.remove('.LogFiles')
+
+    if 'syndication_information' in ids:
+        ids.remove('syndication_information')
+
+    co = cobj.manage_copyObjects(ids)
+
+    course.manage_pasteObjects(co)
+    #ensure each object has correct position in course
+    for oid in ids:
+        olditem = getattr(cobj, oid)
+        if olditem.__annotations__.has_key('eduCommons.objPositionInCourse'):
+            pos = olditem.__annotations__['eduCommons.objPositionInCourse']
+
+            newitem = getattr(course, oid)
+            newitem.__annotations__['eduCommons.objPositionInCourse'] = pos
+
+    setWorkflow(self, course, cobj)
+
+
+def setWorkflow(self, new, old, omappings={}, retainHistory=True):
+    for oldid,olditem in old.objectItems():
+        if oldid in omappings:
+            oldid = omappings[oldid]
+        if oldid != '.LogFiles':
+            newitem = getattr(new.aq_explicit, oldid)
+            try:
+                if olditem.__annotations__.has_key('review_state'):
+                    moveWorkflow(self, newitem, olditem.__annotations__['review_state'])
+                    if retainHistory:
+                        newitem.workflow_history = olditem.workflow_history
+                    if 'Folder' == olditem.Type():
+                        setWorkflow(self, newitem, olditem)
+            except AttributeError:
+                pass
+
+        
+def moveWorkflow(self, newobj, ostate):
+    wt = newobj.portal_workflow
+    nstate = wt.getInfoFor(newobj, 'review_state')
+    result = False
+    if 'Visible' == ostate:
+        ostate = 'Published'
+    if nstate == ostate:
+        result = True
+    elif 'InProgress' == nstate:
+        wt.doActionFor(newobj, 'submit', comment='', include_subfolders=False)
+        result = moveWorkflow(self, newobj, ostate)
+    elif 'QA' == nstate:
+        wt.doActionFor(newobj, 'release', comment='', include_subfolders=False)
+        result = moveWorkflow(self, newobj, ostate)
+    elif 'Released' == nstate:
+        wt.doActionFor(newobj, 'publish', comment='', include_subfolders=False)
+        result = moveWorkflow(self, newobj, ostate)
+    elif 'Published' == nstate:
+        result = True
+    return result
+                    
+                                
+                               
+            
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/PreMigrate.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/PreMigrate.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/PreMigrate.py	(revision 126)
@@ -0,0 +1,348 @@
+from Products.CMFCore.utils import getToolByName
+from StringIO import StringIO
+from Products.ATContentTypes.migration.walker import CatalogWalker
+from Products.ATContentTypes.migration.migrator import CMFFolderMigrator, CMFItemMigrator
+from zope.app.annotation.interfaces import IAnnotations, IAttributeAnnotatable
+from zope.interface import directlyProvidedBy, directlyProvides
+from Products.CMFPlone import transaction
+
+# base class to migrate objects and retain their license annotations
+class ObjectMigrator(CMFItemMigrator):
+    """Persist annotations to new object"""
+
+    def migrate_annotations(self):
+        """Persist annotations"""
+        if hasattr(self.old, '__annotations__'):
+            annotations = self.old.__annotations__
+            self.new.__annotations__ = annotations
+
+    def migrate_clearcopyright(self):
+        """Migrate clear copyright status to annotation """
+        if hasattr(self.old, 'clearedCopyright'):
+            copyright_status = self.old.getClearedCopyright()
+            """ Manually append field to default content type  """
+            self.new.__annotations__['eduCommons.clearcopyright'] = copyright_status
+
+    def migrate_current_workflow(self):
+        """Annotate the current workflow state"""
+        wft = self.old.portal_url.portal_workflow
+        cur_state = wft.getInfoFor(self.old, 'review_state')
+        self.new.__annotations__['review_state'] = cur_state
+
+class eduCommonsFoldersMigrator(CMFFolderMigrator):
+    """Persist annotations to new object"""
+
+    def migrate_annotations(self):
+        """Persist annotations"""
+        if hasattr(self.old, '__annotations__'):
+            annotations = self.old.__annotations__
+            self.new.__annotations__ = annotations
+            
+    def migrate_clearcopyright(self):
+        """Migrate clear copyright status to annotation """
+        if hasattr(self.old, 'clearedCopyright'):
+            copyright_status = self.old.getClearedCopyright()
+            """ Manually append field to default content type  """
+            self.new.__annotations__['eduCommons.clearcopyright'] = copyright_status
+
+    def migrate_current_workflow(self):
+        """Annotate the current workflow state"""
+        wft = self.old.portal_url.portal_workflow
+        cur_state = wft.getInfoFor(self.old, 'review_state')
+        self.new.__annotations__['review_state'] = cur_state
+
+
+
+class ECCourseMigrator(eduCommonsFoldersMigrator):
+    """Base class to migrate to Folder """
+    
+    def migrate_courseproperties(self):
+        """Place course specific fields in an annotation, to be used post-install of 3.0.1 """
+        if hasattr(self.old, 'Term'):
+            self.new.__annotations__['course.term'] = self.old.Term
+        if hasattr(self.old, 'CourseId'):
+            self.new.__annotations__['course.courseid'] = self.old.CourseId
+        if hasattr(self.old, 'InstructorName'):
+            self.new.__annotations__['course.instructorname'] = self.old.InstructorName
+        if hasattr(self.old, 'instructorAsPrincipalCreator'):
+            self.new.__annotations__['course.instructor_principal'] = self.old.instructorAsPrincipalCreator
+        if hasattr(self.old, 'InstructorEmail'):
+            self.new.__annotations__['course.instructoremail'] = self.old.InstructorEmail
+        if hasattr(self.old, 'displayInstructorEmail'):
+            self.new.__annotations__['course.displayInstructorEmail'] = self.old.displayInstructorEmail
+
+        text = self.old.getText()
+        self.new.__annotations__['course.text'] = text
+
+        #Remove right_slots portlets
+        self.old.manage_delProperties(['right_slots',])
+
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'ECCourse'
+    src_portal_type = 'ECCourse'
+    dst_meta_type = 'ATFolder'
+    dst_portal_type = 'Folder'
+
+class ECDepartmentMigrator(eduCommonsFoldersMigrator):
+    """Base class to migrate to Folder """
+
+    def migrate_deptproperties(self):
+        """Place course specific fields in an annotation, to be used post-install of 3.0.1 """
+        text = self.old.getText()
+        self.new.__annotations__['dept.text'] = text
+
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'ECDepartment'
+    src_portal_type = 'ECDepartment'
+    dst_meta_type = 'ATFolder'
+    dst_portal_type = 'Folder'
+
+class ECFolderMigrator(eduCommonsFoldersMigrator):
+    """Base class to migrate to Folder """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'ECFolder'
+    src_portal_type = 'ECFolder'
+    dst_meta_type = 'ATFolder'
+    dst_portal_type = 'Folder'
+
+    map = {'getExcludeFromNav' : 'setExcludeFromNav'}
+
+
+
+# Object migrators
+class GFolderMigrator(CMFFolderMigrator):
+    """Base class to migrate to Folder """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'GFolder'
+    src_portal_type = 'GFolder'
+    dst_meta_type = 'ATFolder'
+    dst_portal_type = 'Folder'
+
+    def migrate_current_workflow(self):
+        """Annotate the current workflow state"""
+        wft = self.old.portal_url.portal_workflow
+        cur_state = wft.getInfoFor(self.old, 'review_state')
+        self.new.__annotations__['review_state'] = cur_state
+
+    map = {'getExcludeFromNav' : 'setExcludeFromNav'}
+
+
+class ECDocumentMigrator(ObjectMigrator):
+    """Base class to migrate to Document """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'ECDocument'
+    src_portal_type = 'ECDocument'
+    dst_meta_type = 'ATDocument'
+    dst_portal_type = 'Document'
+    map = {'getRawText' : 'setText',
+           'getExcludeFromNav' : 'setExcludeFromNav'}
+
+class GDocumentMigrator(ObjectMigrator):
+    """Base class to migrate to Document """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'GDocument'
+    src_portal_type = 'GDocument'
+    dst_meta_type = 'ATDocument'
+    dst_portal_type = 'Document'
+    map = {'getRawText' : 'setText',
+           'Format' : 'setFormat',
+           'getExcludeFromNav' : 'setExcludeFromNav'}
+
+class ECFileMigrator(ObjectMigrator):
+    """Base class to migrate to File """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'ECFile'
+    src_portal_type = 'ECFile'
+    dst_meta_type = 'ATFile'
+    dst_portal_type = 'File'
+    map = {'getFile' : 'setFile',
+           'getExcludeFromNav' : 'setExcludeFromNav'}
+
+class GFileMigrator(ObjectMigrator):
+    """Base class to migrate to File """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'GFile'
+    src_portal_type = 'GFile'
+    dst_meta_type = 'ATFile'
+    dst_portal_type = 'File'
+    map = {'getFile' : 'setFile',
+           'getExcludeFromNav' : 'setExcludeFromNav'}
+
+class ECImageMigrator(ObjectMigrator):
+    """Base class to migrate to default Image """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'ECImage'
+    src_portal_type = 'ECImage'
+    dst_meta_type = 'ATImage'
+    dst_portal_type = 'Image'
+    map = {'getImage' : 'setImage',
+           'getExcludeFromNav' : 'setExcludeFromNav'}
+
+class GImageMigrator(ObjectMigrator):
+    """Base class to migrate to default Image """
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'GImage'
+    src_portal_type = 'GImage' 
+    dst_meta_type = 'ATImage'
+    dst_portal_type = 'Image'
+    map = {'getImage' : 'setImage',
+           'getExcludeFromNav' : 'setExcludeFromNav'}
+
+class ECLinkMigrator(ObjectMigrator):
+    """Base class to migrate to default Link"""
+
+    walkerClass = CatalogWalker
+    src_meta_type = 'ECLink'
+    src_portal_type = 'ECLink'
+    dst_meta_type = 'ATLink'
+    dst_portal_type = 'Link'
+    map = {'getRemoteUrl' : 'setRemoteUrl',
+           'getExcludeFromNav' : 'setExcludeFromNav'}
+
+def pre_migrate_2_3_1_to_3_0_4(self):
+    """Run the migration"""
+     
+    out = StringIO()
+    print >> out, "Starting migration"
+         
+    portal_url = getToolByName(self, 'portal_url')
+    portal = portal_url.getPortalObject()
+
+
+    #create migrateable_properties to migrate old site props
+    site_props = portal.portal_properties.site_properties
+    portal.portal_properties.addPropertySheet('migrateable_properties', 'Old Site Properties')
+    m_props = portal.portal_properties.migrateable_properties
+    
+    m_props.manage_addProperty(id='site_title', type='string', value=portal.title)
+    m_props.manage_addProperty(id='description', type='string', value=portal.description)
+    m_props.manage_addProperty(id='email_from_address', type='string', value=portal.email_from_address)
+    m_props.manage_addProperty(id='email_from_name', type='string', value=portal.email_from_name)
+    m_props.manage_addProperty(id='division_descriptor', type='string', value=site_props.institution_object)
+    m_props.manage_addProperty(id='course_descriptor', type='string', value=site_props.institution_sub_object)
+
+    #create ims_properties to migrate out of tool
+    portal.portal_properties.addPropertySheet('ims_properties', 'IMS Transport Properties')
+    ims_props = portal.portal_properties.ims_properties
+    IMStool = portal.portal_IMSTransportTool
+    for prop in IMStool.propertyMap():
+        if prop['id'] != 'title':
+            #make an ims_properties entry
+            id = prop['id']
+            type = prop['type']        
+            value = IMStool.getProperty(id)
+            ims_props.manage_addProperty(id=id, type=type, value=value)
+
+    #create contentlicensing_properties to capture tool props that need to migrate
+    portal.portal_properties.addPropertySheet('contentlicensing_properties', 'Content Licensing Properties')
+    cl_props = portal.portal_properties.contentlicensing_properties
+    CLtool = portal.portal_contentlicensing
+    for prop in CLtool.propertyMap():
+        if prop['id'] != 'title':
+            id = prop['id']
+            type = prop['type']
+            value = CLtool.getProperty(id)
+            if id == 'Jurisdiction':
+                type = 'string'
+            cl_props.manage_addProperty(id=id, type=type, value=value)
+
+    transaction.commit()
+
+    #create annotation for position in course, as one cannot access it properly in the migrators
+    brains = portal.portal_catalog.searchResults(portal_type=['ECFolder', 
+                                                              'ECImage',
+                                                              'ECDocument',
+                                                              'ECFile',
+                                                              'ECLink'],
+                                                 path='/')
+    for brain in brains:
+        obj = brain.getObject()
+        #Only annotate those objects set to show in Navigation
+        if obj.getExcludeFromNav() == False: 
+            if not hasattr(obj, '__annotations__') and obj.portal_type != 'ECLink':
+                annotations = IAnnotations(obj)
+                annotations['eduCommons.objPositionInCourse'] = ''            
+            if obj.portal_type in ['ECFolder', 'ECImage', 'ECDocument', 'ECFile']:
+                pos = obj.getNavPosition()            
+                obj.__annotations__['eduCommons.objPositionInCourse'] = pos + 2
+            elif obj.portal_type == 'ECLink':
+                #Links are not annotatable by default, allow each Link to be annotatable
+                directly = directlyProvidedBy(obj)
+                directlyProvides(obj, directly + IAttributeAnnotatable)
+                annotations = IAnnotations(obj)
+                pos = obj.getNavPosition()
+                annotations['eduCommons.objPositionInCourse'] = pos + 2
+
+    transaction.commit()
+
+    migrators = ( 
+                 GDocumentMigrator, ECDocumentMigrator, 
+                 GFileMigrator, ECFileMigrator,
+                 GImageMigrator, ECImageMigrator,
+                 ECLinkMigrator, ECFolderMigrator,
+                 ECDepartmentMigrator, ECCourseMigrator,
+                 GFolderMigrator,)
+
+    for migrator in migrators:
+        walker = migrator.walkerClass(portal, migrator)
+        walker.go(out=out)
+        transaction.commit()
+        print >> out, walker.getOutput()
+
+
+    #Refresh catalog indices
+    self.portal_catalog.reindexIndex(self.portal_catalog.indexes(),None)
+
+    #remove display_view from front_page
+    fp = getattr(self, 'front-page', None)
+
+    if fp:
+        fp.manage_delProperties(['layout',])
+        print >> out, "Removed layout from front-page"    
+
+
+    #remove caching policy
+    self.caching_policy_manager.removePolicy('ECImageAndECFilePolicy')
+    print >> out, "Removed Image and File Caching Policy"
+
+    #uninstall FCKEditor
+    if self.portal_quickinstaller.isProductInstalled('FCKeditor'):        
+        self.portal_quickinstaller.uninstallProducts(products=['FCKeditor'])
+        print >> out, "Uninstalled FCKEditor"
+    if not self.portal_quickinstaller.isProductInstalled('Kupu'):
+        self.portal_quickinstaller.installProducts(products=['Kupu'])
+        self.portal_properties.site_properties.available_editors = ('None', 'Kupu')
+        print >> out, "Installed Kupu"
+        
+    #Rename default objects
+    #Need to add Folder back to addable for Plone Site first....
+    pt = self.portal_types
+    plone_site = pt.getTypeInfo('Plone Site')
+    plone_site.allowed_content_types += ('Folder',)
+    
+    ap = getattr(self, 'About', None)
+    if ap:
+        ap.setId('about')
+
+    hp = getattr(self, 'Help', None)
+    if hp:
+        hp.setId('help')
+
+    fp = getattr(self, 'Feedback', None)
+    if fp:
+        fp.setId('feedback')
+
+    print >> out, "Migration finished"
+    return out.getvalue()
+
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/html2captioned.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/html2captioned.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/html2captioned.py	(revision 126)
@@ -0,0 +1,692 @@
+# Portal transform for images with captions
+#
+# We want to be able to support captions in images.
+# The easiest way to do this is to define a Portal Transform which is
+# applied to the HTML body text on output.
+#
+# The transform finds all the embedded images, and replaces them with
+# an appropriate chunk of HTML to include the caption.
+#
+from Products.PortalTransforms.interfaces import itransform
+from DocumentTemplate.DT_Util import html_quote
+from DocumentTemplate.DT_Var import newline_to_br
+from Products.CMFCore.utils import getToolByName
+import re
+from cgi import escape
+from urlparse import urlsplit, urljoin, urlunsplit
+from urllib import unquote_plus, quote_plus
+from Acquisition import aq_base
+from htmlentitydefs import name2codepoint
+from Products.kupu.plone.config import UID_PATTERN
+
+name2codepoint = name2codepoint.copy()
+name2codepoint['apos']=ord("'")
+
+__revision__ = '$Id$'
+
+# IMAGE_PATTERN matches an image tag on its own, or an image tag
+# enclosed in a simple <p> or <div>. In the latter case we strip out
+# the enclosing tag since we are going to insert our own.
+PATIMG = '\\<img[^>]+class\s*=[^=>]*captioned[^>]+\\>'
+PATA = '(?:(?P<atag0>\\<a[^>]*\\>)'+PATIMG+'\\</a\\>)' + '|' + PATIMG
+PAT0 = '(?P<pat0>'+PATA+')'
+PAT1 = '<(?:p|div)[^>]*>'+PAT0 + '</(?:p|div)>' + '|' + PAT0.replace('0>','1>')
+IMAGE_PATTERN = re.compile(PAT1, re.IGNORECASE)
+
+# Regex to match stupid IE attributes. In IE generated HTML an
+# attribute may not be enclosed by quotes if it doesn't contain
+# certain punctuation.
+ATTR_VALUE = '=(?:"?)(?P<%s>(?<=")[^"]*|[^ \/>]*)'
+ATTR_CLASS = ATTR_VALUE % 'class'
+ATTR_WIDTH = ATTR_VALUE % 'width'
+ATTR_HEIGHT = ATTR_VALUE % 'height'
+ATTR_ALT = ATTR_VALUE % 'alt'
+
+ATTR_PATTERN = re.compile('''
+    (?P<tag>\<
+     ( class%s
+     | src\s*=\s*"resolveuid/(?P<src>([^/"#? ]*))
+     | width%s
+     | alt%s
+     | height%s
+     | .
+     )*\>
+    )''' % (ATTR_CLASS, ATTR_WIDTH, ATTR_ALT, ATTR_HEIGHT), re.VERBOSE | re.IGNORECASE | re.DOTALL)
+SRC_TAIL = re.compile(r'/([^" \/>]+)')
+
+CLASS_PATTERN = re.compile('\s*class\s*=\s*("[^"]*captioned[^"]*"|[^" \/>]+)')
+ALT_PATTERN = re.compile('\\balt\s*=\s*("[^"]*"|[^" \/>]+)')
+END_TAG_PATTERN = re.compile('(<img[^>]*?)( */?>)')
+IMAGE_TEMPLATE = '''\
+<dl class="%(class)s" style="width:%(width)spx;">
+ <dt style="width:%(width)spx;">
+  %(tag)s
+ </dt>
+ <dd class="image-caption">
+  %(caption)s
+ </dd>
+</dl>
+'''
+
+class HTMLToCaptioned:
+    """Transform which adds captions to images embedded in HTML"""
+    __implements__ = itransform
+    __name__ = "html_to_captioned"
+    inputs = ('text/html',)
+    output = "text/x-html-captioned"
+    
+    def __init__(self, name=None):
+        self.config_metadata = {
+            'inputs' : ('list', 'Inputs', 'Input(s) MIME type. Change with care.'),
+            }
+        if name:
+            self.__name__ = name
+
+    def name(self):
+        return self.__name__
+
+    def __getattr__(self, attr):
+        if attr == 'inputs':
+            return self.config['inputs']
+        if attr == 'output':
+            return self.config['output']
+        raise AttributeError(attr)
+
+    def resolveuid(self, context, reference_catalog, uid):
+        """Convert a uid to an object by looking it up in the reference catalog.
+        If not found then tries to fallback to a possible hook (e.g. so you could
+        resolve uids on another system).
+        """
+        target = reference_catalog.lookupObject(uid)
+        if target is not None:
+            return target
+        hook = getattr(context, 'kupu_resolveuid_hook', None)
+        if hook:
+            target = hook(uid)
+        return target
+
+    def convert(self, data, idata, filename=None, **kwargs):
+        """convert the data, store the result in idata and return that
+        optional argument filename may give the original file name of received data
+        additional arguments given to engine's convert, convertTo or __call__ are
+        passed back to the transform
+        
+        The object on which the translation was invoked is available as context
+        (default: None)
+        """
+        context = kwargs.get('context', None)
+        template = context.kupu_captioned_image
+        if context:
+            at_tool = context.archetype_tool
+            rc = at_tool.reference_catalog
+
+        if context and at_tool:        
+            def replaceImage(match):
+                tag = match.group('pat0') or match.group('pat1')
+                attrs = ATTR_PATTERN.match(tag)
+                atag = match.group('atag0') or match.group('atag1')
+                src = attrs.group('src')
+                subtarget = None
+                m = SRC_TAIL.match(tag, attrs.end('src'))
+                if m:
+                    srctail = m.group(1)
+                else:
+                    srctail = None
+                if src:
+                    d = attrs.groupdict()
+                    target = self.resolveuid(context, rc, src)
+                    if target:
+                        d['class'] = attrs.group('class')
+                        d['originalwidth'] = attrs.group('width')
+                        d['originalalt'] = attrs.group('alt')
+                        d['url_path'] = target.absolute_url_path()
+                        #d['caption'] = newline_to_br(html_quote(target.Description()))
+                        ##get licenseinfo here
+                        license = target.restrictedTraverse('@@copyright_byline_view').getLicenseByline()
+                        licenseinfo = ''
+                        if license[2] != 'All Rights Reserved':
+                            licenseinfo += 'Image: %s, <a href="%s" title="%s" alt="%s">%s</a>.' % (license[1], license[3],license[2],license[2],license[2])
+                        else:
+                            licenseinfo += 'Image: %s, %s.' % (license[1], license[2])
+
+                        d['caption'] = licenseinfo
+
+
+                        d['image'] = d['fullimage'] = target
+                        d['tag'] = None
+                        d['isfullsize'] = True
+                        d['width'] = target.width
+                        if srctail:
+                            if isinstance(srctail, unicode):
+                                srctail =srctail.encode('utf8') # restrictedTraverse doesn't accept unicode
+                            try:
+                                subtarget = target.restrictedTraverse(srctail)
+                            except:
+                                subtarget = getattr(target, srctail, None)
+                            if subtarget:
+                                d['image'] = subtarget
+
+                            if srctail.startswith('image_'):
+                                d['tag'] = target.getField('image').tag(target, scale=srctail[6:])
+                            elif subtarget:
+                                d['tag'] = subtarget.tag()
+
+                        if d['tag'] is None:
+                            d['tag'] = target.tag()
+
+                            if d['originalwidth'] is None:
+                                #create relative url based tag
+                                url = makeUrlRelative(target.absolute_url(),context.absolute_url())[0]
+                                d['tag'] = '<img src="%s" alt="%s" height="%s" width="%s" />' % (url, d['originalalt'], target.height, target.width )
+
+
+                        if subtarget:
+                            d['isfullsize'] = subtarget.width == target.width and subtarget.height == target.height
+                            d['width'] = subtarget.width
+
+                        if atag: # Must preserve original link, don't overwrite with a link to the image
+                            d['isfullsize'] = True
+                            d['tag'] = "%s%s</a>" % (atag, d['tag'])
+
+                        return template(**d)
+                return match.group(0) # No change
+
+            if isinstance(data, unicode):
+                data = data.decode('utf8')
+            html = IMAGE_PATTERN.sub(replaceImage, data)
+
+            # Replace urls that use UIDs with human friendly urls.
+            def replaceUids(match):
+                tag = match.group('tag')
+                uid = match.group('uid')
+                target = self.resolveuid(context, rc, uid)
+                if target:
+                    try:
+                        url = target.getRemoteUrl()
+                    except AttributeError:
+                        url = target.absolute_url_path()
+                    return tag + url
+                return match.group(0)
+
+            html = UID_PATTERN.sub(replaceUids, html)
+            if isinstance(html, unicode):
+                html = html.encode('utf8') # Indexing requires a string result.
+            idata.setData(html)
+            return idata
+
+        # No context to use for replacements, so don't bother trying.
+        idata.setData(data)
+        return idata
+
+def register():
+    return HTMLToCaptioned()
+
+def initialize():
+    engine = getToolByName(portal, 'portal_transforms')
+    engine.registerTransform(register())
+
+ATTR_HREF = ATTR_VALUE % 'href'
+LINK_PATTERN = re.compile(
+    r'(?P<prefix>\<(?:img\s[^>]*src|a\s[^>]*href)\s*=\s*(?:"?))(?P<href>(?<=")[^"]*|[^ \/>]*)',
+    re.IGNORECASE)
+FRAGMENT_TYPE = 'CompositePack Fragments'
+NAVIGATION_PAGE = 'Navigation Page'
+
+SUMMARY_PATTERN = re.compile(r'(\<a[^>]*>.*?</a>)|(\<img[^>]*\>)', re.IGNORECASE|re.DOTALL)
+
+class Migration:
+    FIELDS = ('portal_type', 'typename', 'fieldname',
+        'fieldlabel', 'position', 'action', 'commit_changes',
+        'image_tails', 'paths', 'pathuids', 'uids', 'found',
+        'batch_size',
+    )
+
+    def __init__(self, tool):
+        self.tool = tool
+        self.url_tool = getToolByName(tool, 'portal_url')
+        self.portal = self.url_tool.getPortalObject()
+        self.portal_base = self.url_tool.getPortalPath()
+        self.portal_base_url = self.portal.absolute_url()
+        self.prefix_length = len(self.portal_base)+1
+        self.uid_catalog = getToolByName(tool, 'uid_catalog')
+        self.reference_tool = getToolByName(tool, 'reference_catalog')
+        self.portal_catalog = getToolByName(tool, 'portal_catalog')
+        self._continue = True
+        self._firstoutput = False
+        self.commit_changes = False
+        self._objects = []
+        self.image_tails = []
+
+    def initImageSizes(self):
+        self.image_tails = self.tool._getImageSizes()
+
+    def initFromRequest(self):
+        self.initImageSizes()
+        self.uids = None
+        self.found = 0
+        request = self.tool.REQUEST
+        rfg = request.form.get
+        fields = [f for f in rfg('fields',()) if f.get('selected',0)]
+        if fields:
+            f = fields[0]
+            self.portal_type = f.portal_type
+            self.typename = f.type.decode('utf-8')
+            self.fieldname = f.name.decode('utf-8')
+            self.fieldlabel = f.label.decode('utf-8')
+        else:
+            self.portal_type = rfg('portal_type', None)
+            self.fieldname = None
+            self.fieldlabel = None
+            self.typename = None
+
+        self.position = 0
+        self.action = rfg('button', None)
+        self.commit_changes = rfg('commit', False)
+        self.batch_size = 10
+        if self.commit_changes:
+            self.uids = rfg('uids', [])
+
+        pathuids = rfg('folderpaths', [])
+        self.paths = self.tool.convertUidsToPaths(pathuids)
+        self.pathuids = pathuids
+
+    def initCommit(self):
+        """Reset counters for a commit pass"""
+        self.restoreState()
+        request = self.tool.REQUEST
+        rfg = request.form.get
+        self.commit_changes = True
+        self._firstoutput = True
+        self.found = 0
+        self.position = 0
+        self.batch_size = 5
+        self.uids = rfg('uids')
+
+    def saveState(self):
+        SESSION = self.tool.REQUEST.SESSION
+        SESSION['kupu_migrator'] = dict([(f, getattr(self, f, None)) for f in self.FIELDS])
+
+    def restoreState(self):
+        SESSION = self.tool.REQUEST.SESSION
+        state = SESSION['kupu_migrator']
+        for f in self.FIELDS:
+            setattr(self, f, state[f])
+
+#     def clearState(self):
+#         return
+#         SESSION = self.tool.REQUEST.SESSION
+#         if SESSION.has_key('kupu_migrator'):
+#             del SESSION['kupu_migrator']
+
+    def status(self):
+        s = [ '%s=%s' % (f,getattr(self, f, 'unset')) for f in
+            self.FIELDS ]
+        return '\n'.join(s)
+
+    def mkQuery(self):
+        query = {}
+        if self.portal_type:
+            query['portal_type'] = sanitize_portal_type(self.portal_type)
+        if self.paths:
+            query['path'] = self.paths
+        query['Language'] = 'all'
+        return query
+
+    def getInfo(self, saveState=True):
+        info = {}
+        if self._continue:
+            info['nexturi'] = self.tool.absolute_url_path()+'/kupu_migration.xml?button=continue'
+            if self.commit_changes and self._objects and self.position < getattr(self, '_total', -1):
+                info['delay'] = 5 # Avoid killing everyone else with conflict errors.
+        else:
+            info['nexturi'] = None
+
+        info['firstoutput'] = self._firstoutput
+
+        if hasattr(self, '_total'):
+            info['total'] = self._total
+            info['position'] = self.position
+            if self._total==0:
+                info['percent'] = '100%'
+            else:
+                info['percent'] = '%d%%' % ((100.*self.position)/self._total)
+
+        info['objects'] = self._objects
+        info['action'] = action = self.action
+        info['action_check'] = action=='check'
+        info['action_touid'] = action=='touid'
+        info['action_topath'] = action=='topath'
+        info['typename'] = self.typename
+        info['fieldlabel'] = self.fieldlabel
+        info['checkboxes'] = action != 'check' and not self.commit_changes
+        info['commit_changes'] = self.commit_changes
+        info['dryrun'] = not (self.action == 'check' or self.commit_changes)
+        info['found'] = self.found
+
+        if saveState:
+            self.saveState()
+        return info
+
+    def docontinue(self):
+        """Scan selected documents looking for convertible links"""
+        uids = self.uids
+        if uids is None:
+            self.uids = uids = []
+            brains = self.portal_catalog.searchResults(self.mkQuery())
+            for b in brains:
+                uid = self.UIDfromBrain(b)
+                if uid:
+                    uids.append(uid)
+            self._firstoutput = True
+            self._continue = True
+            return True
+
+        pos = self.position
+        self._total = total = len(uids)
+
+        uids = uids[pos:pos+self.batch_size]
+        self.position = pos + len(uids)
+        if not uids:
+            self._continue = False
+            return False # Done
+
+        self._objects = res = []
+        for uid in uids:
+            obj = self.reference_tool.lookupObject(uid)
+            if self.portal_type==FRAGMENT_TYPE and obj.portal_type!=FRAGMENT_TYPE:
+                try:
+                    fldr = obj.cp_container.titles
+                except:
+                    continue
+                else:
+                    for o in fldr.objectValues([FRAGMENT_TYPE]):
+                        objinfo = self.object_check(o)
+                        if objinfo:
+                            res.append(objinfo)
+            else:
+                objinfo = self.object_check(obj)
+                if objinfo:
+                    res.append(objinfo)
+
+        self._continue = True
+        return True
+
+    def brain_check(self, brain):
+        object = brain.getObject()
+        return self.object_check(object)
+
+    def link_summary(self, data, start, link):
+        """Summary information for a link"""
+        m = SUMMARY_PATTERN.match(data, start)
+        if m:
+            text = m.group(0)
+        else:
+            text = data[start:start+200]
+        bits = text.split(link, 1)
+        if len(bits)==1:
+            bits.append('')
+        return bits
+
+    def object_check(self, object):
+        """Check the relative links within this object."""
+        def checklink(match):
+            matched = match.group(0)
+            newlink = link = decodeEntities(match.group('href'))
+            classification, uid, relpath, tail = self.classifyLink(link, base)
+
+            if self.action=='check':
+                if classification=='bad':
+                    abslink = urljoin(base, link)
+                    before, after = self.link_summary(data, match.start(), link)
+                    summary = {'text':link, 'url':abslink,
+                        'before': before,
+                        'after': after, }
+                    info.append(summary)
+            elif self.action=='touid':
+                if classification=='internal':
+                    if uid and uid==objuid:
+                        newlink = tail
+                    elif uid:
+                        newlink = 'resolveuid/%s%s' % (uid, tail)
+                    else:
+                        newlink = relpath+tail
+
+            elif self.action=='topath':
+                if classification=='internal':
+                    newlink = relpath+tail
+
+            if newlink != link:
+                prefix = match.group('prefix')
+                newlink = html_quote(newlink).encode('ascii', 'xmlcharrefreplace')
+                changes.append((match.start()+len(prefix), match.end(), newlink))
+                return prefix + newlink
+            return matched
+
+        info = []
+        changes = []
+        try:
+            objuid = aq_base(object).UID
+        except:
+            return None  # only archetypes objects
+
+        baseobj = object
+        if object.portal_type==FRAGMENT_TYPE:
+            baseobj = object.aq_parent.aq_parent.aq_parent
+        base = baseobj.absolute_url()
+        if getattr(baseobj.aq_explicit, 'isPrincipiaFolderish', 0):
+            base += '/'
+
+        field = object.getField(self.fieldname)
+        if field is None:
+            return None
+
+        content_type = field.getContentType(object)
+        if content_type != 'text/html':
+            # Don't attempt to modify non-html
+            return None
+            
+        data = field.getEditAccessor(object)().decode('utf8')
+        __traceback_info__ = (object, data)
+        newdata = LINK_PATTERN.sub(checklink, data)
+        if data != newdata and self.commit_changes:
+            mutator = field.getMutator(object)
+            if mutator:
+                mutator(newdata.encode('utf8'), mimetype='text/html')
+                object.reindexObject() # Need to flag update
+
+        if info or changes:
+            self.found += 1
+            title = object.Title()
+            if not title:
+                title = object.getId()
+            if not title:
+                title = '<object>'
+            if object.portal_type == FRAGMENT_TYPE:
+                title = "%s (%s)" % (baseobj.title_or_id(), title)
+            if data != newdata:
+                diffs = htmlchanges(data, changes)
+            else:
+                diffs = None
+            return dict(title=title, uid = objuid, info=info, url=baseobj.absolute_url_path(),
+                diffs=diffs)
+        return None
+
+    def UIDfromBrain(self, brain):
+        """Convert a brain to a UID without hitting the object"""
+        path = brain.getPath()
+        if not path.startswith(self.portal_base):
+            return None
+        try:
+            metadata = self.uid_catalog.getMetadataForUID(path[self.prefix_length:])
+        except KeyError:
+            return None
+        return metadata.get('UID', None)
+
+    def UIDfromURL(self, url):
+        """Convert an absolute URL to a UID"""
+        if not url.startswith(self.portal_base_url):
+            return None
+        path = url[len(self.portal_base_url)+1:]
+        if not path:
+            return None
+        try:
+            metadata = self.uid_catalog.getMetadataForUID(path)
+        except KeyError:
+            return None
+        return metadata.get('UID', None)
+
+    def brainfromurl(self, url):
+        """convert a url to a catalog brain"""
+        if not url.startswith(self.portal_base_url):
+            return None
+        url = unquote_plus(url)
+        url = self.portal_base + url[len(self.portal_base_url):]
+        if isinstance(url, unicode):
+            url = url.encode('utf8') # ExtendedPathIndex can't cope with unicode paths
+        brains = self.portal_catalog.searchResults(path=url, Language='all')
+        if len(brains) != 1:
+            # Happens on Plone 2.0 :(
+            for b in brains:
+                if b.getPath()==url:
+                    return b
+            return None
+        return brains[0]
+
+    def resolveToPath(self, absurl):
+        if 'resolveuid/' in absurl:
+            bits = absurl.split('resolveuid/', 1)
+            bits = bits[1].split('/',1)
+            uid = bits[0]
+            if len(bits)==1:
+                tail = ''
+            else:
+                tail = '/' + bits[1]
+
+            # TODO: should be able to convert uid to brain without
+            # touching the actual object.
+            obj = self.reference_tool.lookupObject(uid)
+            if obj is not None:
+                newurl = obj.absolute_url()
+                return uid, newurl, tail
+        return None, None, None
+
+    def classifyLink(self, url, base, first=True):
+        """Classify a link as:
+        internal, external, bad
+
+        Returns a tuple:
+        (classification, uid, relpath, tail)
+        giving potential urls: resolveuid/<uid><tail>
+        or: <relpath><table>
+        """
+        if url.startswith('portal_factory'):
+            url = url[14:]
+
+        absurl = urljoin(base, url)
+        if not absurl.startswith(self.portal_base_url):
+            return 'external', None, url, ''
+
+        scheme, netloc, path, query, fragment = urlsplit(absurl)
+        path = path.strip('/')
+        tail = urlunsplit(('','','',query,fragment))
+        absurl = urlunsplit((scheme,netloc,path,'',''))
+
+        if 'resolveuid/' in absurl:
+            UID, newurl, ntail = self.resolveToPath(absurl)
+            if UID is None:
+                return 'bad', None, url, ''
+            absurl = newurl
+            tail = ntail + tail
+        else:
+            UID = self.UIDfromURL(absurl)
+
+        brain = self.brainfromurl(absurl)
+        if not brain:
+            if first:
+                # Allow image size modifiers on the end of urls.
+                p = absurl.split('/')
+                absurl = '/'.join(p[:-1])
+                if '/'+p[-1] in self.image_tails:
+                    tail = '/'+p[-1]+tail
+                    c, uid, url, _ = self.classifyLink(absurl, base, first=False)
+                    return c, uid, url, tail
+            return 'bad', None, url, ''
+
+        relative, _ = makeUrlRelative(absurl, base)
+        # Don't convert page-internal links to uids.
+        # Also fix up spurious portal_factory references
+        if not relative:
+            return 'internal', None, '', tail
+        return 'internal', UID, relative, tail
+
+def makeUrlRelative(url, base):
+    """Make a link relative to base.
+    This method assumes we have already checked that url and base have a common prefix.
+    """
+    sheme, netloc, path, query, fragment = urlsplit(url)
+    _, _, basepath, _, _ = urlsplit(base)
+
+    baseparts = basepath.split('/')
+    pathparts = path.split('/')
+
+    basetail = baseparts.pop(-1)
+
+    # Remove common elements
+    while pathparts and baseparts and baseparts[0]==pathparts[0]:
+        baseparts.pop(0)
+        pathparts.pop(0)
+
+    for i in range(len(baseparts)):
+        pathparts.insert(0, '..')
+
+    if not pathparts:
+        pathparts.insert(0, '.')
+    elif pathparts==[basetail]:
+        pathparts.pop(0)
+    
+
+    return '/'.join(pathparts), urlunsplit(('','','',query,fragment))
+
+def htmlchanges(data, changes):
+    out = []
+    prev = 0
+    lastend = 0
+    for s,e,new in changes:
+        start = max(prev, s-10)
+        if start != prev:
+            if start-10 > prev:
+                out.append(html_quote(data[prev:prev+10]))
+                out.append('...')
+            else:
+                out.append(html_quote(data[prev:start]))
+        out.append(html_quote(data[start:s]))
+        out.append('<del>%s</del>' % html_quote(data[s:e]))
+        out.append('<ins>%s</ins>' % html_quote(new))
+        prev = e
+    if prev:
+        out.append(html_quote(data[prev:prev+10]))
+        if prev+10 < len(data):
+            out.append('...')
+    return ''.join(out)
+
+def sanitize_portal_type(pt):
+    """Performs portal type mapping prior to database query.
+    Needed for CompositePack pages"""
+    if pt==FRAGMENT_TYPE:
+        return NAVIGATION_PAGE
+    return pt
+
+EntityPattern = re.compile('&(?:#(\d+)|(?:#x([\da-fA-F]+))|([a-zA-Z]+));')
+def decodeEntities(s, encoding='utf-8'):
+    def unescape(match):
+        code = match.group(1)
+        if code:
+            return unichr(int(code, 10))
+        else:
+            code = match.group(2)
+            if code:
+                return unichr(int(code, 16))
+            else:
+                return unichr(name2codepoint[match.group(3)])
+
+    return EntityPattern.sub(unescape, s)
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/plone.app.controlpanel.security.py.patch
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/plone.app.controlpanel.security.py.patch	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/extras/plone.app.controlpanel.security.py.patch	(revision 126)
@@ -0,0 +1,9 @@
+68,69c68,72
+<             else:
+<                 return False
+---
+>             #This is bad...doesn't allow for roles that alpha order before Anonymous
+>             #else:
+>             #    return False
+>         #Fix for above
+>         return False
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/fields.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/fields.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/fields.py	(revision 126)
@@ -0,0 +1,94 @@
+##################################################################################
+#
+#    Copyright (C) 2006 Utah State University, All rights reserved.
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+##################################################################################
+
+__author__  = '''Brent Lambert, David Ray, Jon Thomas'''
+__docformat__ = 'plaintext'
+__version__   = '$ Revision 0.0 $'[11:-2]
+
+from zope.interface import implements
+from zope.component import adapts
+from enpraxis.educommons.interfaces import IClearCopyrightable, IClearCopyright, \
+    IAccessibilityCompliant, IAccessibilityCompliantable
+from zope.annotation.interfaces import IAnnotations
+from persistent.mapping import  PersistentMapping
+
+CCKEY = 'eduCommons.clearcopyright'
+ACCESSIBLEKEY = 'eduCommons.accessible'
+
+class ClearCopyright(object):
+    """
+        This class adds a clear copyright fields to content
+    """
+    adapts(IClearCopyrightable)
+    implements(IClearCopyright)
+
+    def __init__(self, context):
+        self.context = context
+        self.annotations = IAnnotations(context)
+
+        mapping = self.annotations.get(CCKEY)
+        mapping = self.annotations.get(CCKEY)
+        if mapping is None:
+            clearcopyright = False
+            mapping = self.annotations[CCKEY] = clearcopyright = PersistentMapping()
+            self.mapping = mapping
+        else:
+            self.mapping = mapping
+
+    def getClearedCopyright(self):
+        """ Get the contents of the clear copyright field. """
+        return self.annotations[CCKEY]
+
+    def setClearedCopyright(self, ccdata):
+        """ Set the clear copyright field. """
+        self.annotations[CCKEY] = ccdata
+
+    clearedcopyright = property(fget=getClearedCopyright, fset=setClearedCopyright)
+
+class AccessibilityCompliant(object):
+    """
+        This class adds an Accessibility Compliance field to content
+    """
+    adapts(IAccessibilityCompliantable)
+    implements(IAccessibilityCompliant)
+
+    def __init__(self, context):
+        self.context = context
+        self.annotations = IAnnotations(context)
+
+        mapping = self.annotations.get(ACCESSIBLEKEY)
+        mapping = self.annotations.get(ACCESSIBLEKEY)
+        if mapping is None:
+            accessible = False
+            mapping = self.annotations[ACCESSIBLEKEY] = accessible = PersistentMapping()
+            self.mapping = mapping
+        else:
+            self.mapping = mapping
+
+    def getAccessibilityCompliant(self):
+        """ Get the contents of the accessibility field. """
+        return self.annotations[ACCESSIBLEKEY]
+
+    def setAccessibilityCompliant(self, accessibledata):
+        """ Set the accessible field. """
+        self.annotations[ACCESIBLEKEY] = accessibledata
+
+    accessibilitycompliant = property(fget=getAccessibilityCompliant, fset=setAccessibilityCompliant)
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/README.txt
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/README.txt	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/README.txt	(revision 126)
@@ -0,0 +1,5 @@
+eduCommons Internationalization
+
+Since eduCommons is customized from Plone, it has built-in support for internationalization. As of June 2006 Plone is available in 56 different translations. eduCommons requires some additional translation work, but follows the same process as Plone. Adding an eduCommons translation is usually less time consuming because much of the tranlation work has already been done in Plone. Documentation for translating eduCommons is available here: http://cosl.usu.edu/projects/educommons/documentation/how-to/localizing-educommons
+
+If you have questions or are interested in contributing a translation to eduCommons please contact us at educommons@cosl.usu.edu. Thanks! 
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-ca.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-ca.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-ca.po	(revision 126)
@@ -0,0 +1,244 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: ca\n"
+"Language-Name: Catalan\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr ""
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr ""
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr ""
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr ""
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr ""
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr ""
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr ""
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr ""
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr ""
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr ""
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr ""
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr ""
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr ""
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr ""
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr ""
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr ""
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr ""
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-de.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-de.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-de.po	(revision 126)
@@ -0,0 +1,245 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons 1.5.0\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME < EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: de\n"
+"Language-Name: Deutsch\n"
+"Preferred-Encodings: latin1 utf-8\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "Addieren Sie nur eine Anmerkung"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "Kurs"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr ""
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr ""
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr ""
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "Ver&ouml;ffentlichen Sie Inhalt"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "Erschienener Inhalt"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr ""
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "Qualit&auml;tssicherung"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "Geben Sie Inhalt f&uuml;r Publikation frei"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "Freigegeben"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "Gegenprobe Inhalt"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "&Uuml;berarbeitung Inhalt"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "&Uuml;berarbeitung Erschienene Inhalt"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "&Uuml;berarbeitung Freigegebene Inhalt"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "Reichen Sie Inhalt f&uuml; QA ein"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "Arbeit in Bewegung"
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-en.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-en.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-en.po	(revision 126)
@@ -0,0 +1,248 @@
+# Gettext Message File for Plone
+# Alexander Limi <limi@plone.org>, 2002-2004
+# Dorneles TremÃ©a <dorneles@x3ng.com.br>, 2003-2004
+msgid ""
+msgstr ""
+"Project-Id-Version: Plone\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: 2004-11-10 05:10+0000\n"
+"Last-Translator: Dorneles TremÃ©a <dorneles@x3ng.com.br>\n"
+"Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+"Language-Code: en\n"
+"Language-Name: English\n"
+"Preferred-Encodings: latin1 utf-8\n"
+"Domain: plone\n"
+"X-Is-Fallback-For: en-au en-bz en-ca en-ie en-jm en-nz en-ph en-za en-tt en-gb en-us en-zw\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr ""
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr ""
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr ""
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr ""
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr ""
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr ""
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr ""
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr ""
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr ""
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr ""
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr ""
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr ""
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr ""
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr ""
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr ""
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr ""
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr ""
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-es.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-es.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-es.po	(revision 126)
@@ -0,0 +1,247 @@
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons 2.3.0\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: Arturo Formariz Pombo <arturo.formariz@upm.es>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: es\n"
+"Language-Name: EspaÃ±ol\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "AÃadir un comentario"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "Curso"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr ""
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr ""
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "EnProgreso"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "Publicar contenido"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "Contenido publicado"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr ""
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "Control de calidad"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "Preparar contenido para publicaciÃn"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "Preparado"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "Revisar contenido"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "Revisar contenido"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "Revisar contenido publicado"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "Revisar contenido definitivo"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "Enviar contenido a QA (control de calidad)"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "En progreso"
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-fr.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-fr.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-fr.po	(revision 126)
@@ -0,0 +1,248 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: 2007-03-07 16:50+0100\n"
+"Last-Translator: olivier Turlier <o.turlier@gmail.com>\n"
+"Language-Team: French <o.turlier@gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: fr\n"
+"Language-Name: French\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: FRANCE\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "Ajouter un commentaire seulement"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "Cours"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr "Contenu de cours"
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr ""
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "En progrÃšs"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "Publier le contenu"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "Contenu publiÃ©"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr "AQ"
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "Assurance qualitÃ©"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "DÃ©livrer le contenu pour publication"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "DÃ©livrÃ©"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "Retestez le contenu"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "Retravailler le contenu"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "Retravailler le contenu publiÃ©"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "Retravailler le contenu dÃ©livrÃ©"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "Soumettre le contenu Ã  l'AQ"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "Travail en progrÃšs"
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-ja.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-ja.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-ja.po	(revision 126)
@@ -0,0 +1,249 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: 2007-05-10 03:20+0900\n"
+"Last-Translator: Haruo Takemura <takemura@acm.org>\n"
+"Language-Team: OSAKA-U <takemura@cmc.osaka-u.ac.jp>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: ja\n"
+"Language-Name: Japanese\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "ã³ã¡ã³ãã®ã¿è¿œå "
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "ã³ãŒã¹"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr "è¬çŸ©ã³ã³ãã³ã"
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr "ãã£ãŒãããã¯"
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "äœæ¥­äž­"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "ã³ã³ãã³ããå
+¬é"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "å
+¬éãããã³ã³ãã³ã"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr "QA"
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "åè³ªä¿èšŒ"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "å
+¬éã®ããã«ã³ã³ãã³ãããªãªãŒã¹"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "ãªãªãŒã¹æžã¿"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "ã³ã³ãã³ãã®åãã¹ã"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "ã³ã³ãã³ãã®åäœæ¥­"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "å
+¬éãããã³ã³ãã³ãã®åäœæ¥­"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "ãªãªãŒã¹ãããã³ã³ãã³ãã®åäœæ¥­"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "ã³ã³ãã³ããQAã«æåº"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "äœæ¥­äž­"
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-nl.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-nl.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-nl.po	(revision 126)
@@ -0,0 +1,249 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: 2007-04-06 18:38+0100\n"
+"Last-Translator: Robert Schuwer <robert.schuwer@ou.nl>\n"
+"Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: nl\n"
+"Language-Name: Nederlands\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+"X-Poedit-Language: Dutch\n"
+"X-Poedit-Country: NETHERLANDS\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Bookmarks: 31,-1,-1,-1,-1,-1,-1,-1,-1,-1\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "Voeg alleen een opmerking toe"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "Cursus"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr "Cursusinhoud"
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr "Terugkoppeling"
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "In uitvoering"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "Publiceer inhoud"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "Gepubliceerde inhoud"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr "Kwaliteitscontrole"
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "Kwaliteitsbewaking"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "Geef inhoud vrij voor publicatie"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "Vrijgegeven"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "Hertest inhoud"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "Bewerk content"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "Bewerk gepubliceerde inhoud"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "Bewerk vrijgegeven inhoud"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "Dien inhoud bij Kwaliteitsbewaking in"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "Werk in uitvoering"
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-tr.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-tr.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-tr.po	(revision 126)
@@ -0,0 +1,245 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons 2.0\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: tr\n"
+"Language-Name: Turkish\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr "Basit iÅ akÄ±ÅÄ± basit web siteleri iÃ§in kullanÄ±ÅlÄ±dÄ±r.- Åeylere Ã¶zel taslak olarak baÅlanabilir ve doÄrudan yayÄ±nlanabilir. - Ä°Ã§eriÄinin yaratÄ±cÄ±sÄ± iÃ§erik yayÄ±nlandÄ±ktan sonra bile iÃ§eriÄi dÃŒzenleyebilir."
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr "Basit iÅ akÄ±ÅÄ± basit web siteleri iÃ§in kullanÄ±ÅlÄ±dÄ±r.- Åeylere Ã¶zel taslak olarak baÅlanabilir ve doÄrudan yayÄ±nlanabilir. - TÃŒm kullanÄ±Ä±clar iÃ§erik yayÄ±nlandÄ±ÄÄ±nda iÃ§eriÄi dÃŒzenleyebilir."
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr "Dosya sisteminde bir dosya saklandÄ±."
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr "Form yoluyla geri bildirimleri almak iÃ§in bir klasÃ¶r dizayn edildi."
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "Yorum Ekleyin"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr "Otomatik gÃŒncelleÅtirilmiÅ arama kurs listesinin gÃ¶rÃŒntÃŒlenmesinde kullanÄ±labilir."
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "Kurs"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr "Kurs Ä°Ã§erikleri"
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr "Kurs Listesi"
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr "BÃ¶lÃŒm"
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr "Geribildirim"
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "Ä°Åleniyor"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr "BÃŒyÃŒk Dosya"
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr "Ä°Ã§eriÄi sahibi yayÄ±nlar"
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr "Ã¶zel taslak"
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "YayÄ±n Ä°Ã§eriÄi"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "YayÄ±nlanmÄ±Å Ä°Ã§erik"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr "QA"
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "Kalite TeminatÄ±"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "YayÄ±nlanmasÄ± iÃ§in iÃ§eriÄi OnaylayÄ±n"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "OnaylandÄ±"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "Ä°Ã§eriÄi Tekrar Test Et"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "Ä°Ã§eriÄi Yeniden ÃalÄ±Å"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "YayÄ±nlanmÄ±Å Ä°Ã§eriÄi Yeniden ÃalÄ±Å"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "OnaylanmÄ±Å Ä°Ã§eriÄi Yeniden ÃalÄ±Å"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "Ä°Ã§eriÄi QA'ya GÃ¶nder"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "Ä°Ålem YapÄ±lÄ±yo"
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr "eduCommons"
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr "eduCommons OpenOCW Ä°ÅakÄ±ÅÄ±"
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-cn.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-cn.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-cn.po	(revision 126)
@@ -0,0 +1,255 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: 2008-03-31 19:14-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\n"
+"Language-Team: PKUGSE <yzhuang@gse.pku.edu.cn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: zh-cn\n"
+"Language-Name: Simplified Chinese\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "ä»
+æ·»å è¯æ³š"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "è¯Ÿçš"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr "è¯Ÿçšå
+å®¹"
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr "åéŠ"
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "åå»º"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "ååžå
+å®¹"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "å·²ååžå
+å®¹"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr "åžžè§é®é¢"
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "èŽšéä¿è¯"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "æ¹åå
+å®¹"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "å·²æ¹å"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "éæ°æµè¯å
+å®¹"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "ä¿®è®¢å
+å®¹"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "ä¿®è®¢å·²ååžçå
+å®¹"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "ä¿®è®¢æ­£åŒååžçå
+å®¹"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "æäº€å
+å®¹è¿è¡æ£æ¥"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "åå»ºäž­...."
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-hk.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-hk.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-hk.po	(revision 126)
@@ -0,0 +1,255 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: 2008-03-31 19:38-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\n"
+"Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: zh-hk\n"
+"Language-Name: Chinese (Hongkong)\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "å
+æ·»å è©æ³š"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "èª²çš"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr "èª²çšå
+§å®¹"
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr "åé¥"
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "åµå»º"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "çŒäœå
+§å®¹"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "å·²çŒäœå
+§å®¹"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr "åžžèŠåé¡"
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "è³ªéä¿è­"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "æ¹åå
+§å®¹"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "å·²æ¹å"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "éæ°æž¬è©Šå
+§å®¹"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "ä¿®èšå
+§å®¹"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "ä¿®èšå·²çŒäœçå
+§å®¹"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "ä¿®èšæ­£åŒçŒäœçå
+§å®¹"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "æäº€å
+§å®¹é²è¡æª¢æ¥"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "åµå»ºäž­...."
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-tw.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-tw.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone-zh-tw.po	(revision 126)
@@ -0,0 +1,255 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons 3.0.0\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: 2008-03-31 19:29-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\n"
+"Language-Team: Plone i18n <plone-i18n@lists.sourceforge.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: zh-tw\n"
+"Language-Name: Traditional Chinese\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+## Translations for worflow state
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr "å
+æ·»å è©æ³š"
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr "èª²çš"
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr "èª²çšå
+§å®¹"
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr "åé¥"
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr "åµå»º"
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr "çŒäœå
+§å®¹"
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr "å·²çŒäœå
+§å®¹"
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr "åžžèŠåé¡"
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr "è³ªéä¿è­"
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr "æ¹åå
+§å®¹"
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr "å·²æ¹å"
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr "éæ°æž¬è©Šå
+§å®¹"
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr "ä¿®èšå
+§å®¹"
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr "ä¿®èšå·²çŒäœçå
+§å®¹"
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr "ä¿®èšæ­£åŒçŒäœçå
+§å®¹"
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr "æäº€å
+§å®¹é²è¡æª¢æ¥"
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr "åµå»ºäž­...."
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone.pot
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone.pot	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/i18n/plone.pot	(revision 126)
@@ -0,0 +1,247 @@
+# --- PLEASE EDIT THE LINES BELOW CORRECTLY ---
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: en\n"
+"Language-Name: English\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be  published directly. - The creator of a content item can edit the item even after it is published."
+msgstr ""
+
+#. Default: "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+msgid "- Simple workflow that is useful for basic web sites. - Things start out as a private draft, and can be published directly. - All users can edit the content when Published."
+msgstr ""
+
+#. Default: "A file stored on the File System."
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "A file stored on the File System."
+msgstr ""
+
+#. Default: "A folder designed to capture feedback via a form."
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "A folder designed to capture feedback via a form."
+msgstr ""
+
+#. Default: "Add a Comment Only"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a Comment Only"
+msgstr ""
+
+#. Default: "Add a comment"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Add a comment"
+msgstr ""
+
+#. Default: "An automatically updated stored search that can be used to display a course listing"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "An automatically updated stored search that can be used to display a course listing"
+msgstr ""
+
+#. Default: "Content Workflow [eduCommons]"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content Workflow [eduCommons]"
+msgstr ""
+
+#. Default: "Content currently in QA waiting to be approved."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content currently in QA waiting to be approved."
+msgstr ""
+
+#. Default: "Content in production waiting to be submitted to QA."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content in production waiting to be submitted to QA."
+msgstr ""
+
+#. Default: "Content that has been released and is waiting to be published."
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Content that has been released and is waiting to be published."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/types/Course.xml
+#: ./profiles/openocw/types/Course.xml
+msgid "Course"
+msgstr ""
+
+#. Default: "Course Contents"
+#: ./profiles/default/propertiestool.xml
+#: ./profiles/openocw/propertiestool.xml
+msgid "Course Contents"
+msgstr ""
+
+#. Default: "Course List"
+#: ./profiles/default/types/CoursesTopic.xml
+#: ./profiles/openocw/types/CoursesTopic.xml
+msgid "Course List"
+msgstr ""
+
+#. Default: "Division"
+#: ./profiles/default/types/Division.xml
+#: ./profiles/openocw/types/Division.xml
+msgid "Division"
+msgstr ""
+
+#. Default: "Feedback"
+#: ./profiles/default/types/Feedback.xml
+#: ./profiles/openocw/types/Feedback.xml
+msgid "Feedback"
+msgstr ""
+
+#. Default: "InProgress"
+#: ./profiles/default/propertiestool.xml
+msgid "InProgress"
+msgstr ""
+
+#. Default: "Large File"
+#: ./profiles/default/types/FSSFile.xml
+#: ./profiles/openocw/types/FSSFile.xml
+msgid "Large File"
+msgstr ""
+
+#. Default: "Manager rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Manager rejects submission"
+msgstr ""
+
+#. Default: "Object state is stale"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Object state is stale"
+msgstr ""
+
+#. Default: "Owner publishes content"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Owner publishes content"
+msgstr ""
+
+#. Default: "Private Draft"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "Private Draft"
+msgstr ""
+
+#. Default: "Publish Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publish Content"
+msgstr ""
+
+#. Default: "Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Published Content"
+msgstr ""
+
+#. Default: "Publisher rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher rejects submission"
+msgstr ""
+
+#. Default: "Publisher requests retest"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Publisher requests retest"
+msgstr ""
+
+#. Default: "QA"
+#: ./profiles/default/propertiestool.xml
+msgid "QA"
+msgstr ""
+
+#. Default: "Quality Assurance"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Quality Assurance"
+msgstr ""
+
+#. Default: "Release Content for Publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release Content for Publication"
+msgstr ""
+
+#. Default: "Release content for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Release content for publication"
+msgstr ""
+
+#. Default: "Released"
+#: ./profiles/default/propertiestool.xml
+msgid "Released"
+msgstr ""
+
+#. Default: "Released for publication"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Released for publication"
+msgstr ""
+
+#. Default: "Reset to In Progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reset to In Progress"
+msgstr ""
+
+#. Default: "Retest Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Retest Content"
+msgstr ""
+
+#. Default: "Reviewer rejects submission"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Reviewer rejects submission"
+msgstr ""
+
+#. Default: "Rework Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Content"
+msgstr ""
+
+#. Default: "Rework Published Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Published Content"
+msgstr ""
+
+#. Default: "Rework Released Content"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Rework Released Content"
+msgstr ""
+
+#. Default: "Submit Content to QA"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit Content to QA"
+msgstr ""
+
+#. Default: "Submit for review"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Submit for review"
+msgstr ""
+
+#. Default: "Work in progress"
+#: ./profiles/default/workflows/content_workflow/definition.xml
+msgid "Work in progress"
+msgstr ""
+
+#. Default: "eduCommons"
+#: ./profiles/default/controlpanel.xml
+#: ./profiles/openocw/controlpanel.xml
+msgid "eduCommons"
+msgstr ""
+
+#. Default: "eduCommons OpenOCW Workflow"
+#: ./profiles/openocw/workflows/open_workflow/definition.xml
+#: ./profiles/openocw/workflows/two_step_workflow/definition.xml
+msgid "eduCommons OpenOCW Workflow"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/interfaces.py
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/interfaces.py	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/interfaces.py	(revision 126)
@@ -0,0 +1,58 @@
+from zope.interface import Interface
+from zope.viewlet.interfaces import IViewletManager
+from zope.annotation.interfaces import IAnnotatable
+from zope.app.event.interfaces import IObjectEvent
+
+class IPortalObject(Interface):
+    """  Marker interface for the Portal Object """
+
+class ICoursesTopic(Interface):
+    """ Marker interface for Courses Topic, which implements the course list. """
+
+class IDivision(Interface):
+    """ Marker interface for Division object type. """
+
+class ICourse(Interface):
+    """ Marker interface for Course object type. """
+
+class IFSSFile(Interface):
+    """ Marker interface for FSSFile object type. """
+
+class IFeedback(Interface):
+    """ Marker interface for Feedback object type.  """
+
+class IClearCopyrightable(IAnnotatable):
+    """ Marker interface  """
+
+class IAccessibilityCompliantable(IAnnotatable):
+    """ Marker interface  """
+
+class ICourseOrderable(IAnnotatable):
+    """ Marker interface """
+
+class IClearCopyright(Interface):
+    """ Cleared Copyright interface  """
+
+    def getClearedCopyright():
+        """ Get the Cleared Copyright value  """
+
+    def setClearedCopyright():
+        """ Set the Cleared Copyright value  """
+
+class IAccessibilityCompliant(Interface):
+    """ Accessibility Compliant interface  """
+
+    def getAccessibilityCompliant():
+        """ Get the accessibility Compliant value  """
+
+    def setAccessibilityCompliant():
+        """ Set the accessibility Compliant value  """
+
+class IOpenOCWSite(Interface):
+    """ Marker interface to mark eduCommons site as an OpenOCW site. """
+
+class ICourseUpdateEvent(IObjectEvent):
+    """ Fire a Course Update Event """
+
+class IDeleteCourseObjectEvent(IObjectEvent):
+    """ Fire an event when an object is deleted """
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/ca/LC_MESSAGES/eduCommons.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/ca/LC_MESSAGES/eduCommons.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/ca/LC_MESSAGES/eduCommons.po	(revision 126)
@@ -0,0 +1,853 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: ca\n"
+"Language-Name: Catalan\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: eduCommons\n"
+
+#: ./portlet/coursebuilderform.py:106
+msgid "(Choose one)"
+msgstr ""
+
+#: ./browser/controlpanel.py:43
+msgid "A descriptor that describes courses in your institution."
+msgstr ""
+
+#: ./browser/controlpanel.py:37
+msgid "A descriptor that describes how your academic institution is divided. Typically this will be 'Departments' or 'Divisions.'"
+msgstr ""
+
+#: ./browser/adaview.py:19
+msgid "ADA Compliant set to False"
+msgstr ""
+
+#: ./browser/adaview.py:16
+msgid "ADA Compliant set to True"
+msgstr ""
+
+#. Default: "About Page"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Page"
+msgstr ""
+
+#. Default: "About Professor"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Professor"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "About the Professor"
+msgstr ""
+
+#: ./browser/accessibilityview.py:20
+msgid "Accessibility Compliant set to False"
+msgstr ""
+
+#: ./browser/accessibilityview.py:17
+msgid "Accessibility Compliant set to True"
+msgstr ""
+
+#. Default: "Accessibility Status"
+#: ./skins/eduCommons/change_accessibility.cpt:79
+msgid "Accessibility Status"
+msgstr ""
+
+#. Default: "Accessibility process"
+#: ./skins/eduCommons/change_accessibility.cpt:26
+msgid "Accessibility process"
+msgstr ""
+
+#. Default: "Accessible"
+#: ./browser/accessibility_compliant.pt:14
+msgid "Accessible"
+msgstr ""
+
+#: ./browser/menu.py:245
+msgid "Advanced..."
+msgstr ""
+
+#: ./browser/controlpanel.py:52
+msgid "Allow Reuse Course Export"
+msgstr ""
+
+#. Default: "Apply Template"
+#: ./browser/menu.py:41
+msgid "Apply Template"
+msgstr ""
+
+#. Default: "Available Feeds"
+#: ./browser/rss_questions.pt:40
+msgid "Available Feeds"
+msgstr ""
+
+#: ./content/course.py:38
+msgid "Body Text"
+msgstr ""
+
+#. Default: "Build a Course"
+#: ./portlet/coursebuilder.pt:10
+msgid "Build a Course"
+msgstr ""
+
+#. Default: "Building a Course"
+#: ./skins/openocw/login_success.pt:91
+msgid "Building a Course"
+msgstr ""
+
+#. Default: "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+#: ./browser/rss_questions.pt:80
+msgid "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+msgstr ""
+
+#. Default: "Captcha"
+#: ./skins/eduCommons/join_form.cpt:231
+msgid "Captcha"
+msgstr ""
+
+#. Default: "Change Copyright"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Change Copyright"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:153
+msgid "Choose from the following templates:"
+msgstr ""
+
+#. Default: "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+#: ./skins/eduCommons/change_copyright.cpt:75
+msgid "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+msgstr ""
+
+#. Default: "Choose to set the accessibility flag, or revoke accessibility."
+#: ./skins/eduCommons/change_accessibility.cpt:80
+msgid "Choose to set the accessibility flag, or revoke accessibility."
+msgstr ""
+
+#. Default: "Clear Copyright"
+#: ./skins/eduCommons/change_copyright.cpt:88
+msgid "Clear Copyright"
+msgstr ""
+
+#. Default: "Cleared Copyright"
+#: ./browser/cc_table.pt:81
+msgid "Cleared Copyright"
+msgstr ""
+
+#. Default: "Click on the ${course-list-page} link to see what courses others are building."
+#: ./skins/openocw/login_success.pt:76
+msgid "Click on the ${course-list-page} link to see what courses others are building."
+msgstr ""
+
+#. Default: "Content View"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Content View"
+msgstr ""
+
+#. Default: "Content listing"
+#: ./browser/cc_table.pt:30
+msgid "Content listing"
+msgstr ""
+
+#: ./browser/copyrightview.py:17
+msgid "Copyright Cleared"
+msgstr ""
+
+#: ./browser/copyrightview.py:20
+msgid "Copyright Revoked"
+msgstr ""
+
+#. Default: "Copyright Status"
+#: ./skins/eduCommons/change_copyright.cpt:74
+msgid "Copyright Status"
+msgstr ""
+
+#. Default: "Copyright process"
+#: ./skins/eduCommons/change_copyright.cpt:26
+msgid "Copyright process"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:239
+msgid "Could not create course."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:227
+msgid "Could not create/find existing division."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Course"
+msgstr ""
+
+#. Default: "Course Builder"
+#: ./portlet/coursebuilder.pt:4
+msgid "Course Builder"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:45
+msgid "Course Builder Portlet"
+msgstr ""
+
+#: ./browser/controlpanel.py:42
+msgid "Course Descriptor"
+msgstr ""
+
+#: ./content/course.py:45
+msgid "Course ID"
+msgstr ""
+
+#: ./portlet/courseinfoportlet.py:18
+msgid "Course Info Portlet"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "Course Schedule"
+msgstr ""
+
+#. Default: "Course Summary"
+#: ./portlet/courseinfo.pt:5
+msgid "Course Summary"
+msgstr ""
+
+#: ./browser/packagecourseview.py:17
+msgid "Course has been packaged"
+msgstr ""
+
+#. Default: "Courses"
+#: ./browser/sorted_course_listing.pt:14
+msgid "Courses"
+msgstr ""
+
+#. Default: "Courses in all departments"
+#: ./browser/rss_questions.pt:53
+msgid "Courses in all departments"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:182
+msgid "Create a new course using the fields below."
+msgstr ""
+
+#: ./content/course.py:124
+msgid "Cross Listing(s)"
+msgstr ""
+
+#. Default: "Department Feeds"
+#: ./browser/rss_questions.pt:62
+msgid "Department Feeds"
+msgstr ""
+
+#: ./setupHandlers.py:335
+msgid "Departments"
+msgstr ""
+
+#. Default: "Different news readers work on different operating systems, so you will need to choose one that will work with your computer."
+#: ./browser/rss_questions.pt:101
+msgid "Different news readers work on different operating systems, so you will need to choose one that will work with your computer."
+msgstr ""
+
+#: ./content/course.py:105
+msgid "Display Instructor Email Address"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:138
+msgid "Division"
+msgstr ""
+
+#: ./browser/controlpanel.py:36
+msgid "Division Descriptor"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:82
+msgid "Division with the same title already exists."
+msgstr ""
+
+#. Default: "Download this course"
+#: ./portlet/reusecourse.pt:11
+msgid "Download this course"
+msgstr ""
+
+#: ./browser/controlpanel.py:48
+msgid "Enable the display of the OER Recommender Portlet for Course objects and sub-objects."
+msgstr ""
+
+#: ./browser/controlpanel.py:53
+msgid "Enable the display of the course export link for Course objects and sub-objects."
+msgstr ""
+
+#. Default: "Enter the text displayed below."
+#: ./skins/eduCommons/join_form.cpt:239
+msgid "Enter the text displayed below."
+msgstr ""
+
+#: ./browser/reusecourse.py:127
+msgid "Export a Course to OpenOCW"
+msgstr ""
+
+#. Default: "Export into OpenOCW"
+#: ./portlet/reusecourse.pt:18
+msgid "Export into OpenOCW"
+msgstr ""
+
+#. Default: "FAQ"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "FAQ"
+msgstr ""
+
+#: ./browser/feedbackform.py:75
+msgid "Feedback request failed."
+msgstr ""
+
+#. Default: "Flags"
+#: ./browser/cc_table.pt:75
+msgid "Flags"
+msgstr ""
+
+#. Default: "Flags:"
+#: ./browser/cc_table.pt:81
+msgid "Flags:"
+msgstr ""
+
+#. Default: "Front Page"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Front Page"
+msgstr ""
+
+#. Default: "Get Email List"
+#: ./skins/eduCommons/prefs_users_overview.cpt:96
+msgid "Get Email List"
+msgstr ""
+
+#: ./content/course.py:77
+msgid "Graduate"
+msgstr ""
+
+#. Default: "Here is one ${google-reader} of available readers from Google."
+#: ./browser/rss_questions.pt:104
+msgid "Here is one ${google-reader} of available readers from Google."
+msgstr ""
+
+#. Default: "How do I get a news reader?"
+#: ./browser/rss_questions.pt:97
+msgid "How do I get a news reader?"
+msgstr ""
+
+#. Default: "How to I start using RSS feeds?"
+#: ./browser/rss_questions.pt:82
+msgid "How to I start using RSS feeds?"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:159
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "If checked, eduCommons will attempt to change the accessibility status of all content in any selected folders and their subfolders.<br />"
+#: ./skins/eduCommons/change_accessibility.cpt:65
+msgid "If checked, eduCommons will attempt to change the accessibility status of all content in any selected folders and their subfolders.<br />"
+msgstr ""
+
+#. Default: "If checked, eduCommons will attempt to change the copyright status of all content in any selected folders and their subfolders.<br />"
+#: ./skins/eduCommons/change_copyright.cpt:60
+msgid "If checked, eduCommons will attempt to change the copyright status of all content in any selected folders and their subfolders.<br />"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:108
+msgid "If not found, type in the name below to create a new one:"
+msgstr ""
+
+#. Default: "If this is your first time logging into OpenOCW, please be sure to read the ${terms-of-use-page} page before you start using your account."
+#: ./skins/openocw/login_success.pt:71
+msgid "If this is your first time logging into OpenOCW, please be sure to read the ${terms-of-use-page} page before you start using your account."
+msgstr ""
+
+#. Default: "If you click on the button you can subscribe to the feed in various ways, including by dragging the URL of the RSS feed into your news reader or by cutting and pasting the same URL into a new feed in your news reader. Most sites that offer RSS feeds use a similar orange RSS button, but some may just have a normal web link to the feed."
+#: ./browser/rss_questions.pt:93
+msgid "If you click on the button you can subscribe to the feed in various ways, including by dragging the URL of the RSS feed into your news reader or by cutting and pasting the same URL into a new feed in your news reader. Most sites that offer RSS feeds use a similar orange RSS button, but some may just have a normal web link to the feed."
+msgstr ""
+
+#. Default: "Image of Document Actions"
+#: ./browser/rss_questions.pt:88
+msgid "Image of Document Actions"
+msgstr ""
+
+#. Default: "In general, the first thing you need is something called a news reader. This is a piece of software that checks RSS feeds and lets you read any new articles that have been added to them. There are many different versions, some of which are accessed using a browser, and some of which are downloadable applications. Browser-based news readers let you catch up with your RSS feed subscriptions from any computer, whereas downloadable applications let you store them on your main computer, in the same way that you either download your e-mail, or keep it on a web-based service."
+#: ./browser/rss_questions.pt:84
+msgid "In general, the first thing you need is something called a news reader. This is a piece of software that checks RSS feeds and lets you read any new articles that have been added to them. There are many different versions, some of which are accessed using a browser, and some of which are downloadable applications. Browser-based news readers let you catch up with your RSS feed subscriptions from any computer, whereas downloadable applications let you store them on your main computer, in the same way that you either download your e-mail, or keep it on a web-based service."
+msgstr ""
+
+#. Default: "In order to translate the content your were viewing into ${language} you must first translate the parent ${DYNAMIC_CONTENT} object into ${language}."
+#: ./skins/eduCommons/not_available_lang.pt:41
+msgid "In order to translate the content your were viewing into ${language} you must first translate the parent ${DYNAMIC_CONTENT} object into ${language}."
+msgstr ""
+
+#: ./content/course.py:97
+msgid "Instructor Email"
+msgstr ""
+
+#: ./content/course.py:88
+msgid "Instructor Name"
+msgstr ""
+
+#: ./content/course.py:113
+msgid "Instructor is Primary Author"
+msgstr ""
+
+#: ./browser/feedbackform.py:46
+msgid "Invalid email address"
+msgstr ""
+
+#: ./content/course.py:115
+msgid "Is the primary instructor also the primary author of the course materials?"
+msgstr ""
+
+#. Default: "Items should be copyright cleared before publication. This form allows for bulk copyright clearance, as well as bulk copyright revocation. To recursively change the copyright status, be sure to check the include folder items checkbox on the form below."
+#: ./skins/eduCommons/change_copyright.cpt:28
+msgid "Items should be copyright cleared before publication. This form allows for bulk copyright clearance, as well as bulk copyright revocation. To recursively change the copyright status, be sure to check the include folder items checkbox on the form below."
+msgstr ""
+
+#. Default: "Items should meet minimum accessibility requirements before publication. Please evaluate the content against the ${descr-accessibility-link}, and set the flag accordingly."
+#: ./skins/eduCommons/change_accessibility.cpt:30
+msgid "Items should meet minimum accessibility requirements before publication. Please evaluate the content against the ${descr-accessibility-link}, and set the flag accordingly."
+msgstr ""
+
+#: ./content/course.py:78
+msgid "Level"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:88
+msgid "Missing course name."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:72
+msgid "Missing division."
+msgstr ""
+
+#. Default: "My Courses"
+#: ./portlet/mycourses.pt:4
+msgid "My Courses"
+msgstr ""
+
+#: ./portlet/mycourses.py:41
+msgid "My Courses Portlet"
+msgstr ""
+
+#. Default: "Not Accessible"
+#: ./skins/eduCommons/change_accessibility.cpt:98
+msgid "Not Accessible"
+msgstr ""
+
+#: ./browser/controlpanel.py:47
+msgid "OER Recommender"
+msgstr ""
+
+#: ./portlet/oerrecommenderportlet.py:17
+msgid "OER Recommender Portlet"
+msgstr ""
+
+#. Default: "Once you are ready to build your course, it is recommended that you use the Course Builder. You can get there by using the above link, or by clicking on the link on the right-hand side of the page. This link will take you to a form which will help you set up the basic structure of the course. The course will remain hidden from public view until the course, and all objects in it, are set to 'published' status."
+#: ./skins/openocw/login_success.pt:93
+msgid "Once you are ready to build your course, it is recommended that you use the Course Builder. You can get there by using the above link, or by clicking on the link on the right-hand side of the page. This link will take you to a form which will help you set up the basic structure of the course. The course will remain hidden from public view until the course, and all objects in it, are set to 'published' status."
+msgstr ""
+
+#. Default: "Once you have chosen a news reader, all you have to do is to decide what content you want to receive in your news reader, by finding and subscribing to the relevant RSS feeds. For example, if you would like the latest courses added to ${portal_title} OCW, simply visit the Course List page or this page and you will notice an orange RSS button."
+#: ./browser/rss_questions.pt:86
+msgid "Once you have chosen a news reader, all you have to do is to decide what content you want to receive in your news reader, by finding and subscribing to the relevant RSS feeds. For example, if you would like the latest courses added to ${portal_title} OCW, simply visit the Course List page or this page and you will notice an orange RSS button."
+msgstr ""
+
+#. Default: "Order"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Order"
+msgstr ""
+
+#. Default: "Ordering tab"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Ordering tab"
+msgstr ""
+
+#: ./content/course.py:126
+msgid "Other Divisions that this Course should be listed in. To select multiple options, SHIFT click for adjacent items, or CTRL/CMD click for non-adjacent items."
+msgstr ""
+
+#. Default: "Package Course"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Package Course"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:163
+msgid "Package Type"
+msgstr ""
+
+#. Default: "Privacy Policy"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Privacy Policy"
+msgstr ""
+
+#: ./browser/localroles.py:12
+msgid "Producer"
+msgstr ""
+
+#: ./browser/localroles.py:24
+msgid "Publisher"
+msgstr ""
+
+#. Default: "QA"
+#: ./browser/localroles.py:18
+msgid "QA"
+msgstr ""
+
+#. Default: "RSS Feed"
+#: ./skins/eduCommons/search.pt:55
+msgid "RSS Feed"
+msgstr ""
+
+#. Default: "RSS feed of these search results"
+#: ./skins/eduCommons/search.pt:55
+msgid "RSS feed of these search results"
+msgstr ""
+
+#. Default: "RSS stands for Really Simple Syndication. RSS is a time-saving way for you to receive news and information updates (often called 'RSS feeds', 'news feeds' or simply 'feeds') from your favorite Web sites and blogs."
+#: ./browser/rss_questions.pt:74
+msgid "RSS stands for Really Simple Syndication. RSS is a time-saving way for you to receive news and information updates (often called 'RSS feeds', 'news feeds' or simply 'feeds') from your favorite Web sites and blogs."
+msgstr ""
+
+#. Default: "Read ${documentation-page} on how to build a course."
+#: ./skins/openocw/login_success.pt:86
+msgid "Read ${documentation-page} on how to build a course."
+msgstr ""
+
+#. Default: "Receive notification of new ${portal_title} OCW courses on your desktop, or add them to your blog or website."
+#: ./browser/rss_questions.pt:37
+msgid "Receive notification of new ${portal_title} OCW courses on your desktop, or add them to your blog or website."
+msgstr ""
+
+#. Default: "Relevance"
+#: ./skins/eduCommons/search.pt:83
+msgid "Relevance"
+msgstr ""
+
+#. Default: "Remove from navigation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Remove from navigation"
+msgstr ""
+
+#. Default: "Report Content"
+#: ./profiles/openocw/actionicons.xml
+#: ./profiles/openocw/actions.xml
+msgid "Report Content"
+msgstr ""
+
+#: ./browser/reportcontentform.py:82
+msgid "Report Content request failed."
+msgstr ""
+
+#. Default: "Return to Top"
+#: ./browser/rss_questions.pt:111
+msgid "Return to Top"
+msgstr ""
+
+#: ./browser/reusecourse.py:134
+msgid "Reuse"
+msgstr ""
+
+#. Default: "Reuse Course"
+#: ./portlet/reusecourse.pt:5
+msgid "Reuse Course"
+msgstr ""
+
+#: ./browser/controlpanel.py:58
+msgid "Reuse Course Portal"
+msgstr ""
+
+#: ./browser/reusecourse.py:128
+msgid "Reuse this course on OpenOCW. In order to do so, you must have an account at OpenOCW.org."
+msgstr ""
+
+#. Default: "Revoke Copyright"
+#: ./skins/eduCommons/change_copyright.cpt:99
+msgid "Revoke Copyright"
+msgstr ""
+
+#. Default: "S5 Presentation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "S5 Presentation"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:107
+msgid "Select from below:"
+msgstr ""
+
+#. Default: "Set cleared copyright if content object has been correctly licensed from the author, and is free from copyright violations."
+#: ./browser/clear_copyright.pt:19
+msgid "Set cleared copyright if content object has been correctly licensed from the author, and is free from copyright violations."
+msgstr ""
+
+#. Default: "Set the accessibility flag if your content meets the criteria outlined ${link_accessibility}."
+#: ./browser/accessibility_compliant.pt:23
+msgid "Set the accessibility flag if your content meets the criteria outlined ${link_accessibility}."
+msgstr ""
+
+#. Default: "Set the accessibility flag if your content meets the criteria outlined *LINK HERE*"
+#: ./browser/ada_compliant.pt:19
+msgid "Set the accessibility flag if your content meets the criteria outlined *LINK HERE*"
+msgstr ""
+
+#: ./browser/controlpanel.py:117
+msgid "Settings which control how eduCommons looks and functions."
+msgstr ""
+
+#: ./content/course.py:107
+msgid "Should the primary instructor's Email address be publically displayed?"
+msgstr ""
+
+#. Default: "Show in navigation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Show in navigation"
+msgstr ""
+
+#. Default: "Some browsers, including Firefox and Safari, automatically check for RSS feeds for you when you visit a Web site, and display an icon when they find one. This can make subscribing to RSS feeds much easier. For more details on these, please check their Web sites."
+#: ./browser/rss_questions.pt:95
+msgid "Some browsers, including Firefox and Safari, automatically check for RSS feeds for you when you visit a Web site, and display an icon when they find one. This can make subscribing to RSS feeds much easier. For more details on these, please check their Web sites."
+msgstr ""
+
+#: ./content/course.py:66
+msgid "Structure"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "Syllabus"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:152
+msgid "Templates"
+msgstr ""
+
+#: ./browser/menu.py:42
+msgid "Templates for the current content item."
+msgstr ""
+
+#: ./content/course.py:54
+msgid "Term"
+msgstr ""
+
+#. Default: "Terms of Use"
+#: ./skins/openocw/login_success.pt:71
+msgid "Terms of Use"
+msgstr ""
+
+#: ./browser/controlpanel.py:59
+msgid "The URL to the eduCommons instance utilized by the Reuse Course portlet."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:145
+msgid "The course identifier or catalog number."
+msgstr ""
+
+#: ./content/course.py:47
+msgid "The course identifier or catalog number. Also can be used to sequence courses (1.0, 2.0, etc)."
+msgstr ""
+
+#: ./content/course.py:99
+msgid "The email address of the primary instructor teaching this course."
+msgstr ""
+
+#: ./content/course.py:80
+msgid "The level at which the course is taught."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:160
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./content/course.py:90
+msgid "The name of the primary instructor teaching this course."
+msgstr ""
+
+#: ./browser/reusecourse.py:94
+msgid "The remote site is unavailable of configured incorrectly. Please contact an administrator."
+msgstr ""
+
+#: ./content/course.py:68
+msgid "The structure of the course."
+msgstr ""
+
+#: ./content/course.py:56
+msgid "The term the course was taught in."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:164
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "There is a range of different news readers available and new versions are appearing all the time."
+#: ./browser/rss_questions.pt:99
+msgid "There is a range of different news readers available and new versions are appearing all the time."
+msgstr ""
+
+#: ./skins/eduCommons/validate_join_form_captcha.vpy:19
+msgid "This field is required, please enter the word below."
+msgstr ""
+
+#. Default: "To start building a new course, use the ${build-a-course-page} link that appears to the right of any page."
+#: ./skins/openocw/login_success.pt:80
+msgid "To start building a new course, use the ${build-a-course-page} link that appears to the right of any page."
+msgstr ""
+
+#. Default: "Total Objects: ${total}"
+#: ./portlet/courseinfo.pt:39
+msgid "Total Objects: ${total}"
+msgstr ""
+
+#: ./browser/translate.py:63
+msgid "Translated created."
+msgstr ""
+
+#: ./browser/translate.py:52
+msgid "Translation already exists"
+msgstr ""
+
+#. Default: "Typically RSS feeds consist of headlines and short summaries of new articles, blog entries or search results, though some Web sites and blogs offer the full text of articles or blog entrees as feeds."
+#: ./browser/rss_questions.pt:76
+msgid "Typically RSS feeds consist of headlines and short summaries of new articles, blog entries or search results, though some Web sites and blogs offer the full text of articles or blog entrees as feeds."
+msgstr ""
+
+#: ./content/course.py:77
+msgid "Undergraduate"
+msgstr ""
+
+#. Default: "Use this action to report inappropriate content to the site administrator."
+#: ./profiles/openocw/actions.xml
+msgid "Use this action to report inappropriate content to the site administrator."
+msgstr ""
+
+#: ./browser/localroles.py:30
+msgid "Viewer"
+msgstr ""
+
+#: ./browser/feedbackform.py:55
+msgid "We appreciate your feedback. If you find this site useful, or think it could be better, or are having problems using it, please feel free to use the form below to let us know about it."
+msgstr ""
+
+#. Default: "Welcome to OpenOCW"
+#: ./skins/openocw/login_success.pt:63
+msgid "Welcome to OpenOCW"
+msgstr ""
+
+#. Default: "Welcome to OpenOCW! Here are some things you may want to do:"
+#: ./skins/openocw/login_success.pt:64
+msgid "Welcome to OpenOCW! Here are some things you may want to do:"
+msgstr ""
+
+#. Default: "What is RSS?"
+#: ./browser/rss_questions.pt:72
+msgid "What is RSS?"
+msgstr ""
+
+#. Default: "Why use RSS?"
+#: ./browser/rss_questions.pt:78
+msgid "Why use RSS?"
+msgstr ""
+
+#: ./browser/reusecourse.py:112
+msgid "Your user name on OpenOCW"
+msgstr ""
+
+#: ./browser/reusecourse.py:116
+msgid "Your user password on OpenOCW"
+msgstr ""
+
+#. Default: "[audio]"
+#: ./skins/eduCommons/join_form.cpt:257
+msgid "[audio]"
+msgstr ""
+
+#. Default: "accessibility"
+#: ./browser/footer.pt:10
+msgid "accessibility"
+msgstr ""
+
+#. Default: "accessibility guidelines"
+#: ./skins/eduCommons/change_accessibility.cpt:31
+msgid "accessibility guidelines"
+msgstr ""
+
+#. Default: "courses"
+#: ./skins/openocw/login_success.pt:76
+msgid "courses"
+msgstr ""
+
+#. Default: "documentation"
+#: ./skins/openocw/login_success.pt:86
+msgid "documentation"
+msgstr ""
+
+#. Default: "eduCommons"
+#: ./profiles/default/actionicons.xml
+#: ./profiles/openocw/actionicons.xml
+msgid "eduCommons"
+msgstr ""
+
+#: ./portlet/simplenavportlet.py:44
+msgid "eduCommons Navigation"
+msgstr ""
+
+#: ./browser/controlpanel.py:116
+msgid "eduCommons Settings"
+msgstr ""
+
+#. Default: "feedback"
+#: ./browser/footer.pt:6
+msgid "feedback"
+msgstr ""
+
+#. Default: "here"
+#: ./browser/accessibility_compliant.pt:24
+msgid "here"
+msgstr ""
+
+#. Default: "list"
+#: ./browser/rss_questions.pt:104
+msgid "list"
+msgstr ""
+
+#. Default: "powered by eduCommons"
+#: ./browser/footer.pt:16
+msgid "powered by eduCommons"
+msgstr ""
+
+#. Default: "privacy policy"
+#: ./browser/footer.pt:14
+msgid "privacy policy"
+msgstr ""
+
+#. Default: "site map"
+#: ./browser/footer.pt:8
+msgid "site map"
+msgstr ""
+
+#. Default: "terms of use"
+#: ./browser/footer.pt:12
+msgid "terms of use"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/de/LC_MESSAGES/eduCommons.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/de/LC_MESSAGES/eduCommons.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/de/LC_MESSAGES/eduCommons.po	(revision 126)
@@ -0,0 +1,879 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: eduCommons 1.5.0\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME < EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: de\n"
+"Language-Name: Deutsch\n"
+"Preferred-Encodings: latin1 utf-8\n"
+"Domain: eduCommons\n"
+
+#: ./portlet/coursebuilderform.py:106
+msgid "(Choose one)"
+msgstr ""
+
+#: ./browser/controlpanel.py:43
+msgid "A descriptor that describes courses in your institution."
+msgstr ""
+
+#: ./browser/controlpanel.py:37
+msgid "A descriptor that describes how your academic institution is divided. Typically this will be 'Departments' or 'Divisions.'"
+msgstr ""
+
+#: ./browser/adaview.py:19
+msgid "ADA Compliant set to False"
+msgstr ""
+
+#: ./browser/adaview.py:16
+msgid "ADA Compliant set to True"
+msgstr ""
+
+#. Default: "About Page"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Page"
+msgstr ""
+
+#. Default: "About Professor"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Professor"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "About the Professor"
+msgstr ""
+
+#: ./browser/accessibilityview.py:20
+msgid "Accessibility Compliant set to False"
+msgstr ""
+
+#: ./browser/accessibilityview.py:17
+msgid "Accessibility Compliant set to True"
+msgstr ""
+
+#. Default: "Accessibility Status"
+#. ../skins/eduCommons/change_accessibility.cpt
+#: ./skins/eduCommons/change_accessibility.cpt:79
+msgid "Accessibility Status"
+msgstr ""
+
+#. Default: "Accessibility process"
+#: ./skins/eduCommons/change_accessibility.cpt:26
+msgid "Accessibility process"
+msgstr ""
+
+#. Default: "Accessible"
+#. ../skins/eduCommons/change_accessibility.cpt
+#: ./browser/accessibility_compliant.pt:14
+msgid "Accessible"
+msgstr ""
+
+#: ./browser/menu.py:245
+msgid "Advanced..."
+msgstr ""
+
+#: ./browser/controlpanel.py:52
+msgid "Allow Reuse Course Export"
+msgstr ""
+
+#. Default: "Apply Template"
+#: ./browser/menu.py:41
+msgid "Apply Template"
+msgstr ""
+
+#. Default: "Available Feeds"
+#: ./browser/rss_questions.pt:40
+msgid "Available Feeds"
+msgstr ""
+
+#: ./content/course.py:38
+msgid "Body Text"
+msgstr ""
+
+#. Default: "Build a Course"
+#: ./portlet/coursebuilder.pt:10
+msgid "Build a Course"
+msgstr ""
+
+#. Default: "Building a Course"
+#: ./skins/openocw/login_success.pt:91
+msgid "Building a Course"
+msgstr ""
+
+#. Default: "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+#: ./browser/rss_questions.pt:80
+msgid "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+msgstr ""
+
+#. Default: "Captcha"
+#. ../skins/eduCommons/join_form.cpt
+#: ./skins/eduCommons/join_form.cpt:231
+msgid "Captcha"
+msgstr ""
+
+#. Default: "Change Copyright"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Change Copyright"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:153
+msgid "Choose from the following templates:"
+msgstr ""
+
+#. Default: "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+#: ./skins/eduCommons/change_copyright.cpt:75
+msgid "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+msgstr ""
+
+#. Default: "Choose to set the accessibility flag, or revoke accessibility."
+#: ./skins/eduCommons/change_accessibility.cpt:80
+msgid "Choose to set the accessibility flag, or revoke accessibility."
+msgstr ""
+
+## Translation for eduCommons buttons
+#. Default: "Clear Copyright"
+#: ./skins/eduCommons/change_copyright.cpt:88
+msgid "Clear Copyright"
+msgstr "Freies Copyright"
+
+#. Default: "Cleared Copyright"
+#: ./browser/cc_table.pt:81
+msgid "Cleared Copyright"
+msgstr ""
+
+#. Default: "Click on the ${course-list-page} link to see what courses others are building."
+#: ./skins/openocw/login_success.pt:76
+msgid "Click on the ${course-list-page} link to see what courses others are building."
+msgstr ""
+
+#. Default: "Content View"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Content View"
+msgstr ""
+
+#. Default: "Content listing"
+#: ./browser/cc_table.pt:30
+msgid "Content listing"
+msgstr ""
+
+#: ./browser/copyrightview.py:17
+msgid "Copyright Cleared"
+msgstr ""
+
+#: ./browser/copyrightview.py:20
+msgid "Copyright Revoked"
+msgstr ""
+
+#. Default: "Copyright Status"
+#: ./skins/eduCommons/change_copyright.cpt:74
+msgid "Copyright Status"
+msgstr ""
+
+#. Default: "Copyright process"
+#: ./skins/eduCommons/change_copyright.cpt:26
+msgid "Copyright process"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:239
+msgid "Could not create course."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:227
+msgid "Could not create/find existing division."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Course"
+msgstr "Kurs"
+
+#. Default: "Course Builder"
+#: ./portlet/coursebuilder.pt:4
+msgid "Course Builder"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:45
+msgid "Course Builder Portlet"
+msgstr ""
+
+#: ./browser/controlpanel.py:42
+msgid "Course Descriptor"
+msgstr ""
+
+#. widget=StringWidget(label='Course ID',
+#. label_msgid='label_courseID',
+#. description='Enter the Course ID.',
+#. description_msgid='help_courseid',
+#. i18n_domain='eduCommons')),
+#. Default: "Course ID"
+#. ../content/ec_object.py
+#: ./content/course.py:45
+msgid "Course ID"
+msgstr ""
+
+#: ./portlet/courseinfoportlet.py:18
+msgid "Course Info Portlet"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "Course Schedule"
+msgstr ""
+
+#. <span i18n:domain="eduCommons" i18n:translate="heading_course_summary">
+#. Course Summary
+#. </span>
+#. Default: "Course Summary"
+#: ./portlet/courseinfo.pt:5
+msgid "Course Summary"
+msgstr ""
+
+#: ./browser/packagecourseview.py:17
+msgid "Course has been packaged"
+msgstr ""
+
+#. Default: "Courses"
+#: ./browser/sorted_course_listing.pt:14
+msgid "Courses"
+msgstr "Kurse"
+
+#. Default: "Courses in all departments"
+#: ./browser/rss_questions.pt:53
+msgid "Courses in all departments"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:182
+msgid "Create a new course using the fields below."
+msgstr ""
+
+#: ./content/course.py:124
+msgid "Cross Listing(s)"
+msgstr ""
+
+#. Default: "Department Feeds"
+#: ./browser/rss_questions.pt:62
+msgid "Department Feeds"
+msgstr ""
+
+#: ./setupHandlers.py:335
+msgid "Departments"
+msgstr ""
+
+#. Default: "Different news readers work on different operating systems, so you will need to choose one that will work with your computer."
+#: ./browser/rss_questions.pt:101
+msgid "Different news readers work on different operating systems, so you will need to choose one that will work with your computer."
+msgstr ""
+
+#: ./content/course.py:105
+msgid "Display Instructor Email Address"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:138
+msgid "Division"
+msgstr ""
+
+#: ./browser/controlpanel.py:36
+msgid "Division Descriptor"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:82
+msgid "Division with the same title already exists."
+msgstr ""
+
+#. Default: "Download this course"
+#: ./portlet/reusecourse.pt:11
+msgid "Download this course"
+msgstr ""
+
+#: ./browser/controlpanel.py:48
+msgid "Enable the display of the OER Recommender Portlet for Course objects and sub-objects."
+msgstr ""
+
+#: ./browser/controlpanel.py:53
+msgid "Enable the display of the course export link for Course objects and sub-objects."
+msgstr ""
+
+#. Default: "Enter the text displayed below."
+#. ../skins/eduCommons/join_form.cpt
+#: ./skins/eduCommons/join_form.cpt:239
+msgid "Enter the text displayed below."
+msgstr ""
+
+#: ./browser/reusecourse.py:127
+msgid "Export a Course to OpenOCW"
+msgstr ""
+
+#. Default: "Export into OpenOCW"
+#: ./portlet/reusecourse.pt:18
+msgid "Export into OpenOCW"
+msgstr ""
+
+#. Default: "FAQ"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "FAQ"
+msgstr ""
+
+#: ./browser/feedbackform.py:75
+msgid "Feedback request failed."
+msgstr ""
+
+#. Default: "Flags"
+#: ./browser/cc_table.pt:75
+msgid "Flags"
+msgstr ""
+
+#. Default: "Flags:"
+#: ./browser/cc_table.pt:81
+msgid "Flags:"
+msgstr ""
+
+#. Default: "Front Page"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Front Page"
+msgstr ""
+
+#. Default: "Get Email List"
+#: ./skins/eduCommons/prefs_users_overview.cpt:96
+msgid "Get Email List"
+msgstr ""
+
+#: ./content/course.py:77
+msgid "Graduate"
+msgstr ""
+
+#. Default: "Here is one ${google-reader} of available readers from Google."
+#: ./browser/rss_questions.pt:104
+msgid "Here is one ${google-reader} of available readers from Google."
+msgstr ""
+
+#. Default: "How do I get a news reader?"
+#: ./browser/rss_questions.pt:97
+msgid "How do I get a news reader?"
+msgstr ""
+
+#. Default: "How to I start using RSS feeds?"
+#: ./browser/rss_questions.pt:82
+msgid "How to I start using RSS feeds?"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:159
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "If checked, eduCommons will attempt to change the accessibility status of all content in any selected folders and their subfolders.<br />"
+#: ./skins/eduCommons/change_accessibility.cpt:65
+msgid "If checked, eduCommons will attempt to change the accessibility status of all content in any selected folders and their subfolders.<br />"
+msgstr ""
+
+#. Default: "If checked, eduCommons will attempt to change the copyright status of all content in any selected folders and their subfolders.<br />"
+#: ./skins/eduCommons/change_copyright.cpt:60
+msgid "If checked, eduCommons will attempt to change the copyright status of all content in any selected folders and their subfolders.<br />"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:108
+msgid "If not found, type in the name below to create a new one:"
+msgstr ""
+
+#. Default: "If this is your first time logging into OpenOCW, please be sure to read the ${terms-of-use-page} page before you start using your account."
+#: ./skins/openocw/login_success.pt:71
+msgid "If this is your first time logging into OpenOCW, please be sure to read the ${terms-of-use-page} page before you start using your account."
+msgstr ""
+
+#. Default: "If you click on the button you can subscribe to the feed in various ways, including by dragging the URL of the RSS feed into your news reader or by cutting and pasting the same URL into a new feed in your news reader. Most sites that offer RSS feeds use a similar orange RSS button, but some may just have a normal web link to the feed."
+#: ./browser/rss_questions.pt:93
+msgid "If you click on the button you can subscribe to the feed in various ways, including by dragging the URL of the RSS feed into your news reader or by cutting and pasting the same URL into a new feed in your news reader. Most sites that offer RSS feeds use a similar orange RSS button, but some may just have a normal web link to the feed."
+msgstr ""
+
+#. Default: "Image of Document Actions"
+#: ./browser/rss_questions.pt:88
+msgid "Image of Document Actions"
+msgstr ""
+
+#. Default: "In general, the first thing you need is something called a news reader. This is a piece of software that checks RSS feeds and lets you read any new articles that have been added to them. There are many different versions, some of which are accessed using a browser, and some of which are downloadable applications. Browser-based news readers let you catch up with your RSS feed subscriptions from any computer, whereas downloadable applications let you store them on your main computer, in the same way that you either download your e-mail, or keep it on a web-based service."
+#: ./browser/rss_questions.pt:84
+msgid "In general, the first thing you need is something called a news reader. This is a piece of software that checks RSS feeds and lets you read any new articles that have been added to them. There are many different versions, some of which are accessed using a browser, and some of which are downloadable applications. Browser-based news readers let you catch up with your RSS feed subscriptions from any computer, whereas downloadable applications let you store them on your main computer, in the same way that you either download your e-mail, or keep it on a web-based service."
+msgstr ""
+
+#. Default: "In order to translate the content your were viewing into ${language} you must first translate the parent ${DYNAMIC_CONTENT} object into ${language}."
+#: ./skins/eduCommons/not_available_lang.pt:41
+msgid "In order to translate the content your were viewing into ${language} you must first translate the parent ${DYNAMIC_CONTENT} object into ${language}."
+msgstr ""
+
+#: ./content/course.py:97
+msgid "Instructor Email"
+msgstr ""
+
+#: ./content/course.py:88
+msgid "Instructor Name"
+msgstr ""
+
+#: ./content/course.py:113
+msgid "Instructor is Primary Author"
+msgstr ""
+
+#: ./browser/feedbackform.py:46
+msgid "Invalid email address"
+msgstr ""
+
+#: ./content/course.py:115
+msgid "Is the primary instructor also the primary author of the course materials?"
+msgstr ""
+
+#. Default: "Items should be copyright cleared before publication. This form allows for bulk copyright clearance, as well as bulk copyright revocation. To recursively change the copyright status, be sure to check the include folder items checkbox on the form below."
+#: ./skins/eduCommons/change_copyright.cpt:28
+msgid "Items should be copyright cleared before publication. This form allows for bulk copyright clearance, as well as bulk copyright revocation. To recursively change the copyright status, be sure to check the include folder items checkbox on the form below."
+msgstr ""
+
+#. Default: "Items should meet minimum accessibility requirements before publication. Please evaluate the content against the ${descr-accessibility-link}, and set the flag accordingly."
+#: ./skins/eduCommons/change_accessibility.cpt:30
+msgid "Items should meet minimum accessibility requirements before publication. Please evaluate the content against the ${descr-accessibility-link}, and set the flag accordingly."
+msgstr ""
+
+#: ./content/course.py:78
+msgid "Level"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:88
+msgid "Missing course name."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:72
+msgid "Missing division."
+msgstr ""
+
+#. Default: "My Courses"
+#: ./portlet/mycourses.pt:4
+msgid "My Courses"
+msgstr ""
+
+#: ./portlet/mycourses.py:41
+msgid "My Courses Portlet"
+msgstr ""
+
+#. Default: "Not Accessible"
+#. ../skins/eduCommons/change_accessibility.cpt
+#: ./skins/eduCommons/change_accessibility.cpt:98
+msgid "Not Accessible"
+msgstr ""
+
+#: ./browser/controlpanel.py:47
+msgid "OER Recommender"
+msgstr ""
+
+#: ./portlet/oerrecommenderportlet.py:17
+msgid "OER Recommender Portlet"
+msgstr ""
+
+#. Default: "Once you are ready to build your course, it is recommended that you use the Course Builder. You can get there by using the above link, or by clicking on the link on the right-hand side of the page. This link will take you to a form which will help you set up the basic structure of the course. The course will remain hidden from public view until the course, and all objects in it, are set to 'published' status."
+#: ./skins/openocw/login_success.pt:93
+msgid "Once you are ready to build your course, it is recommended that you use the Course Builder. You can get there by using the above link, or by clicking on the link on the right-hand side of the page. This link will take you to a form which will help you set up the basic structure of the course. The course will remain hidden from public view until the course, and all objects in it, are set to 'published' status."
+msgstr ""
+
+#. Default: "Once you have chosen a news reader, all you have to do is to decide what content you want to receive in your news reader, by finding and subscribing to the relevant RSS feeds. For example, if you would like the latest courses added to ${portal_title} OCW, simply visit the Course List page or this page and you will notice an orange RSS button."
+#: ./browser/rss_questions.pt:86
+msgid "Once you have chosen a news reader, all you have to do is to decide what content you want to receive in your news reader, by finding and subscribing to the relevant RSS feeds. For example, if you would like the latest courses added to ${portal_title} OCW, simply visit the Course List page or this page and you will notice an orange RSS button."
+msgstr ""
+
+#. Default: "Order"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Order"
+msgstr "Auftrag"
+
+#. Default: "Ordering tab"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Ordering tab"
+msgstr ""
+
+#: ./content/course.py:126
+msgid "Other Divisions that this Course should be listed in. To select multiple options, SHIFT click for adjacent items, or CTRL/CMD click for non-adjacent items."
+msgstr ""
+
+#. Default: "Package Course"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Package Course"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:163
+msgid "Package Type"
+msgstr ""
+
+#. Default: "Privacy Policy"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Privacy Policy"
+msgstr ""
+
+#: ./browser/localroles.py:12
+msgid "Producer"
+msgstr ""
+
+#: ./browser/localroles.py:24
+msgid "Publisher"
+msgstr ""
+
+#. Default: "QA"
+#: ./browser/localroles.py:18
+msgid "QA"
+msgstr ""
+
+#. Default: "RSS Feed"
+#: ./skins/eduCommons/search.pt:55
+msgid "RSS Feed"
+msgstr ""
+
+#. Default: "RSS feed of these search results"
+#: ./skins/eduCommons/search.pt:55
+msgid "RSS feed of these search results"
+msgstr ""
+
+#. Default: "RSS stands for Really Simple Syndication. RSS is a time-saving way for you to receive news and information updates (often called 'RSS feeds', 'news feeds' or simply 'feeds') from your favorite Web sites and blogs."
+#: ./browser/rss_questions.pt:74
+msgid "RSS stands for Really Simple Syndication. RSS is a time-saving way for you to receive news and information updates (often called 'RSS feeds', 'news feeds' or simply 'feeds') from your favorite Web sites and blogs."
+msgstr ""
+
+#. Default: "Read ${documentation-page} on how to build a course."
+#: ./skins/openocw/login_success.pt:86
+msgid "Read ${documentation-page} on how to build a course."
+msgstr ""
+
+#. Default: "Receive notification of new ${portal_title} OCW courses on your desktop, or add them to your blog or website."
+#: ./browser/rss_questions.pt:37
+msgid "Receive notification of new ${portal_title} OCW courses on your desktop, or add them to your blog or website."
+msgstr ""
+
+#. Default: "Relevance"
+#: ./skins/eduCommons/search.pt:83
+msgid "Relevance"
+msgstr ""
+
+#. Default: "Remove from navigation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Remove from navigation"
+msgstr ""
+
+#. Default: "Report Content"
+#: ./profiles/openocw/actionicons.xml
+#: ./profiles/openocw/actions.xml
+msgid "Report Content"
+msgstr ""
+
+#: ./browser/reportcontentform.py:82
+msgid "Report Content request failed."
+msgstr ""
+
+#. <a href="#top" i18n:attributes="title link_title_top;" i18n:translate="text_discussion_top" title="Return to Top">
+#. Return to Top
+#. </a>
+#. Default: "Return to Top"
+#: ./browser/rss_questions.pt:111
+msgid "Return to Top"
+msgstr ""
+
+#: ./browser/reusecourse.py:134
+msgid "Reuse"
+msgstr ""
+
+#. Default: "Reuse Course"
+#: ./portlet/reusecourse.pt:5
+msgid "Reuse Course"
+msgstr ""
+
+#: ./browser/controlpanel.py:58
+msgid "Reuse Course Portal"
+msgstr ""
+
+#: ./browser/reusecourse.py:128
+msgid "Reuse this course on OpenOCW. In order to do so, you must have an account at OpenOCW.org."
+msgstr ""
+
+#. Default: "Revoke Copyright"
+#: ./skins/eduCommons/change_copyright.cpt:99
+msgid "Revoke Copyright"
+msgstr "Widerrufen Sie Copyright"
+
+#. Default: "S5 Presentation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "S5 Presentation"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:107
+msgid "Select from below:"
+msgstr ""
+
+#. Default: "Set cleared copyright if content object has been correctly licensed from the author, and is free from copyright violations."
+#: ./browser/clear_copyright.pt:19
+msgid "Set cleared copyright if content object has been correctly licensed from the author, and is free from copyright violations."
+msgstr ""
+
+#. Default: "Set the accessibility flag if your content meets the criteria outlined ${link_accessibility}."
+#: ./browser/accessibility_compliant.pt:23
+msgid "Set the accessibility flag if your content meets the criteria outlined ${link_accessibility}."
+msgstr ""
+
+#. Default: "Set the accessibility flag if your content meets the criteria outlined *LINK HERE*"
+#: ./browser/ada_compliant.pt:19
+msgid "Set the accessibility flag if your content meets the criteria outlined *LINK HERE*"
+msgstr ""
+
+#: ./browser/controlpanel.py:117
+msgid "Settings which control how eduCommons looks and functions."
+msgstr ""
+
+#: ./content/course.py:107
+msgid "Should the primary instructor's Email address be publically displayed?"
+msgstr ""
+
+#. Default: "Show in navigation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Show in navigation"
+msgstr ""
+
+#. Default: "Some browsers, including Firefox and Safari, automatically check for RSS feeds for you when you visit a Web site, and display an icon when they find one. This can make subscribing to RSS feeds much easier. For more details on these, please check their Web sites."
+#: ./browser/rss_questions.pt:95
+msgid "Some browsers, including Firefox and Safari, automatically check for RSS feeds for you when you visit a Web site, and display an icon when they find one. This can make subscribing to RSS feeds much easier. For more details on these, please check their Web sites."
+msgstr ""
+
+#: ./content/course.py:66
+msgid "Structure"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "Syllabus"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:152
+msgid "Templates"
+msgstr ""
+
+#: ./browser/menu.py:42
+msgid "Templates for the current content item."
+msgstr ""
+
+#: ./content/course.py:54
+msgid "Term"
+msgstr ""
+
+#. Default: "Terms of Use"
+#: ./skins/openocw/login_success.pt:71
+msgid "Terms of Use"
+msgstr ""
+
+#: ./browser/controlpanel.py:59
+msgid "The URL to the eduCommons instance utilized by the Reuse Course portlet."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:145
+msgid "The course identifier or catalog number."
+msgstr ""
+
+#: ./content/course.py:47
+msgid "The course identifier or catalog number. Also can be used to sequence courses (1.0, 2.0, etc)."
+msgstr ""
+
+#: ./content/course.py:99
+msgid "The email address of the primary instructor teaching this course."
+msgstr ""
+
+#: ./content/course.py:80
+msgid "The level at which the course is taught."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:160
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./content/course.py:90
+msgid "The name of the primary instructor teaching this course."
+msgstr ""
+
+#: ./browser/reusecourse.py:94
+msgid "The remote site is unavailable of configured incorrectly. Please contact an administrator."
+msgstr ""
+
+#: ./content/course.py:68
+msgid "The structure of the course."
+msgstr ""
+
+#: ./content/course.py:56
+msgid "The term the course was taught in."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:164
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "There is a range of different news readers available and new versions are appearing all the time."
+#: ./browser/rss_questions.pt:99
+msgid "There is a range of different news readers available and new versions are appearing all the time."
+msgstr ""
+
+#: ./skins/eduCommons/validate_join_form_captcha.vpy:19
+msgid "This field is required, please enter the word below."
+msgstr ""
+
+#. Default: "To start building a new course, use the ${build-a-course-page} link that appears to the right of any page."
+#: ./skins/openocw/login_success.pt:80
+msgid "To start building a new course, use the ${build-a-course-page} link that appears to the right of any page."
+msgstr ""
+
+#. <td colspan="3" i18n:translate="text_total_obj">
+#. Total Objects:
+#. ${total}
+#. </td>
+#. Default: "Total Objects: ${total}"
+#: ./portlet/courseinfo.pt:39
+msgid "Total Objects: ${total}"
+msgstr ""
+
+#: ./browser/translate.py:63
+msgid "Translated created."
+msgstr ""
+
+#: ./browser/translate.py:52
+msgid "Translation already exists"
+msgstr ""
+
+#. Default: "Typically RSS feeds consist of headlines and short summaries of new articles, blog entries or search results, though some Web sites and blogs offer the full text of articles or blog entrees as feeds."
+#: ./browser/rss_questions.pt:76
+msgid "Typically RSS feeds consist of headlines and short summaries of new articles, blog entries or search results, though some Web sites and blogs offer the full text of articles or blog entrees as feeds."
+msgstr ""
+
+#: ./content/course.py:77
+msgid "Undergraduate"
+msgstr ""
+
+#. Default: "Use this action to report inappropriate content to the site administrator."
+#: ./profiles/openocw/actions.xml
+msgid "Use this action to report inappropriate content to the site administrator."
+msgstr ""
+
+#: ./browser/localroles.py:30
+msgid "Viewer"
+msgstr ""
+
+#: ./browser/feedbackform.py:55
+msgid "We appreciate your feedback. If you find this site useful, or think it could be better, or are having problems using it, please feel free to use the form below to let us know about it."
+msgstr ""
+
+#. Default: "Welcome to OpenOCW"
+#: ./skins/openocw/login_success.pt:63
+msgid "Welcome to OpenOCW"
+msgstr ""
+
+#. Default: "Welcome to OpenOCW! Here are some things you may want to do:"
+#: ./skins/openocw/login_success.pt:64
+msgid "Welcome to OpenOCW! Here are some things you may want to do:"
+msgstr ""
+
+#. Default: "What is RSS?"
+#: ./browser/rss_questions.pt:72
+msgid "What is RSS?"
+msgstr ""
+
+#. Default: "Why use RSS?"
+#: ./browser/rss_questions.pt:78
+msgid "Why use RSS?"
+msgstr ""
+
+#: ./browser/reusecourse.py:112
+msgid "Your user name on OpenOCW"
+msgstr ""
+
+#: ./browser/reusecourse.py:116
+msgid "Your user password on OpenOCW"
+msgstr ""
+
+#. Default: "[audio]"
+#. ../skins/eduCommons/join_form.cpt
+#: ./skins/eduCommons/join_form.cpt:257
+msgid "[audio]"
+msgstr ""
+
+#. Default: "accessibility"
+#: ./browser/footer.pt:10
+msgid "accessibility"
+msgstr ""
+
+#. Default: "accessibility guidelines"
+#. ../skins/eduCommons/change_accessibility.cpt
+#: ./skins/eduCommons/change_accessibility.cpt:31
+msgid "accessibility guidelines"
+msgstr ""
+
+#. Default: "courses"
+#: ./skins/openocw/login_success.pt:76
+msgid "courses"
+msgstr ""
+
+#. Default: "documentation"
+#: ./skins/openocw/login_success.pt:86
+msgid "documentation"
+msgstr ""
+
+#. Default: "eduCommons"
+#: ./profiles/default/actionicons.xml
+#: ./profiles/openocw/actionicons.xml
+msgid "eduCommons"
+msgstr ""
+
+#: ./portlet/simplenavportlet.py:44
+msgid "eduCommons Navigation"
+msgstr ""
+
+#: ./browser/controlpanel.py:116
+msgid "eduCommons Settings"
+msgstr ""
+
+#. Default: "feedback"
+#: ./browser/footer.pt:6
+msgid "feedback"
+msgstr ""
+
+#. Default: "here"
+#. ../skins/eduCommons/accessibility_compliant.cpt
+#: ./browser/accessibility_compliant.pt:24
+msgid "here"
+msgstr ""
+
+#. Default: "list"
+#: ./browser/rss_questions.pt:104
+msgid "list"
+msgstr ""
+
+#. Default: "powered by eduCommons"
+#: ./browser/footer.pt:16
+msgid "powered by eduCommons"
+msgstr ""
+
+#. Default: "privacy policy"
+#: ./browser/footer.pt:14
+msgid "privacy policy"
+msgstr ""
+
+#. Default: "site map"
+#: ./browser/footer.pt:8
+msgid "site map"
+msgstr ""
+
+#. Default: "terms of use"
+#: ./browser/footer.pt:12
+msgid "terms of use"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/eduCommons.pot
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/eduCommons.pot	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/eduCommons.pot	(revision 126)
@@ -0,0 +1,856 @@
+# --- PLEASE EDIT THE LINES BELOW CORRECTLY ---
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: en\n"
+"Language-Name: English\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: eduCommons\n"
+
+#: ./portlet/coursebuilderform.py:106
+msgid "(Choose one)"
+msgstr ""
+
+#: ./browser/controlpanel.py:43
+msgid "A descriptor that describes courses in your institution."
+msgstr ""
+
+#: ./browser/controlpanel.py:37
+msgid "A descriptor that describes how your academic institution is divided. Typically this will be 'Departments' or 'Divisions.'"
+msgstr ""
+
+#: ./browser/adaview.py:19
+msgid "ADA Compliant set to False"
+msgstr ""
+
+#: ./browser/adaview.py:16
+msgid "ADA Compliant set to True"
+msgstr ""
+
+#. Default: "About Page"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Page"
+msgstr ""
+
+#. Default: "About Professor"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Professor"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "About the Professor"
+msgstr ""
+
+#: ./browser/accessibilityview.py:20
+msgid "Accessibility Compliant set to False"
+msgstr ""
+
+#: ./browser/accessibilityview.py:17
+msgid "Accessibility Compliant set to True"
+msgstr ""
+
+#. Default: "Accessibility Status"
+#: ./skins/eduCommons/change_accessibility.cpt:79
+msgid "Accessibility Status"
+msgstr ""
+
+#. Default: "Accessibility process"
+#: ./skins/eduCommons/change_accessibility.cpt:26
+msgid "Accessibility process"
+msgstr ""
+
+#. Default: "Accessible"
+#: ./browser/accessibility_compliant.pt:14
+msgid "Accessible"
+msgstr ""
+
+#: ./browser/menu.py:245
+msgid "Advanced..."
+msgstr ""
+
+#: ./browser/controlpanel.py:52
+msgid "Allow Reuse Course Export"
+msgstr ""
+
+#. Default: "Apply Template"
+#: ./browser/menu.py:41
+msgid "Apply Template"
+msgstr ""
+
+#. Default: "Available Feeds"
+#: ./browser/rss_questions.pt:40
+msgid "Available Feeds"
+msgstr ""
+
+#: ./content/course.py:38
+msgid "Body Text"
+msgstr ""
+
+#. Default: "Build a Course"
+#: ./portlet/coursebuilder.pt:10
+msgid "Build a Course"
+msgstr ""
+
+#. Default: "Building a Course"
+#: ./skins/openocw/login_success.pt:91
+msgid "Building a Course"
+msgstr ""
+
+#. Default: "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+#: ./browser/rss_questions.pt:80
+msgid "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+msgstr ""
+
+#. Default: "Captcha"
+#: ./skins/eduCommons/join_form.cpt:231
+msgid "Captcha"
+msgstr ""
+
+#. Default: "Change Copyright"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Change Copyright"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:153
+msgid "Choose from the following templates:"
+msgstr ""
+
+#. Default: "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+#: ./skins/eduCommons/change_copyright.cpt:75
+msgid "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+msgstr ""
+
+#. Default: "Choose to set the accessibility flag, or revoke accessibility."
+#: ./skins/eduCommons/change_accessibility.cpt:80
+msgid "Choose to set the accessibility flag, or revoke accessibility."
+msgstr ""
+
+#. Default: "Clear Copyright"
+#: ./skins/eduCommons/change_copyright.cpt:88
+msgid "Clear Copyright"
+msgstr ""
+
+#. Default: "Cleared Copyright"
+#: ./browser/cc_table.pt:81
+msgid "Cleared Copyright"
+msgstr ""
+
+#. Default: "Click on the ${course-list-page} link to see what courses others are building."
+#: ./skins/openocw/login_success.pt:76
+msgid "Click on the ${course-list-page} link to see what courses others are building."
+msgstr ""
+
+#. Default: "Content View"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Content View"
+msgstr ""
+
+#. Default: "Content listing"
+#: ./browser/cc_table.pt:30
+msgid "Content listing"
+msgstr ""
+
+#: ./browser/copyrightview.py:17
+msgid "Copyright Cleared"
+msgstr ""
+
+#: ./browser/copyrightview.py:20
+msgid "Copyright Revoked"
+msgstr ""
+
+#. Default: "Copyright Status"
+#: ./skins/eduCommons/change_copyright.cpt:74
+msgid "Copyright Status"
+msgstr ""
+
+#. Default: "Copyright process"
+#: ./skins/eduCommons/change_copyright.cpt:26
+msgid "Copyright process"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:239
+msgid "Could not create course."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:227
+msgid "Could not create/find existing division."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Course"
+msgstr ""
+
+#. Default: "Course Builder"
+#: ./portlet/coursebuilder.pt:4
+msgid "Course Builder"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:45
+msgid "Course Builder Portlet"
+msgstr ""
+
+#: ./browser/controlpanel.py:42
+msgid "Course Descriptor"
+msgstr ""
+
+#: ./content/course.py:45
+msgid "Course ID"
+msgstr ""
+
+#: ./portlet/courseinfoportlet.py:18
+msgid "Course Info Portlet"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "Course Schedule"
+msgstr ""
+
+#. Default: "Course Summary"
+#: ./portlet/courseinfo.pt:5
+msgid "Course Summary"
+msgstr ""
+
+#: ./browser/packagecourseview.py:17
+msgid "Course has been packaged"
+msgstr ""
+
+#. Default: "Courses"
+#: ./browser/sorted_course_listing.pt:14
+msgid "Courses"
+msgstr ""
+
+#. Default: "Courses in all departments"
+#: ./browser/rss_questions.pt:53
+msgid "Courses in all departments"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:182
+msgid "Create a new course using the fields below."
+msgstr ""
+
+#: ./content/course.py:124
+msgid "Cross Listing(s)"
+msgstr ""
+
+#. Default: "Department Feeds"
+#: ./browser/rss_questions.pt:62
+msgid "Department Feeds"
+msgstr ""
+
+#: ./setupHandlers.py:335
+msgid "Departments"
+msgstr ""
+
+#. Default: "Different news readers work on different operating systems, so you will need to choose one that will work with your computer."
+#: ./browser/rss_questions.pt:101
+msgid "Different news readers work on different operating systems, so you will need to choose one that will work with your computer."
+msgstr ""
+
+#: ./content/course.py:105
+msgid "Display Instructor Email Address"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:138
+msgid "Division"
+msgstr ""
+
+#: ./browser/controlpanel.py:36
+msgid "Division Descriptor"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:82
+msgid "Division with the same title already exists."
+msgstr ""
+
+#. Default: "Download this course"
+#: ./portlet/reusecourse.pt:11
+msgid "Download this course"
+msgstr ""
+
+#: ./browser/controlpanel.py:48
+msgid "Enable the display of the OER Recommender Portlet for Course objects and sub-objects."
+msgstr ""
+
+#: ./browser/controlpanel.py:53
+msgid "Enable the display of the course export link for Course objects and sub-objects."
+msgstr ""
+
+#. Default: "Enter the text displayed below."
+#: ./skins/eduCommons/join_form.cpt:239
+msgid "Enter the text displayed below."
+msgstr ""
+
+#: ./browser/reusecourse.py:127
+msgid "Export a Course to OpenOCW"
+msgstr ""
+
+#. Default: "Export into OpenOCW"
+#: ./portlet/reusecourse.pt:18
+msgid "Export into OpenOCW"
+msgstr ""
+
+#. Default: "FAQ"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "FAQ"
+msgstr ""
+
+#: ./browser/feedbackform.py:75
+msgid "Feedback request failed."
+msgstr ""
+
+#. Default: "Flags"
+#: ./browser/cc_table.pt:75
+msgid "Flags"
+msgstr ""
+
+#. Default: "Flags:"
+#: ./browser/cc_table.pt:81
+msgid "Flags:"
+msgstr ""
+
+#. Default: "Front Page"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Front Page"
+msgstr ""
+
+#. Default: "Get Email List"
+#: ./skins/eduCommons/prefs_users_overview.cpt:96
+msgid "Get Email List"
+msgstr ""
+
+#: ./content/course.py:77
+msgid "Graduate"
+msgstr ""
+
+#. Default: "Here is one ${google-reader} of available readers from Google."
+#: ./browser/rss_questions.pt:104
+msgid "Here is one ${google-reader} of available readers from Google."
+msgstr ""
+
+#. Default: "How do I get a news reader?"
+#: ./browser/rss_questions.pt:97
+msgid "How do I get a news reader?"
+msgstr ""
+
+#. Default: "How to I start using RSS feeds?"
+#: ./browser/rss_questions.pt:82
+msgid "How to I start using RSS feeds?"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:159
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "If checked, eduCommons will attempt to change the accessibility status of all content in any selected folders and their subfolders.<br />"
+#: ./skins/eduCommons/change_accessibility.cpt:65
+msgid "If checked, eduCommons will attempt to change the accessibility status of all content in any selected folders and their subfolders.<br />"
+msgstr ""
+
+#. Default: "If checked, eduCommons will attempt to change the copyright status of all content in any selected folders and their subfolders.<br />"
+#: ./skins/eduCommons/change_copyright.cpt:60
+msgid "If checked, eduCommons will attempt to change the copyright status of all content in any selected folders and their subfolders.<br />"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:108
+msgid "If not found, type in the name below to create a new one:"
+msgstr ""
+
+#. Default: "If this is your first time logging into OpenOCW, please be sure to read the ${terms-of-use-page} page before you start using your account."
+#: ./skins/openocw/login_success.pt:71
+msgid "If this is your first time logging into OpenOCW, please be sure to read the ${terms-of-use-page} page before you start using your account."
+msgstr ""
+
+#. Default: "If you click on the button you can subscribe to the feed in various ways, including by dragging the URL of the RSS feed into your news reader or by cutting and pasting the same URL into a new feed in your news reader. Most sites that offer RSS feeds use a similar orange RSS button, but some may just have a normal web link to the feed."
+#: ./browser/rss_questions.pt:93
+msgid "If you click on the button you can subscribe to the feed in various ways, including by dragging the URL of the RSS feed into your news reader or by cutting and pasting the same URL into a new feed in your news reader. Most sites that offer RSS feeds use a similar orange RSS button, but some may just have a normal web link to the feed."
+msgstr ""
+
+#. Default: "Image of Document Actions"
+#: ./browser/rss_questions.pt:88
+msgid "Image of Document Actions"
+msgstr ""
+
+#. Default: "In general, the first thing you need is something called a news reader. This is a piece of software that checks RSS feeds and lets you read any new articles that have been added to them. There are many different versions, some of which are accessed using a browser, and some of which are downloadable applications. Browser-based news readers let you catch up with your RSS feed subscriptions from any computer, whereas downloadable applications let you store them on your main computer, in the same way that you either download your e-mail, or keep it on a web-based service."
+#: ./browser/rss_questions.pt:84
+msgid "In general, the first thing you need is something called a news reader. This is a piece of software that checks RSS feeds and lets you read any new articles that have been added to them. There are many different versions, some of which are accessed using a browser, and some of which are downloadable applications. Browser-based news readers let you catch up with your RSS feed subscriptions from any computer, whereas downloadable applications let you store them on your main computer, in the same way that you either download your e-mail, or keep it on a web-based service."
+msgstr ""
+
+#. Default: "In order to translate the content your were viewing into ${language} you must first translate the parent ${DYNAMIC_CONTENT} object into ${language}."
+#: ./skins/eduCommons/not_available_lang.pt:41
+msgid "In order to translate the content your were viewing into ${language} you must first translate the parent ${DYNAMIC_CONTENT} object into ${language}."
+msgstr ""
+
+#: ./content/course.py:97
+msgid "Instructor Email"
+msgstr ""
+
+#: ./content/course.py:88
+msgid "Instructor Name"
+msgstr ""
+
+#: ./content/course.py:113
+msgid "Instructor is Primary Author"
+msgstr ""
+
+#: ./browser/feedbackform.py:46
+msgid "Invalid email address"
+msgstr ""
+
+#: ./content/course.py:115
+msgid "Is the primary instructor also the primary author of the course materials?"
+msgstr ""
+
+#. Default: "Items should be copyright cleared before publication. This form allows for bulk copyright clearance, as well as bulk copyright revocation. To recursively change the copyright status, be sure to check the include folder items checkbox on the form below."
+#: ./skins/eduCommons/change_copyright.cpt:28
+msgid "Items should be copyright cleared before publication. This form allows for bulk copyright clearance, as well as bulk copyright revocation. To recursively change the copyright status, be sure to check the include folder items checkbox on the form below."
+msgstr ""
+
+#. Default: "Items should meet minimum accessibility requirements before publication. Please evaluate the content against the ${descr-accessibility-link}, and set the flag accordingly."
+#: ./skins/eduCommons/change_accessibility.cpt:30
+msgid "Items should meet minimum accessibility requirements before publication. Please evaluate the content against the ${descr-accessibility-link}, and set the flag accordingly."
+msgstr ""
+
+#: ./content/course.py:78
+msgid "Level"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:88
+msgid "Missing course name."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:72
+msgid "Missing division."
+msgstr ""
+
+#. Default: "My Courses"
+#: ./portlet/mycourses.pt:4
+msgid "My Courses"
+msgstr ""
+
+#: ./portlet/mycourses.py:41
+msgid "My Courses Portlet"
+msgstr ""
+
+#. Default: "Not Accessible"
+#: ./skins/eduCommons/change_accessibility.cpt:98
+msgid "Not Accessible"
+msgstr ""
+
+#: ./browser/controlpanel.py:47
+msgid "OER Recommender"
+msgstr ""
+
+#: ./portlet/oerrecommenderportlet.py:17
+msgid "OER Recommender Portlet"
+msgstr ""
+
+#. Default: "Once you are ready to build your course, it is recommended that you use the Course Builder. You can get there by using the above link, or by clicking on the link on the right-hand side of the page. This link will take you to a form which will help you set up the basic structure of the course. The course will remain hidden from public view until the course, and all objects in it, are set to 'published' status."
+#: ./skins/openocw/login_success.pt:93
+msgid "Once you are ready to build your course, it is recommended that you use the Course Builder. You can get there by using the above link, or by clicking on the link on the right-hand side of the page. This link will take you to a form which will help you set up the basic structure of the course. The course will remain hidden from public view until the course, and all objects in it, are set to 'published' status."
+msgstr ""
+
+#. Default: "Once you have chosen a news reader, all you have to do is to decide what content you want to receive in your news reader, by finding and subscribing to the relevant RSS feeds. For example, if you would like the latest courses added to ${portal_title} OCW, simply visit the Course List page or this page and you will notice an orange RSS button."
+#: ./browser/rss_questions.pt:86
+msgid "Once you have chosen a news reader, all you have to do is to decide what content you want to receive in your news reader, by finding and subscribing to the relevant RSS feeds. For example, if you would like the latest courses added to ${portal_title} OCW, simply visit the Course List page or this page and you will notice an orange RSS button."
+msgstr ""
+
+#. Default: "Order"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Order"
+msgstr ""
+
+#. Default: "Ordering tab"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Ordering tab"
+msgstr ""
+
+#: ./content/course.py:126
+msgid "Other Divisions that this Course should be listed in. To select multiple options, SHIFT click for adjacent items, or CTRL/CMD click for non-adjacent items."
+msgstr ""
+
+#. Default: "Package Course"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Package Course"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:163
+msgid "Package Type"
+msgstr ""
+
+#. Default: "Privacy Policy"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Privacy Policy"
+msgstr ""
+
+#: ./browser/localroles.py:12
+msgid "Producer"
+msgstr ""
+
+#: ./browser/localroles.py:24
+msgid "Publisher"
+msgstr ""
+
+#. Default: "QA"
+#: ./browser/localroles.py:18
+msgid "QA"
+msgstr ""
+
+#. Default: "RSS Feed"
+#: ./skins/eduCommons/search.pt:55
+msgid "RSS Feed"
+msgstr ""
+
+#. Default: "RSS feed of these search results"
+#: ./skins/eduCommons/search.pt:55
+msgid "RSS feed of these search results"
+msgstr ""
+
+#. Default: "RSS stands for Really Simple Syndication. RSS is a time-saving way for you to receive news and information updates (often called 'RSS feeds', 'news feeds' or simply 'feeds') from your favorite Web sites and blogs."
+#: ./browser/rss_questions.pt:74
+msgid "RSS stands for Really Simple Syndication. RSS is a time-saving way for you to receive news and information updates (often called 'RSS feeds', 'news feeds' or simply 'feeds') from your favorite Web sites and blogs."
+msgstr ""
+
+#. Default: "Read ${documentation-page} on how to build a course."
+#: ./skins/openocw/login_success.pt:86
+msgid "Read ${documentation-page} on how to build a course."
+msgstr ""
+
+#. Default: "Receive notification of new ${portal_title} OCW courses on your desktop, or add them to your blog or website."
+#: ./browser/rss_questions.pt:37
+msgid "Receive notification of new ${portal_title} OCW courses on your desktop, or add them to your blog or website."
+msgstr ""
+
+#. Default: "Relevance"
+#: ./skins/eduCommons/search.pt:83
+msgid "Relevance"
+msgstr ""
+
+#. Default: "Remove from navigation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Remove from navigation"
+msgstr ""
+
+#. Default: "Report Content"
+#: ./profiles/openocw/actionicons.xml
+#: ./profiles/openocw/actions.xml
+msgid "Report Content"
+msgstr ""
+
+#: ./browser/reportcontentform.py:82
+msgid "Report Content request failed."
+msgstr ""
+
+#. Default: "Return to Top"
+#: ./browser/rss_questions.pt:111
+msgid "Return to Top"
+msgstr ""
+
+#: ./browser/reusecourse.py:134
+msgid "Reuse"
+msgstr ""
+
+#. Default: "Reuse Course"
+#: ./portlet/reusecourse.pt:5
+msgid "Reuse Course"
+msgstr ""
+
+#: ./browser/controlpanel.py:58
+msgid "Reuse Course Portal"
+msgstr ""
+
+#: ./browser/reusecourse.py:128
+msgid "Reuse this course on OpenOCW. In order to do so, you must have an account at OpenOCW.org."
+msgstr ""
+
+#. Default: "Revoke Copyright"
+#: ./skins/eduCommons/change_copyright.cpt:99
+msgid "Revoke Copyright"
+msgstr ""
+
+#. Default: "S5 Presentation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "S5 Presentation"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:107
+msgid "Select from below:"
+msgstr ""
+
+#. Default: "Set cleared copyright if content object has been correctly licensed from the author, and is free from copyright violations."
+#: ./browser/clear_copyright.pt:19
+msgid "Set cleared copyright if content object has been correctly licensed from the author, and is free from copyright violations."
+msgstr ""
+
+#. Default: "Set the accessibility flag if your content meets the criteria outlined ${link_accessibility}."
+#: ./browser/accessibility_compliant.pt:23
+msgid "Set the accessibility flag if your content meets the criteria outlined ${link_accessibility}."
+msgstr ""
+
+#. Default: "Set the accessibility flag if your content meets the criteria outlined *LINK HERE*"
+#: ./browser/ada_compliant.pt:19
+msgid "Set the accessibility flag if your content meets the criteria outlined *LINK HERE*"
+msgstr ""
+
+#: ./browser/controlpanel.py:117
+msgid "Settings which control how eduCommons looks and functions."
+msgstr ""
+
+#: ./content/course.py:107
+msgid "Should the primary instructor's Email address be publically displayed?"
+msgstr ""
+
+#. Default: "Show in navigation"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Show in navigation"
+msgstr ""
+
+#. Default: "Some browsers, including Firefox and Safari, automatically check for RSS feeds for you when you visit a Web site, and display an icon when they find one. This can make subscribing to RSS feeds much easier. For more details on these, please check their Web sites."
+#: ./browser/rss_questions.pt:95
+msgid "Some browsers, including Firefox and Safari, automatically check for RSS feeds for you when you visit a Web site, and display an icon when they find one. This can make subscribing to RSS feeds much easier. For more details on these, please check their Web sites."
+msgstr ""
+
+#: ./content/course.py:66
+msgid "Structure"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "Syllabus"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:152
+msgid "Templates"
+msgstr ""
+
+#: ./browser/menu.py:42
+msgid "Templates for the current content item."
+msgstr ""
+
+#: ./content/course.py:54
+msgid "Term"
+msgstr ""
+
+#. Default: "Terms of Use"
+#: ./skins/openocw/login_success.pt:71
+msgid "Terms of Use"
+msgstr ""
+
+#: ./browser/controlpanel.py:59
+msgid "The URL to the eduCommons instance utilized by the Reuse Course portlet."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:145
+msgid "The course identifier or catalog number."
+msgstr ""
+
+#: ./content/course.py:47
+msgid "The course identifier or catalog number. Also can be used to sequence courses (1.0, 2.0, etc)."
+msgstr ""
+
+#: ./content/course.py:99
+msgid "The email address of the primary instructor teaching this course."
+msgstr ""
+
+#: ./content/course.py:80
+msgid "The level at which the course is taught."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:160
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./content/course.py:90
+msgid "The name of the primary instructor teaching this course."
+msgstr ""
+
+#: ./browser/reusecourse.py:94
+msgid "The remote site is unavailable of configured incorrectly. Please contact an administrator."
+msgstr ""
+
+#: ./content/course.py:68
+msgid "The structure of the course."
+msgstr ""
+
+#: ./content/course.py:56
+msgid "The term the course was taught in."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:164
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "There is a range of different news readers available and new versions are appearing all the time."
+#: ./browser/rss_questions.pt:99
+msgid "There is a range of different news readers available and new versions are appearing all the time."
+msgstr ""
+
+#: ./skins/eduCommons/validate_join_form_captcha.vpy:19
+msgid "This field is required, please enter the word below."
+msgstr ""
+
+#. Default: "To start building a new course, use the ${build-a-course-page} link that appears to the right of any page."
+#: ./skins/openocw/login_success.pt:80
+msgid "To start building a new course, use the ${build-a-course-page} link that appears to the right of any page."
+msgstr ""
+
+#. Default: "Total Objects: ${total}"
+#: ./portlet/courseinfo.pt:39
+msgid "Total Objects: ${total}"
+msgstr ""
+
+#: ./browser/translate.py:63
+msgid "Translated created."
+msgstr ""
+
+#: ./browser/translate.py:52
+msgid "Translation already exists"
+msgstr ""
+
+#. Default: "Typically RSS feeds consist of headlines and short summaries of new articles, blog entries or search results, though some Web sites and blogs offer the full text of articles or blog entrees as feeds."
+#: ./browser/rss_questions.pt:76
+msgid "Typically RSS feeds consist of headlines and short summaries of new articles, blog entries or search results, though some Web sites and blogs offer the full text of articles or blog entrees as feeds."
+msgstr ""
+
+#: ./content/course.py:77
+msgid "Undergraduate"
+msgstr ""
+
+#. Default: "Use this action to report inappropriate content to the site administrator."
+#: ./profiles/openocw/actions.xml
+msgid "Use this action to report inappropriate content to the site administrator."
+msgstr ""
+
+#: ./browser/localroles.py:30
+msgid "Viewer"
+msgstr ""
+
+#: ./browser/feedbackform.py:55
+msgid "We appreciate your feedback. If you find this site useful, or think it could be better, or are having problems using it, please feel free to use the form below to let us know about it."
+msgstr ""
+
+#. Default: "Welcome to OpenOCW"
+#: ./skins/openocw/login_success.pt:63
+msgid "Welcome to OpenOCW"
+msgstr ""
+
+#. Default: "Welcome to OpenOCW! Here are some things you may want to do:"
+#: ./skins/openocw/login_success.pt:64
+msgid "Welcome to OpenOCW! Here are some things you may want to do:"
+msgstr ""
+
+#. Default: "What is RSS?"
+#: ./browser/rss_questions.pt:72
+msgid "What is RSS?"
+msgstr ""
+
+#. Default: "Why use RSS?"
+#: ./browser/rss_questions.pt:78
+msgid "Why use RSS?"
+msgstr ""
+
+#: ./browser/reusecourse.py:112
+msgid "Your user name on OpenOCW"
+msgstr ""
+
+#: ./browser/reusecourse.py:116
+msgid "Your user password on OpenOCW"
+msgstr ""
+
+#. Default: "[audio]"
+#: ./skins/eduCommons/join_form.cpt:257
+msgid "[audio]"
+msgstr ""
+
+#. Default: "accessibility"
+#: ./browser/footer.pt:10
+msgid "accessibility"
+msgstr ""
+
+#. Default: "accessibility guidelines"
+#: ./skins/eduCommons/change_accessibility.cpt:31
+msgid "accessibility guidelines"
+msgstr ""
+
+#. Default: "courses"
+#: ./skins/openocw/login_success.pt:76
+msgid "courses"
+msgstr ""
+
+#. Default: "documentation"
+#: ./skins/openocw/login_success.pt:86
+msgid "documentation"
+msgstr ""
+
+#. Default: "eduCommons"
+#: ./profiles/default/actionicons.xml
+#: ./profiles/openocw/actionicons.xml
+msgid "eduCommons"
+msgstr ""
+
+#: ./portlet/simplenavportlet.py:44
+msgid "eduCommons Navigation"
+msgstr ""
+
+#: ./browser/controlpanel.py:116
+msgid "eduCommons Settings"
+msgstr ""
+
+#. Default: "feedback"
+#: ./browser/footer.pt:6
+msgid "feedback"
+msgstr ""
+
+#. Default: "here"
+#: ./browser/accessibility_compliant.pt:24
+msgid "here"
+msgstr ""
+
+#. Default: "list"
+#: ./browser/rss_questions.pt:104
+msgid "list"
+msgstr ""
+
+#. Default: "powered by eduCommons"
+#: ./browser/footer.pt:16
+msgid "powered by eduCommons"
+msgstr ""
+
+#. Default: "privacy policy"
+#: ./browser/footer.pt:14
+msgid "privacy policy"
+msgstr ""
+
+#. Default: "site map"
+#: ./browser/footer.pt:8
+msgid "site map"
+msgstr ""
+
+#. Default: "terms of use"
+#: ./browser/footer.pt:12
+msgid "terms of use"
+msgstr ""
+
Index: /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/en/LC_MESSAGES/eduCommons.po
===================================================================
--- /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/en/LC_MESSAGES/eduCommons.po	(revision 126)
+++ /enpraxis.educommons/tags/3.2.0-pre/enpraxis/educommons/locales/en/LC_MESSAGES/eduCommons.po	(revision 126)
@@ -0,0 +1,856 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-03 22:26+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI +ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+"Language-Code: en\n"
+"Language-Name: English\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: eduCommons\n"
+
+#: ./portlet/coursebuilderform.py:106
+msgid "(Choose one)"
+msgstr ""
+
+#: ./browser/controlpanel.py:43
+msgid "A descriptor that describes courses in your institution."
+msgstr ""
+
+#: ./browser/controlpanel.py:37
+msgid "A descriptor that describes how your academic institution is divided. Typically this will be 'Departments' or 'Divisions.'"
+msgstr ""
+
+#: ./browser/adaview.py:19
+msgid "ADA Compliant set to False"
+msgstr ""
+
+#: ./browser/adaview.py:16
+msgid "ADA Compliant set to True"
+msgstr ""
+
+#. Default: "About Page"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Page"
+msgstr ""
+
+#. Default: "About Professor"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "About Professor"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:74
+msgid "About the Professor"
+msgstr ""
+
+#: ./browser/accessibilityview.py:20
+msgid "Accessibility Compliant set to False"
+msgstr ""
+
+#: ./browser/accessibilityview.py:17
+msgid "Accessibility Compliant set to True"
+msgstr ""
+
+#. Default: "Accessibility Status"
+#: ./skins/eduCommons/change_accessibility.cpt:79
+msgid "Accessibility Status"
+msgstr ""
+
+#. Default: "Accessibility process"
+#: ./skins/eduCommons/change_accessibility.cpt:26
+msgid "Accessibility process"
+msgstr ""
+
+#. Default: "Accessible"
+#: ./browser/accessibility_compliant.pt:14
+msgid "Accessible"
+msgstr ""
+
+#: ./browser/menu.py:245
+msgid "Advanced..."
+msgstr ""
+
+#: ./browser/controlpanel.py:52
+msgid "Allow Reuse Course Export"
+msgstr ""
+
+#. Default: "Apply Template"
+#: ./browser/menu.py:41
+msgid "Apply Template"
+msgstr ""
+
+#. Default: "Available Feeds"
+#: ./browser/rss_questions.pt:40
+msgid "Available Feeds"
+msgstr ""
+
+#: ./content/course.py:38
+msgid "Body Text"
+msgstr ""
+
+#. Default: "Build a Course"
+#: ./portlet/coursebuilder.pt:10
+msgid "Build a Course"
+msgstr ""
+
+#. Default: "Building a Course"
+#: ./skins/openocw/login_success.pt:91
+msgid "Building a Course"
+msgstr ""
+
+#. Default: "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+#: ./browser/rss_questions.pt:80
+msgid "By using RSS you can stay on top of the news and information you need without using your e-mail system and without repeatedly checking multiple Web sites to see if they have been updated. RSS simplifies the way you stay informed and helps you take control of overloaded email inboxes."
+msgstr ""
+
+#. Default: "Captcha"
+#: ./skins/eduCommons/join_form.cpt:231
+msgid "Captcha"
+msgstr ""
+
+#. Default: "Change Copyright"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Change Copyright"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:153
+msgid "Choose from the following templates:"
+msgstr ""
+
+#. Default: "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+#: ./skins/eduCommons/change_copyright.cpt:75
+msgid "Choose to clear copyright, or revoke copyright for the item(s) selected above."
+msgstr ""
+
+#. Default: "Choose to set the accessibility flag, or revoke accessibility."
+#: ./skins/eduCommons/change_accessibility.cpt:80
+msgid "Choose to set the accessibility flag, or revoke accessibility."
+msgstr ""
+
+#. Default: "Clear Copyright"
+#: ./skins/eduCommons/change_copyright.cpt:88
+msgid "Clear Copyright"
+msgstr ""
+
+#. Default: "Cleared Copyright"
+#: ./browser/cc_table.pt:81
+msgid "Cleared Copyright"
+msgstr ""
+
+#. Default: "Click on the ${course-list-page} link to see what courses others are building."
+#: ./skins/openocw/login_success.pt:76
+msgid "Click on the ${course-list-page} link to see what courses others are building."
+msgstr ""
+
+#. Default: "Content View"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Content View"
+msgstr ""
+
+#. Default: "Content listing"
+#: ./browser/cc_table.pt:30
+msgid "Content listing"
+msgstr ""
+
+#: ./browser/copyrightview.py:17
+msgid "Copyright Cleared"
+msgstr ""
+
+#: ./browser/copyrightview.py:20
+msgid "Copyright Revoked"
+msgstr ""
+
+#. Default: "Copyright Status"
+#: ./skins/eduCommons/change_copyright.cpt:74
+msgid "Copyright Status"
+msgstr ""
+
+#. Default: "Copyright process"
+#: ./skins/eduCommons/change_copyright.cpt:26
+msgid "Copyright process"
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:239
+msgid "Could not create course."
+msgstr ""
+
+#: ./portlet/coursebuilderform.py:227
+msgid "Could not create/find existing division."
+msgstr ""
+
+#. Default: "Course"
+#: ./profiles/default/actions.xml
+#: ./profiles/openocw/actions.xml
+msgid "Course"
+msgstr ""
+
+#. Default: "Course Builder"
+#: ./portlet/coursebuilder.pt:4
+msgid "Course Builder"
+msgstr ""
+
+#: ./portlet/coursebuilder.py:45
+msgid "Course Builder Portlet"
+msgstr ""
+
+#: ./brows