Index: /3.2/collective.imstransport.orig/tags/2.1.0/README.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/README.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/README.txt	(revision 712)
@@ -0,0 +1,4 @@
+Introduction
+============
+
+placeholder text
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/PKG-INFO
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/PKG-INFO	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/PKG-INFO	(revision 712)
@@ -0,0 +1,27 @@
+Metadata-Version: 1.0
+Name: collective.imstransport
+Version: 2.1.0dev-r77997
+Summary: An AddOn that supports importing and exporting of IMS content packages.
+Home-page: http://plone.org/products/ims-transport/t
+Author: enPraxis
+Author-email: info@enpraxis.net
+License: GPL
+Description: Introduction
+        ============
+        
+        placeholder text
+        
+        Changelog
+        =========
+        
+        2.1.0 - Unreleased
+        ----------------
+        
+        * Initial release
+        
+        
+Keywords: IMS Package import export
+Platform: UNKNOWN
+Classifier: Framework :: Plone
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/SOURCES.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/SOURCES.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/SOURCES.txt	(revision 712)
@@ -0,0 +1,97 @@
+README.txt
+setup.cfg
+setup.py
+collective/__init__.py
+collective.imstransport.egg-info/PKG-INFO
+collective.imstransport.egg-info/SOURCES.txt
+collective.imstransport.egg-info/dependency_links.txt
+collective.imstransport.egg-info/entry_points.txt
+collective.imstransport.egg-info/namespace_packages.txt
+collective.imstransport.egg-info/not-zip-safe
+collective.imstransport.egg-info/requires.txt
+collective.imstransport.egg-info/top_level.txt
+collective/imstransport/IMS_exceptions.py
+collective/imstransport/INSTALL.txt
+collective/imstransport/Manifest.py
+collective/imstransport/ManifestEvents.py
+collective/imstransport/ManifestHandlers.py
+collective/imstransport/README.txt
+collective/imstransport/TransformHandlers.py
+collective/imstransport/__init__.py
+collective/imstransport/config.py
+collective/imstransport/configure.zcml
+collective/imstransport/interfaces.py
+collective/imstransport/refresh.txt
+collective/imstransport/setupHandlers.py
+collective/imstransport/tool.gif
+collective/imstransport/version.txt
+collective/imstransport/IMS/Angel_import_xform.xsl
+collective/imstransport/IMS/Blackboard_content_import_xform.xsl
+collective/imstransport/IMS/Blackboard_import_xform.xsl
+collective/imstransport/IMS/MITDspace_import_xform.xsl
+collective/imstransport/IMS/WebCT_glossary_xform.xsl
+collective/imstransport/IMS/WebCT_image_xform.xsl
+collective/imstransport/IMS/WebCT_import_xform.xsl
+collective/imstransport/IMS/eXe_import_xform.xsl
+collective/imstransport/IMS/imscp_v1p2.xsd
+collective/imstransport/IMS/imsmd_v1p2p4.xsd
+collective/imstransport/browser/__init__.py
+collective/imstransport/browser/configure.zcml
+collective/imstransport/browser/imschoice.pt
+collective/imstransport/browser/imstransportform.py
+collective/imstransport/i18n/plone-ca.po
+collective/imstransport/i18n/plone-de.po
+collective/imstransport/i18n/plone-es.po
+collective/imstransport/i18n/plone-fr.po
+collective/imstransport/i18n/plone-ja.po
+collective/imstransport/i18n/plone-nl.po
+collective/imstransport/i18n/plone-tr.po
+collective/imstransport/i18n/plone-zh-cn.po
+collective/imstransport/i18n/plone-zh-hk.po
+collective/imstransport/i18n/plone-zh-tw.po
+collective/imstransport/i18n/plone.pot
+collective/imstransport/locales/IMSTransport.pot
+collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po
+collective/imstransport/profiles/default/actions.xml
+collective/imstransport/profiles/default/import_steps.xml
+collective/imstransport/profiles/default/propertiestool.xml
+collective/imstransport/tests/BBTest.zip
+collective/imstransport/tests/IMS_Sample_Course.zip
+collective/imstransport/tests/WebCTTest.zip
+collective/imstransport/tests/__init__.py
+collective/imstransport/tests/base.py
+collective/imstransport/tests/framework.py
+collective/imstransport/tests/testIMSImport.py
+collective/imstransport/tests/testIMSexport.py
+collective/imstransport/utilities/__init__.py
+collective/imstransport/utilities/configure.zcml
+collective/imstransport/utilities/interfaces.py
+collective/imstransport/utilities/utils.py
+collective/imstransport/www/IMS_transport_form.zpt
+collective/imstransport/www/overview.zpt
+collective/imstransport/www/tableofcontents.zpt
+docs/HISTORY.txt
+docs/INSTALL.txt
+docs/LICENSE.GPL
+docs/LICENSE.txt
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/dependency_links.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/dependency_links.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/dependency_links.txt	(revision 712)
@@ -0,0 +1,1 @@
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/entry_points.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/entry_points.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/entry_points.txt	(revision 712)
@@ -0,0 +1,3 @@
+
+      # -*- Entry points: -*-
+      
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/namespace_packages.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/namespace_packages.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/namespace_packages.txt	(revision 712)
@@ -0,0 +1,1 @@
+collective
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/not-zip-safe
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/not-zip-safe	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/not-zip-safe	(revision 712)
@@ -0,0 +1,1 @@
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/requires.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/requires.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/requires.txt	(revision 712)
@@ -0,0 +1,1 @@
+setuptools
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/top_level.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/top_level.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective.imstransport.egg-info/top_level.txt	(revision 712)
@@ -0,0 +1,1 @@
+collective
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/__init__.py	(revision 712)
@@ -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: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Angel_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Angel_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Angel_import_xform.xsl	(revision 712)
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+   
+    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+        xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+        xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+        xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
+        xmlns:lom="http://ocw.mit.edu/xmlns/LOM"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+        xmlns:cwsp="http://www.dspace.org/xmlns/cwspace_imscp"
+        xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
+        xmlns:ocw="http://ocw.mit.edu/xmlns/ocw_imscp"
+        version="1.0">   
+    
+    
+    
+    <xsl:output method="xml" indent="yes" />
+        
+    <xsl:template match="/">
+        <manifest 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">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>        
+    </xsl:template>
+    
+        <xsl:template match="manifest/organizations">
+            <organizations>
+                <xsl:attribute name="default">     
+                    <xsl:value-of select="@default"/>
+                </xsl:attribute>
+                <xsl:apply-templates/>
+            </organizations>
+        </xsl:template>       
+
+        <xsl:template match="organization">
+            <organization>
+                <xsl:attribute name="identifier">
+                    <xsl:value-of select = "@identifier" />
+                </xsl:attribute>
+                <xsl:apply-templates/>
+            </organization>
+        </xsl:template>        
+        
+        <xsl:template match="title">
+            <title>
+                <xsl:value-of select="."/>
+            </title>
+        </xsl:template>
+        
+        <xsl:template match="item">
+            <item>
+                <xsl:variable name="identifierref" select="@identifierref"/>
+                <xsl:variable name="resource" select="/manifest/resources//resource[@identifier=$identifierref]/@href"/>
+                <xsl:variable name="ext" select="substring-after($resource,'.')"/>
+                
+                <xsl:attribute name="identifier">
+                    <xsl:value-of select = "@identifier" />
+                </xsl:attribute>
+                <xsl:attribute name="identifierref">
+                    <xsl:value-of select = "$identifierref" />
+                    <xsl:value-of select="concat('.',$ext)"/>                    
+                </xsl:attribute>
+                <xsl:attribute name="isvisible">
+                     <xsl:text>true</xsl:text>
+                 </xsl:attribute>
+                <xsl:apply-templates/>
+            </item>
+        </xsl:template>
+        
+        <xsl:template match="resources">
+            <resources>
+                <xsl:apply-templates />
+            </resources>   
+        </xsl:template>
+        
+        <xsl:template match="resource">
+            <resource>
+                
+                
+                <xsl:variable name="identifier" select="@identifier"/>
+                <xsl:variable name="title" select="/manifest/organizations//item[@identifierref=$identifier]/title"/>
+                
+                <xsl:attribute name="identifier">
+                    <xsl:value-of select="concat(@identifier,'.',substring-after(@href,'.'))"/>
+                </xsl:attribute>
+                <xsl:attribute name="href">
+                    <xsl:value-of select="@href"/>
+                </xsl:attribute>
+                <xsl:attribute name="type">
+                    <xsl:value-of select="@type"/>
+                </xsl:attribute>
+                
+                <metadata>
+                    <imsmd:lom>
+                        <imsmd:general>
+                            <imsmd:title>
+                                <imsmd:langstring xml:lang="en">
+                                           <xsl:value-of select="$title"/>
+                                </imsmd:langstring>
+                            </imsmd:title>
+                        </imsmd:general>
+                        <imsmd:technical>
+                            
+                        </imsmd:technical>
+                    </imsmd:lom>
+                    <eduCommons:eduCommons>
+                        <xsl:if test="$title='Welcome'">
+                            <eduCommons:objectType>
+                                Course
+                            </eduCommons:objectType>
+                        </xsl:if>
+                        <eduCommons:license category="Site Default"/>
+                        <eduCommons:clearedCopyright>true</eduCommons:clearedCopyright>
+                    </eduCommons:eduCommons>
+                </metadata>
+                
+                
+                
+                <xsl:apply-templates select="file" />
+            </resource>
+        </xsl:template>
+        
+
+        <xsl:template match="file">
+            <file>
+                <xsl:attribute name="href">
+                    <xsl:value-of select="translate(@href,'\','/')"/>
+                </xsl:attribute>
+            </file>
+        </xsl:template>
+        
+        
+        
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Blackboard_content_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Blackboard_content_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Blackboard_content_import_xform.xsl	(revision 712)
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+    
+    <xsl:output method="html" indent="yes"/>
+    
+    <xsl:template match="/CONTENT">
+        <xsl:variable name="content_type" select="CONTENTHANDLER/@value"/>
+        <xsl:choose>
+            <xsl:when test="$content_type = 'resource/x-bb-document' or $content_type = 'resource/x-bb-assignment'">
+                <xsl:value-of select="BODY/TEXT" disable-output-escaping="yes"/>
+                <p>
+                    <xsl:apply-templates select="FILES/FILE"/>
+                </p>
+            </xsl:when>
+            <xsl:when test="$content_type = 'resource/x-bb-externallink'">
+                <p>
+                    <a>
+                        <xsl:attribute name="href">
+                            <xsl:value-of select="URL/@value"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="title">
+                            <xsl:value-of select="TITLE/@value"/>
+                        </xsl:attribute>
+                        <xsl:value-of select="TITLE/@value"/>
+                    </a>
+                </p>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+    
+    <xsl:template match="FILE">
+        <a>
+            <xsl:attribute name="href">
+                <xsl:text>@X@LOCALFOLDERLOCATION@X@/</xsl:text>
+                <xsl:value-of select="NAME"/>
+            </xsl:attribute>
+            <xsl:attribute name="title">
+                <xsl:value-of select="LINKNAME/@value"/>
+            </xsl:attribute>
+            <xsl:value-of select="LINKNAME/@value"/>
+        </a><br />    
+    </xsl:template>
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Blackboard_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Blackboard_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/Blackboard_import_xform.xsl	(revision 712)
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+    version="1.0"
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
+    xmlns:bb="http://www.blackboard.com/content-packaging/">
+    
+    <xsl:output method="xml" indent="yes"/>
+    
+    <xsl:template match="/">
+        <manifest xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p4.xsd http://cosl.usu.edu/xsd/eduCommonsv1.2 http://cosl.usu.edu/xsd/educommonsv1.2.xsd">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>
+    </xsl:template>
+    
+    <xsl:template match="organizations">
+        <organizations>
+            <xsl:apply-templates/>
+        </organizations>
+    </xsl:template>
+    
+    <xsl:template match="organization">
+        <organization>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </organization>
+    </xsl:template>
+    
+    <xsl:template match="organization/item">
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:attribute name="isvisible">
+                <xsl:text>true</xsl:text>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+    
+    <xsl:template match="item">
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+    
+    <xsl:template match="title">
+        <title>
+            <xsl:value-of select="."/>
+        </title>
+    </xsl:template>
+    
+    <xsl:template match="resources">
+        <resources>
+            <xsl:apply-templates select="resource"/>
+        </resources>
+    </xsl:template>
+    
+    <xsl:template match="resource">
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:variable name="title" select="/manifest/organizations//item[@identifierref=$identifier]/title"/>
+        <xsl:variable name="visible" select="/manifest/organizations//item[@identifierref=$identifier]"/>
+        <xsl:variable name="resid" select="@identifier"/>
+        <xsl:variable name="restype" select="@type"/>
+        <xsl:variable name="resbase" select="concat(@xml:base, '/')"/>
+        <xsl:variable name="docfilename" select="concat(@xml:base, '.html')"/>
+        <xsl:choose>
+            <xsl:when test="$restype='resource/x-bb-document' or $visible">
+                <resource>
+                    <xsl:attribute name="identifier">
+                        <xsl:choose>
+                            <xsl:when test="$visible">
+                                <xsl:value-of select="$identifier"/>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:value-of select="generate-id()"/>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:attribute>
+                    <xsl:attribute name="type">
+                        <xsl:text>webcontent</xsl:text>
+                    </xsl:attribute>
+                    <metadata>
+                        <imsmd:lom>
+                            <imsmd:general>
+                                <imsmd:title>
+                                    <imsmd:langstring xml:base="en">
+                                        <xsl:value-of select="$title"/>
+                                    </imsmd:langstring>
+                                </imsmd:title>
+                            </imsmd:general>
+                        </imsmd:lom>
+                    </metadata>
+                    <file>
+                        <xsl:attribute name="href">
+                            <xsl:value-of select="$docfilename"/>
+                        </xsl:attribute>
+                    </file>
+                </resource>
+            </xsl:when>
+        </xsl:choose>
+        <xsl:choose>
+            <xsl:when test="file">
+                <xsl:for-each select="file">
+                    <xsl:variable name="pos">
+                        <xsl:number value="position()" format="1"/>
+                    </xsl:variable>
+                    <resource>
+                        <xsl:choose>
+                            <xsl:when test="$pos=1">
+                                <xsl:attribute name="identifier">
+                                    <xsl:value-of select="$resid"/>
+                                </xsl:attribute>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:attribute name="identifier">
+                                    <xsl:value-of select="generate-id()"/>
+                                </xsl:attribute>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                        <xsl:attribute name="type">
+                            <xsl:value-of select="$restype"/>
+                        </xsl:attribute>
+                        <metadata>
+                            <imsmd:lom>
+                                <imsmd:general>
+                                    <imsmd:title>
+                                        <imsmd:langstring xml:lang="en">
+                                            <xsl:choose>
+                                                <xsl:when test="$title">
+                                                    <xsl:value-of select="$title"/>
+                                                </xsl:when>
+                                                <xsl:otherwise>
+                                                    <xsl:value-of select="@href"/>
+                                                </xsl:otherwise>
+                                            </xsl:choose>
+                                        </imsmd:langstring>
+                                    </imsmd:title>
+                                </imsmd:general>    
+                            </imsmd:lom>
+                        </metadata>
+                        <file>
+                            <xsl:attribute name="href">
+                                <xsl:value-of select="concat($resbase, translate(@href, '\', '/'))"/>
+                            </xsl:attribute>
+                        </file>
+                    </resource>
+                </xsl:for-each>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/MITDspace_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/MITDspace_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/MITDspace_import_xform.xsl	(revision 712)
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2" xmlns:lom="http://ocw.mit.edu/xmlns/LOM"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:cwsp="http://www.dspace.org/xmlns/cwspace_imscp"
+    xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
+    xmlns:ocw="http://ocw.mit.edu/xmlns/ocw_imscp"
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2" version="1.0">
+
+    <xsl:output method="xml" indent="yes"/>
+
+    <xsl:template match="/">
+        <manifest
+            xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p4.xsd">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="imscp:manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>
+    </xsl:template>
+
+    <xsl:template match="imscp:manifest/imscp:metadata">
+        <metadata>
+            <schema>IMS Content</schema>
+            <schemaversion>1.2</schemaversion>
+        </metadata>
+    </xsl:template>
+
+    <xsl:template match="imscp:manifest/imscp:organizations">
+        <organizations>
+            <xsl:attribute name="default">
+                <xsl:value-of select="concat('ORG',@default)"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </organizations>
+    </xsl:template>
+
+    <xsl:template match="imscp:organization">
+        <organization>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="concat('ORG',@identifier    )"/>
+            </xsl:attribute>
+            <xsl:apply-templates select="imscp:item"/>
+        </organization>
+    </xsl:template>
+
+    <xsl:template match="imscp:title">
+        <title>
+            <xsl:value-of select="."/>
+        </title>
+    </xsl:template>
+
+    <xsl:template match="imscp:item">
+        <xsl:if test="@ocw:sectionTemplateType = 'CourseHomePage' ">
+            <item identifier="indexitem" identifierref="index">
+                <xsl:apply-templates select="imscp:title"/>
+            </item>
+        </xsl:if>
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="concat('ITM',generate-id())"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:choose>
+                <xsl:when test="@ocw:sectionTemplateType and (@ocw:sectionTemplateType != '')">
+                    <xsl:attribute name="isvisible">
+                        <xsl:text>true</xsl:text>
+                    </xsl:attribute>
+                </xsl:when>
+            </xsl:choose>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+
+    <xsl:template match="imscp:resources">
+        <resources> 
+            <xsl:apply-templates select="imscp:resource"/>
+        </resources>
+    </xsl:template>
+
+
+    <xsl:template match="imscp:resource">
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:if test="/imscp:manifest/imscp:organizations//imscp:item[@identifierref=$identifier]/@ocw:sectionTemplateType = 'CourseHomePage' ">
+            <resource identifier="index" type="webcontent">
+                <metadata>
+                    <imsmd:lom>
+                        <imsmd:general>
+                            <imsmd:identifier>index</imsmd:identifier>
+                            <imsmd:title>
+                                <imsmd:langstring xml:lang="x-none">
+                                    <xsl:value-of select="imscp:metadata/lom:lom/lom:general/lom:title"/>
+                                 </imsmd:langstring>
+                            </imsmd:title>
+                        </imsmd:general>
+                    </imsmd:lom>
+                    <eduCommons:eduCommons>
+                        <eduCommons:objectType>Course</eduCommons:objectType>
+                        <eduCommons:license category="Site Default"/>
+                        <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                        <eduCommons:accessible>false</eduCommons:accessible>
+                    </eduCommons:eduCommons>
+                </metadata>
+                <file href="index.html"/>
+            </resource>
+        </xsl:if>
+        <xsl:apply-templates select="imscp:file"/>
+    </xsl:template>
+    
+    
+    <xsl:template match="imscp:file">
+        <xsl:variable name="identifier" select="../@identifier"/>
+        <xsl:variable name="filecount" select="count(../imscp:file)"/>
+        <xsl:variable name="home" select="/imscp:manifest/imscp:organizations//imscp:item[@identifierref=$identifier]/@ocw:sectionTemplateType"/>
+        <xsl:variable name="restype" select="../@type"/>
+        <xsl:variable name="reshref" select="../@href"/>
+        <xsl:variable name="title" select="../imscp:metadata/lom:lom/lom:general/lom:title"/>
+        
+        <xsl:variable name="fidentifier">
+            <xsl:choose>
+                <xsl:when test="$filecount > 1 and not ($reshref = @href)">
+                    <xsl:value-of select="concat($identifier,generate-id())"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="$identifier"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+                
+        <resource>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="$fidentifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="type">
+                    <xsl:variable name="contenttype" select="../@type"/>
+                    <xsl:choose>
+                        <xsl:when test="$filecount > 1 and not ($reshref = @href) or string-length($contenttype) = 0">
+                            <xsl:value-of select=" 'webcontent' "/>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:value-of select="$contenttype"/>        
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+             
+            
+                <metadata>
+                    <imsmd:lom>
+                        <imsmd:general>
+                            <imsmd:identifier> 
+                                <xsl:value-of select="$fidentifier"/>
+                            </imsmd:identifier>                 
+                            <imsmd:title>
+                                <imsmd:langstring>
+                                    <xsl:attribute name="xml:lang">
+                                        <xsl:variable name="language" select="../imscp:metadata/lom:lom/lom:general/lom:title/lom:string/@language"/>
+                                        <xsl:choose>
+                                            <xsl:when test="string-length($language) = 0">
+                                                <xsl:value-of select=" 'x-none' "/>
+                                            </xsl:when>
+                                            <xsl:otherwise>
+                                                <xsl:value-of select="$language"/>        
+                                            </xsl:otherwise>
+                                        </xsl:choose>
+                                    </xsl:attribute>
+                                <xsl:choose>
+                                    <xsl:when test="$filecount > 1 and not ($reshref = @href) or string-length($title)=0">
+                                        <xsl:call-template name="getFilename">
+                                            <xsl:with-param name="file_path" select="@href"/>
+                                        </xsl:call-template>
+                                    </xsl:when> 
+                                    <xsl:otherwise>
+                                        <xsl:value-of select="$title"/>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                                </imsmd:langstring>
+                            </imsmd:title>
+                            
+
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:general/lom:language"/>
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:general/lom:description"/>
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:classification"/>
+                        </imsmd:general>
+                        
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:lifeCycle"/>
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:technical" />
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:rights"/>
+                    </imsmd:lom>
+                    <xsl:if test="$home='CourseHomePage' ">
+                        <eduCommons:eduCommons>
+                            <eduCommons:excludeFromNav>
+                                true
+                            </eduCommons:excludeFromNav>
+                            <eduCommons:homePagePath>
+                                    <xsl:variable name="base_dir" select="//@xml:base"/>
+                                    <xsl:value-of select="concat($base_dir,@href) "/>
+                            </eduCommons:homePagePath>
+                        </eduCommons:eduCommons>
+                      </xsl:if>  
+                </metadata>
+            
+            <file>
+                <xsl:attribute name="href">
+                    <xsl:variable name="base_dir" select="//@xml:base"/>
+                    <xsl:value-of select="concat($base_dir,@href) "/>
+                </xsl:attribute>
+            </file>
+        </resource>
+    </xsl:template>
+    
+    
+    <!-- rules for the lom:rights section -->
+    <xsl:template match="lom:rights">
+        <imsmd:rights>
+            <imsmd:copyrightandotherrestrictions>
+                <imsmd:source>
+                    <imsmd:langstring xml:lang="x-none">
+                        <xsl:value-of select="lom:copyrightAndOtherRestrictions/lom:source"/>
+                    </imsmd:langstring>
+                </imsmd:source>
+                <imsmd:value>
+                    <imsmd:langstring xml:lang="x-none">
+                        <xsl:value-of select="lom:copyrightAndOtherRestrictions/lom:value"/>
+                    </imsmd:langstring>
+                </imsmd:value>
+            </imsmd:copyrightandotherrestrictions>
+            <imsmd:description>
+                <imsmd:langstring xml:lang="x-none">
+                    <xsl:value-of select="lom:description/lom:string"/>
+                </imsmd:langstring>
+            </imsmd:description>
+        </imsmd:rights>
+    </xsl:template>
+    
+    <!-- rules for lom:technical section -->
+    
+    <xsl:template match="lom:technical">
+        <imsmd:technical>
+            <xsl:apply-templates select="lom:format"/>
+            <xsl:apply-templates select="lom:size"/>
+            <xsl:apply-templates select="lom:location"></xsl:apply-templates>
+         </imsmd:technical>
+    </xsl:template>
+    
+    <xsl:template match="lom:format">
+        <imsmd:format>
+            <xsl:value-of select="."/>
+        </imsmd:format>
+    </xsl:template>
+    
+    <xsl:template match="lom:size">
+        <imsmd:size>
+            <xsl:value-of select="."/>
+        </imsmd:size>
+    </xsl:template>
+
+    <xsl:template match="lom:location">
+        <imsmd:location>
+            <xsl:value-of select="."/>
+        </imsmd:location>
+    </xsl:template>
+    
+    <!-- rules for lom:general section -->
+    <xsl:template match="lom:language">
+        <imsmd:language>
+            <xsl:value-of select="."/>
+        </imsmd:language>
+    </xsl:template>
+    
+    <xsl:template match="lom:description">
+        <imsmd:description>
+            <xsl:apply-templates select="lom:string"/>
+        </imsmd:description>
+    </xsl:template>
+    
+    <xsl:template match="lom:classification">
+        <xsl:apply-templates select="lom:keyword"/>
+    </xsl:template>
+    
+    <xsl:template match="lom:keyword">
+        <imsmd:keyword>
+            <xsl:apply-templates select="lom:string"/>
+        </imsmd:keyword>
+    </xsl:template>
+    
+    
+    <!-- rules for the lom:lifeCycle section -->
+    
+    <xsl:template match="lom:lifeCycle">
+        <imsmd:lifecycle>
+            <xsl:apply-templates select="lom:contribute"/>
+        </imsmd:lifecycle>
+    </xsl:template>
+    
+    <xsl:template match="lom:contribute">
+        <imsmd:contribute>
+            <xsl:apply-templates select=" lom:role"/>
+            <imsmd:centity>
+                <imsmd:vcard>
+                    <xsl:text>BEGIN:VCARD
+                    </xsl:text>
+                    <xsl:text>FN:</xsl:text>
+                    <xsl:value-of select="lom:entity"/>
+                    <xsl:text>
+                    </xsl:text>
+                    <xsl:text>END:VCARD</xsl:text>
+                </imsmd:vcard>
+            </imsmd:centity>
+            <imsmd:date>
+                <imsmd:datetime>
+                    <xsl:value-of select="lom:date/lom:dateTime"/>
+                </imsmd:datetime>
+            </imsmd:date>
+        </imsmd:contribute>
+    </xsl:template>
+    
+    <xsl:template match="lom:role">
+        <imsmd:role>
+            <imsmd:source>
+                <imsmd:langstring>
+                    <xsl:attribute name="xml:lang">
+                        <xsl:value-of select="'x-none'"/>
+                    </xsl:attribute>
+                    <xsl:value-of select="substring-after(lom:source,'OCW_')"/>
+                </imsmd:langstring>
+            </imsmd:source>
+            <imsmd:value>
+                <imsmd:langstring>
+                    <xsl:attribute name="xml:lang">
+                        <xsl:value-of select="'x-none'"/>
+                    </xsl:attribute>
+                    <xsl:value-of select="lom:value"/>
+                </imsmd:langstring>               
+            </imsmd:value>
+        </imsmd:role>
+    </xsl:template>
+    
+    <!-- generic rules -->
+
+    <xsl:template match="lom:string">
+        <xsl:variable name="language" select="@language"/>
+        <imsmd:langstring>
+            <xsl:attribute name="xml:lang">
+                <xsl:choose>
+                    <xsl:when test="string-length($language) = 0">
+                        <xsl:value-of select=" 'x-none' "/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="$language"/>        
+                    </xsl:otherwise>
+                    </xsl:choose>
+            </xsl:attribute>
+            <xsl:value-of select="."/>
+        </imsmd:langstring>
+    </xsl:template>
+    
+    <xsl:template match="adlcp:location"> </xsl:template>
+
+    
+    <!-- the following rules are for retrieving a title from a reference --> 
+    <xsl:template name="getFilename">
+        <xsl:param name="file_path"/>
+        <xsl:variable name="rfile_path">
+            <xsl:call-template name="reverse_chars">
+                <xsl:with-param name="string_var" select="@href"/>
+            </xsl:call-template>
+        </xsl:variable>
+        <xsl:variable name="trim_rfile_path" select="substring-before($rfile_path,'/')"/>
+        <xsl:variable name="file_name">
+            <xsl:choose>
+                <xsl:when test="$trim_rfile_path">
+                    <xsl:call-template name="reverse_chars">
+                        <xsl:with-param name="string_var" select="$trim_rfile_path"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:call-template name="reverse_chars">
+                        <xsl:with-param name="string_var" select="$rfile_path"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:variable name="wext_file_name" select="substring-before($file_name,'.')"/>
+        <xsl:choose>
+            <xsl:when test="$wext_file_name">
+                <xsl:value-of select="$wext_file_name"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$file_name"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template name="reverse_chars">
+        <xsl:param name="string_var"/>
+        <xsl:param name="rstring"/>
+        <xsl:choose>
+            <xsl:when test="$string_var">
+                <xsl:call-template name="reverse_chars">
+                    <xsl:with-param name="string_var" select="substring($string_var, 2)"/>
+                    <xsl:with-param name="rstring"
+                        select="concat(substring($string_var, 1, 1),
+                        $rstring)"
+                    />
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$rstring"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_glossary_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_glossary_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_glossary_xform.xsl	(revision 712)
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:webct="http://www.webct.com/IMS" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+    
+    <xsl:template match="/">
+        <html><head/>
+        <body>
+        <table class="documentTable" style="width: 499px;" border="0" cellpadding="0" cellspacing="0">
+            <thead>
+            <tr><td>
+                <xsl:value-of select="'keyword'"/>
+            </td><td>
+                    <xsl:value-of select="'definition'"/>
+                </td></tr>
+            </thead>
+            <tbody>
+        <xsl:apply-templates select="webct:glossary/webct:gloss"/>
+                </tbody>
+         </table>
+        </body>    
+        </html>
+    </xsl:template>
+    
+    <xsl:template match="webct:glossary/webct:gloss">
+
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:choose>
+                        <xsl:when test="position() mod 2 = 1">
+                            <xsl:value-of select="'odd'"/>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:value-of select="'even'"/>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+                <td>
+                <xsl:value-of select="webct:keyword"/>
+                </td><td>
+                    <xsl:value-of select="webct:definition"/>
+             </td></tr>
+    </xsl:template>       
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_image_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_image_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_image_xform.xsl	(revision 712)
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:didl="http://www.mpeg.org/mpeg-21/2002/01-DIDL-NS" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+    
+    <xsl:template match="/">
+        <html><head/>
+        <body>
+        <table class="documentTable" style="width: 499px;" border="0" cellpadding="0" cellspacing="0">
+            <thead><tr><td>
+                <xsl:value-of select="'Images'"/>
+            </td></tr></thead>
+            <tbody>
+        <xsl:apply-templates select="didl:DIDL/didl:CONTAINER/didl:ITEM"/>
+                </tbody>
+         </table>
+        </body>    
+        </html>
+    </xsl:template>
+    
+    <xsl:template match="didl:DIDL/didl:CONTAINER/didl:ITEM">
+
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:choose>
+                        <xsl:when test="position() mod 2 = 1">
+                            <xsl:value-of select="'odd'"/>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:value-of select="'even'"/>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+                <td>
+                <a>
+                    <xsl:attribute name="href">
+                        <xsl:value-of select="didl:COMPONENT/didl:RESOURCE/@REF"/>
+                    </xsl:attribute>
+                    <xsl:value-of select="didl:DESCRIPTOR/didl:DESCRIPTOR/didl:STATEMENT"/>
+                </a>
+             </td></tr>
+    </xsl:template>
+    
+    <xsl:template match="didl:COMPONENT">
+     </xsl:template>
+        
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/WebCT_import_xform.xsl	(revision 712)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" 
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"                
+    xmlns:cwsp="http://www.dspace.org/xmlns/cwspace_imscp"
+    xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
+    xmlns:ocw="http://ocw.mit.edu/xmlns/ocw_imscp"
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+    xmlns:imsct="http://www.imsproject.org/content"
+    xmlns:lom="http://www.imsproject.org/metadata"
+    xmlns:webct="http://www.webct.com/IMS"
+    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">
+
+    <xsl:output method="xml" indent="yes" />
+    
+    <xsl:template match="/imsct:manifest">
+        <manifest>
+            <xsl:attribute name="version">
+                <xsl:text>1.0</xsl:text>
+            </xsl:attribute>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="xsi:schemaLocation">
+                <xsl:text>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</xsl:text>
+            </xsl:attribute>
+            <metadata>
+                <xsl:value-of select="unparsed-entity-uri('http://www.google.com')"/>
+                <schema>IMS Content</schema>
+                <schemaversion>1.2</schemaversion>
+                <xsl:call-template name="general" >
+                    <xsl:with-param name="title" select="imsct:metadata/lom:lom/lom:general/lom:title/lom:langstring"/>
+                    <xsl:with-param name="identifier" select="@identifier"/>
+                </xsl:call-template>
+            </metadata>
+            <organizations>
+                <organization>
+                    <xsl:attribute name="identifier">
+                        <xsl:value-of select="imsct:organizations/imsct:organization/@identifier"/>
+                    </xsl:attribute>
+                    <xsl:apply-templates select=".//imsct:manifest">
+                        <xsl:with-param name="section" select="'organizations'"/>
+                    </xsl:apply-templates>
+                 </organization>
+            </organizations>
+            <resources>
+            <xsl:apply-templates select=".//imsct:manifest">
+                <xsl:with-param name="section" select="'resources'"/>
+            </xsl:apply-templates>
+             </resources>
+        </manifest>
+    </xsl:template>
+  
+    
+    <xsl:template match="imsct:manifest">
+        <xsl:param name="section"/>
+        <xsl:variable name="manifest_type" select="imsct:metadata//lom:learningresourcetype/lom:value/lom:langstring"/>
+        <xsl:variable name="manifest_title" select="imsct:metadata//lom:title/lom:langstring"/>
+        <xsl:variable name="manifest_id" select="@identifier"/>
+        
+        <xsl:if test="$manifest_type='Content Module' ">
+            <xsl:call-template name="resource">
+                <xsl:with-param name="section" select="$section"/>
+                <xsl:with-param name="title" select="$manifest_title"/>
+                <xsl:with-param name="file_name" select="concat($manifest_id,'.html')"/>
+                <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+             </xsl:call-template>
+        </xsl:if>
+        
+        <xsl:apply-templates select="imsct:resources/imsct:resource">
+            <xsl:with-param name="manifest_type" select="$manifest_type"/>
+            <xsl:with-param name="manifest_title" select="$manifest_title"/>
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="manifest_id" select="$manifest_id"/>
+        </xsl:apply-templates>
+    </xsl:template>    
+ 
+    
+    
+    <xsl:template match="imsct:resources/imsct:resource">
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:if test="imsct:file">
+            <xsl:if test="imsct:file/@href != ''">
+            <xsl:choose>
+                <xsl:when test="$manifest_type='Glossary'">
+                    <xsl:call-template name="Glossary">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="section" select="$section"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:when test="$manifest_type='Image Database'">
+                    <xsl:apply-templates select="imsct:file">
+                        <xsl:with-param name="section" select="$section"/>
+                        <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="database" select="@href"/>
+                    </xsl:apply-templates>
+                </xsl:when>
+                <!--xsl:when test="$manifest_type='Organizer Page'">
+                    <xsl:call-template name="OrgPage"/>
+                </xsl:when-->
+                <xsl:when test="$manifest_type='Single Page'">
+                    <xsl:call-template name="SinglePage">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="section" select="$section"/>                        
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:when test="$manifest_type='Content Module'">
+                    <xsl:call-template name="ContentModule">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="section" select="$section"/>                        
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:when test="$manifest_type='URL' ">
+                    <xsl:call-template name="URL">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                        <xsl:with-param name="section" select="$section"/>     
+                    </xsl:call-template>
+                </xsl:when>
+            </xsl:choose>
+        </xsl:if>
+        </xsl:if>    
+    </xsl:template>
+    
+    
+    
+    <xsl:template name="ContentModule">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:if test="@type='webcontent'">        
+            <xsl:call-template name="resource">
+                <xsl:with-param name="section" select="$section"/>
+                <xsl:with-param name="title" select="//imsct:item[@identifierref=$identifier]/imsct:title"/>
+                <xsl:with-param name="file_name">
+                    <xsl:call-template name="ChangeExtension">
+                        <xsl:with-param name="file_name" select="imsct:file/@href"/>
+                    </xsl:call-template>
+                </xsl:with-param>
+                <xsl:with-param name="isvis" select="'false'"/>                
+            </xsl:call-template>    
+        </xsl:if>
+    </xsl:template>
+    
+    
+    <xsl:template name="Glossary">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:call-template name="resource">
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="title" select="$manifest_title"/>
+            <xsl:with-param name="file_name">
+                <xsl:call-template name="ChangeExtension">
+                    <xsl:with-param name="file_name" select="imsct:file/@href"/>
+                </xsl:call-template>
+            </xsl:with-param>
+            <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>                
+        </xsl:call-template>
+    </xsl:template>
+    
+    
+    <xsl:template match="imsct:file">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="database"/>
+        
+        <xsl:if test="$manifest_type='Image Database'">
+            <xsl:variable name="title">
+                <xsl:choose>
+                    <xsl:when test="@href = $database">
+                        <xsl:value-of select="$manifest_title"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:call-template name="getTitle">
+                            <xsl:with-param name="file_path" select="@href"/>
+                        </xsl:call-template> 
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:variable>
+            <xsl:variable name="isvis">
+                <xsl:choose>
+                    <xsl:when test="@href = $database">
+                        <xsl:value-of select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="'false'"/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:variable>
+            <xsl:call-template name="resource">
+                <xsl:with-param name="section" select="$section"/>
+                <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                <xsl:with-param name="title" select="$title"/>
+                <xsl:with-param name="file_name">
+                    <xsl:call-template name="ChangeExtension">
+                        <xsl:with-param name="file_name" select="@href"/>
+                    </xsl:call-template>
+                </xsl:with-param>
+                <xsl:with-param name="isvis" select="$isvis"/>                
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>
+    
+    
+    <xsl:template name="getTitle">
+        <xsl:param name="file_path"/>
+        <xsl:variable name="rfile_path">
+            <xsl:call-template name="reverse3">
+                <xsl:with-param name="theString" select="@href"/>
+            </xsl:call-template>
+        </xsl:variable>
+        <xsl:variable name="trim_rfile_path" select="substring-before($rfile_path,'/')"/>
+        <xsl:variable name="file_name">
+            <xsl:choose>
+                <xsl:when test="$trim_rfile_path">
+                    <xsl:call-template name="reverse3">
+                        <xsl:with-param name="theString" select="$trim_rfile_path"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:call-template name="reverse3">
+                        <xsl:with-param name="theString" select="$rfile_path"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>    
+        </xsl:variable>
+        <xsl:variable name="wext_file_name" select="substring-before($file_name,'.')"/>
+        <xsl:choose>
+            <xsl:when test="$wext_file_name">
+                <xsl:value-of select="$wext_file_name"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$file_name"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    
+    <xsl:template name="reverse3">
+        <xsl:param name="theString" />
+        <xsl:param name="reversedString" />
+        <xsl:choose>
+            <xsl:when test="$theString">
+                <xsl:call-template name="reverse3">
+                    <xsl:with-param name="theString"
+                        select="substring($theString, 2)" />
+                    <xsl:with-param name="reversedString"
+                        select="concat(substring($theString, 1, 1),
+                        $reversedString)" />
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$reversedString" />
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    
+    <xsl:template name="ChangeExtension">
+        <xsl:param name="file_name"/>
+        <xsl:choose>
+            <xsl:when test="substring($file_name,string-length($file_name)-3,4)='.xml'">
+                <xsl:value-of select="concat(substring($file_name,1,string-length($file_name)-4),'.html')"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$file_name"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    
+    <xsl:template name="OrgPage"/>
+
+    
+ 
+    <xsl:template name="URL">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:call-template name="resource">
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="file_name" select="concat(@identifier,'.html') "/>                        
+            <xsl:with-param name="title" select="$manifest_title"/>
+            <xsl:with-param name="manifest_type" select="$manifest_type"/>
+            <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+        </xsl:call-template>
+    </xsl:template>    
+    
+    
+    <xsl:template name="SinglePage">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:call-template name="resource">
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="file_name">
+                <xsl:call-template name="ChangeExtension">
+                    <xsl:with-param name="file_name" select="imsct:file/@href"/>
+                </xsl:call-template>
+            </xsl:with-param>            
+            <xsl:with-param name="title" select="$manifest_title"/>
+            <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+        </xsl:call-template>
+    </xsl:template>
+    
+    
+    <xsl:template name="resource">
+        <xsl:param name="section"/>
+        <xsl:param name="title"/>
+        <xsl:param name="file_name"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:param name="isvis"/>
+        <xsl:variable name="res_id" select="generate-id()"/>
+        <xsl:variable name="org_id" select="concat($res_id,'_O')"/>
+        <xsl:choose>
+            <xsl:when test="$section='resources'">
+                <xsl:call-template name="res_resource">
+                    <xsl:with-param name="title" select="$title"/>
+                    <xsl:with-param name="identifier" select="$res_id"/>
+                    <xsl:with-param name="file_name" select="$file_name"/>
+                    <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="$section='organizations' ">
+                <xsl:call-template name="org_item">
+                    <xsl:with-param name="title" select="$title"/>
+                    <xsl:with-param name="isvis" select="$isvis"/>
+                    <xsl:with-param name="identifier" select="$org_id"/>
+                    <xsl:with-param name="identifierref" select="$res_id"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose> 
+    </xsl:template>
+    
+    
+    
+    <xsl:template name="res_resource">
+        <xsl:param name="identifier"/>
+        <xsl:param name="title"/>
+        <xsl:param name="file_name"/>
+        <xsl:param name="manifest_type"/>
+        <resource>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="$identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="type">
+                <xsl:choose>
+                    <xsl:when test="$manifest_type='URL' ">
+                        <xsl:value-of select="'external link'"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                         <xsl:text>webcontent</xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:attribute>
+            <metadata>
+                <imsmd:lom>
+                    <xsl:call-template name="general">
+                        <xsl:with-param name="title" select="$title"/>
+                        <xsl:with-param name="identifier" select="$identifier"/>
+                    </xsl:call-template>
+                </imsmd:lom>
+                <eduCommons:eduCommons>
+                    <eduCommons:license category="Site Default"/>
+                    <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                    <eduCommons:accessible>false</eduCommons:accessible>
+                </eduCommons:eduCommons>
+            </metadata>
+                <file>
+                    <xsl:attribute name="href">
+                        <xsl:value-of select="$file_name"/>
+                    </xsl:attribute>
+               </file>
+        </resource>    
+    </xsl:template>
+
+    
+    <xsl:template name="org_item">
+        <xsl:param name="title"/>
+        <xsl:param name="identifier"/>
+        <xsl:param name="isvis"/>
+        <xsl:param name="identifierref"/>
+        <item>   
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="$identifier"/>      
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="$identifierref"/>
+            </xsl:attribute>
+            <xsl:attribute name="isvisible" >
+                <xsl:value-of select="$isvis"/>
+            </xsl:attribute>      
+            <title>
+                <xsl:value-of select="$title"/>
+            </title>
+        </item>
+    </xsl:template>
+
+    
+    <xsl:template name="general">
+        <xsl:param name="title"/>
+        <xsl:param name="identifier"/>
+        <imsmd:general>
+            <imsmd:identifier>
+                <xsl:value-of select="$identifier"/>
+            </imsmd:identifier>
+            <imsmd:title>
+                <imsmd:langstring xml:lang="en">
+                    <xsl:value-of select="$title"/>                            
+                </imsmd:langstring>                 
+            </imsmd:title>
+        </imsmd:general>
+    </xsl:template>
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/eXe_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/eXe_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/eXe_import_xform.xsl	(revision 712)
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+    version="1.0"
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2">
+   
+    <xsl:output method="xml" indent="yes"/>
+    
+    <xsl:template match="/">
+        <manifest xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p4.xsd http://cosl.usu.edu/xsd/eduCommonsv1.2 http://cosl.usu.edu/xsd/educommonsv1.2.xsd">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="imscp:manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>
+    </xsl:template>
+    
+    <xsl:template match="imscp:metadata">
+        <metadata>
+            <schema>IMS Content</schema>
+            <schemaversion>1.2</schemaversion>
+        </metadata>
+    </xsl:template>
+    
+    <xsl:template match="imscp:organizations">
+        <organizations>
+            <xsl:apply-templates select="imscp:organization"/>
+        </organizations>
+    </xsl:template>
+    
+    <xsl:template match="imscp:organization">
+        <organization>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </organization>
+    </xsl:template>
+    
+    <xsl:template match="imscp:title">
+        <title>
+            <xsl:value-of select="."/>
+        </title>
+    </xsl:template>
+    
+    <xsl:template match="imscp:item">
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:attribute name="isvisible">
+                <xsl:value-of select="@isvisible"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+    
+    <xsl:template match="imscp:resources">
+        <resources>
+            <xsl:apply-templates select="imscp:resource"/>
+        </resources>
+    </xsl:template>
+    
+    <xsl:template match="imscp:resource">
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:variable name="title" select="/imscp:manifest/imscp:organizations//imscp:item[@identifierref=$identifier]/imscp:title"/>
+        <xsl:variable name="restype" select="@type"/>
+        <xsl:variable name="reshref" select="@href"/>
+        <xsl:for-each select="imscp:file">
+            <resource>
+                <xsl:choose>
+                    <xsl:when test="@href=$reshref">
+                        <xsl:attribute name="identifier">
+                            <xsl:value-of select="$identifier"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="type">
+                            <xsl:value-of select="$restype"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="href">
+                            <xsl:value-of select="@href"/>
+                        </xsl:attribute>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:attribute name="identifier">
+                            <xsl:value-of select="concat('RES', generate-id())"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="type">
+                            <xsl:text>unknown</xsl:text>
+                        </xsl:attribute>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:choose>
+                    <xsl:when test="@href=$reshref">
+                        <metadata>
+                            <imsmd:lom>
+                                <imsmd:general>
+                                    <imsmd:title>
+                                        <imsmd:langstring xml:lang="en">
+                                            <xsl:value-of select="$title"/>
+                                        </imsmd:langstring>
+                                    </imsmd:title>
+                                </imsmd:general>
+                            </imsmd:lom>
+                            <xsl:choose>
+                                <xsl:when test="$title='Home'">
+                                    <eduCommons:eduCommons>
+                                        <eduCommons:objectType>Course</eduCommons:objectType>
+                                        <eduCommons:license category="Site Default"/>
+                                        <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                                    </eduCommons:eduCommons>
+                                </xsl:when>
+                            </xsl:choose>
+                        </metadata>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <metadata>
+                            <imsmd:lom>
+                            <imsmd:general>
+                                <imsmd:title>
+                                    <imsmd:langstring xml:lang="en">
+                                        <xsl:value-of select="@href"/>
+                                    </imsmd:langstring>
+                                </imsmd:title>
+                            </imsmd:general>
+                            </imsmd:lom>
+                            <eduCommons:eduCommons>
+                                <eduCommons:license category="Site Default"/>
+                                <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                            </eduCommons:eduCommons>
+                        </metadata>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <file>
+                    <xsl:attribute name="href">
+                        <xsl:value-of select="@href"/>
+                    </xsl:attribute>
+                </file>
+            </resource>
+        </xsl:for-each>
+    </xsl:template>
+    
+   
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/imscp_v1p2.xsd
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/imscp_v1p2.xsd	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/imscp_v1p2.xsd	(revision 712)
@@ -0,0 +1,332 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+<xs:schema xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    targetNamespace="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
+    version="IMS CP 1.2"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+    <xs:import namespace = "http://www.w3.org/XML/1998/namespace" schemaLocation = "http://www.w3.org/2001/03/xml.xsd"/>
+    <xs:annotation>
+        <xs:documentation>
+            XSD Data File Information
+            -------------------------
+            Author:       CP1P2 Project Team
+            Date:         20th November, 2005
+            Version:      1.0
+            Status:       Public Draft
+            Description:  This is a normative representation of the IMS CP 1.2 Information Model for binding 
+                          purposes.  Read the corresponding IMS CP Information Model for the Platform 
+                          Independent Model representation.
+
+            History:      This is version 1 of the IMS CP v1.2 XSD.  It directly supercedes IMS CP v1.1.4 XSD.
+                          Note that the target namespace has NOT been changed.
+                          Apart from the functional additions, the main structural changes are:
+                          (1) All of the elements and attributes are defined as local to their host object;
+                          (2) Comments have been added to the complexType definitions.
+
+            Copyright:    2005 (c) IMS Global Learning Consortium Inc.  All Rights Reserved.
+                          IMS Global Learning Consortium, Inc. (IMS) is publishing the information
+                          contained in this binding ("Specification") for purposes of scientific
+                          experimental and scholarly collaboration only.  IMS makes no warranty or 
+                          representation regarding the accuracy or completeness of the Specification.
+                          This material is provided on an "As Is" and "As Available basis".
+                          The Specification is at all times subject to change and revision without
+                          notice. It is your sole responsibility to evaluate the usefulness, accuracy
+                          and completeness of the Specification as it relates to you.  IMS would
+                          appreciate receiving your comments and suggestions.  Please contact IMS
+                          through our website at: http://www.imsglobal.org.
+
+            Source XSLT File Information
+            ----------------------------
+            XSL Generator:    UMLtoXSDTransformv0p7.xsl
+            XSLT Processor:   Xalan
+            Release:          1.0 Beta 1
+            Date:             31st October, 2005
+
+            Auto-generation Tool
+            --------------------
+            This WSDL/XSD was auto-generated using the IMS WSDL/XSD auto-generation tool.  While every attempt
+            has been made to ensure that this tool auto-generates the XSDs correctly, users should be aware
+            that this is an experimental tool.  Permission is given to make use of this tool.  IMS makes no
+            claim on the materials created by third party users of this tool.  Details on how to use this tool
+            are contained in the IMS document: "IMS General Web Services: WSDL/XSD Binding Auto-generation"
+            available at the IMS web-site.
+            Tool Copyright:  2005 (c) IMS Global Learning Consortium Inc.  All Rights Reserved.
+        </xs:documentation>
+    </xs:annotation>
+
+        <!-- Generate Global Attributes ***********************************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate Namespaced extension Group  *************************************************************  -->
+
+            <xs:group name="grp.any">
+                <xs:annotation>
+                    <xs:documentation>
+                        Any namespaced element from any namespace may be included within an "any" element.
+                        The namespace for the imported element must be defined in the instance, and the schema must be imported.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:any namespace = "##other" processContents = "strict" minOccurs = "0" maxOccurs = "unbounded"/>
+                </xs:sequence>
+            </xs:group>
+
+        <!-- =====================================  -->
+
+        <!-- Generate the enumerated simpleType declarations **************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate the simpleType elements based IMS data-types  *******************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate the derived data-type elements **********************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate the data-type elements ******************************************************************  -->
+
+            <xs:complexType name="Manifest.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A manifest element is a container for data structures whose contents describe a 
+                        semantically complete instance of the IMS Content Packaging Information Model.  
+                        
+                        A manifest element may contain and reference child manifest elements 
+                        in the same IMS Manifest document.  The root manifest element defines an 
+                        entire IMS Package.  A child manifest element defines a semantically complete 
+                        subset of that Package.
+
+                        <p>Represents a binding of the kinds of objects defined as children of ims-cp-imManifest : Manifest.[ ManifestMetadata, Organizations, Resources, Manifest, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="metadata" type="ManifestMetadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="organizations" type="Organizations.Type" minOccurs = "1" maxOccurs = "1"/>
+                    <xs:element name="resources" type="Resources.Type" minOccurs = "1" maxOccurs = "1"/>
+                    <xs:element name="manifest" type="Manifest.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="version" use="optional" type="xs:string"/>
+                <xs:attribute ref="xml:base" use="optional"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Metadata.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        An instance of the metadata element contains data structures 
+                        that declare descriptive information about a metadata element's 
+                        parent only.
+                        
+                        One or more different metadata models may be declared as
+                        child extensions of a metadata element.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imMetadata:  Metadata.[ Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+            </xs:complexType>
+
+            <xs:complexType name="Organizations.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        The organizations element is a container for all data structures 
+                        that describe the way or ways that information encapsulated by 
+                        its parent manifest element is structured. 
+
+                        <p>Represents of binding of the child objects of ims-cp-imOrganizations: Organizations.[ Organization, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="organization" type="Organization.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="default" use="optional" type="xs:IDREF"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Resources.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        The Resources element is a container for data structures containing 
+                        references  to one or more assets.  Asset references may be grouped 
+                        within a containing resources element in whatever manner seems best.
+                          
+                        The scope of referenced assets is specific to a resources element's parent 
+                        manifest element only. 
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imResources: Resources.[ Resource, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="resource" type="Resource.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute ref="xml:base" use="optional"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Organization.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        An organization element is a container for all data structures relating 
+                        to a particular way or view that information encapsulated by a 
+                        grandparent manifest object is structured.  
+                        
+                        Multiple organization elements within the same parent organizations 
+                        element are equivalent in purpose: Each shows a different way for 
+                        structuring the same information declared within a grandparent 
+                        manifest object.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-Organization: Organization[ Title, Item, Metadata, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="title" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="item" type="Item.Type" minOccurs = "1" maxOccurs = "unbounded"/>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="structure" use="optional" default="hierarchical" type="xs:string"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Resource.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A resource element is a container for a particular asset 
+                        or collection of assets.  A resource may contain references 
+                        to assets that are all of the same type or different types (i.e., file formats).
+                        
+                        The scope or boundary of an IMS Package is defined by the asset 
+                        references collected into all resources containers associated with the
+                        root manifest element, whether as a child, direcdt descendant, or externally 
+                        linked descendant. 
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imResource: Resource.[ Metadata, File, Dependency, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="file" type="File.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:element name="dependency" type="Dependency.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="type" use="required" type="xs:string"/>
+                <xs:attribute ref="xml:base" use="optional"/>
+                <xs:attribute name="href" use="optional" type="xs:anyURI"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Item.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        An item element represents a structural node in a particular organization.  
+                        An item element may be a parent or sibling of other Item elements, 
+                        each one representing a unique structural node.
+                        
+                        An organization has no meaning unless it has at least one Item element.
+
+                        <p>Represents a binding of the kinds of child objects of ims-cp-imItem: Item.[ Title, Item, Metadata, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="title" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="item" type="Item.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="identifierref" use="optional" type="xs:string"/>
+                <xs:attribute name="isvisible" use="optional" type="xs:boolean"/>
+                <xs:attribute name="parameters" use="optional" type="xs:string"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="File.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A file element declares a reference to a single asset.  The reference may
+                        be relative to the Package containing the file element or absolute 
+                        (external to the Package).
+                        
+                        A file element may contain child extensions declaring alternative references
+                         to the same asset as that referenced by the file element's href attribute.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imFile: File.[ Metadata, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="href" use="required" type="xs:anyURI"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Dependency.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A dependency element provides a way to associate another collection of 
+                        asset references within the scope of the dependency element's parent 
+                        resource element.
+                        
+                        This element allows the parsimonious declaration of asset references.  
+                        Shared asset references can be declared once and associated many 
+                        times through a Dependency element.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imDependency: Dependency.[ Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifierref" use="required" type="xs:string"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="ManifestMetadata.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        This metadata element contains data structures that declare 
+                        descriptive information about an entire Package.
+                        
+                        One or more different metadata models may be declared as
+                        child extensions of a metadata element.
+                        
+                        The schema and schemaversion children define the kind or collection 
+                        of metadata models being used.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imManifestMetadata:  ManifestMetadata.[ Schema, SchemaVersion, MetadataModel ]..</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="schema" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="schemaversion" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+            </xs:complexType>
+
+        <!-- =====================================  -->
+
+        <!-- Declaration of the elements **********************************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Declaration of the root element(s) ***************************************************************  -->
+
+            <xs:element name="manifest" type="Manifest.Type"/>
+
+        <!-- =====================================  -->
+
+</xs:schema>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/imsmd_v1p2p4.xsd
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/imsmd_v1p2p4.xsd	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS/imsmd_v1p2p4.xsd	(revision 712)
@@ -0,0 +1,588 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+<!--Generated by Turbo XML 2.3.1.100. Conforms to w3c http://www.w3.org/2001/XMLSchema-->
+<xsd:schema xmlns = "http://www.imsglobal.org/xsd/imsmd_v1p2"
+	 targetNamespace = "http://www.imsglobal.org/xsd/imsmd_v1p2"
+	 xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
+	 xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
+	 version = "IMS MD 1.2.4"
+	 elementFormDefault = "qualified">
+	<xsd:import namespace = "http://www.w3.org/XML/1998/namespace" schemaLocation = "http://www.w3.org/2001/03/xml.xsd"/>
+	<xsd:annotation>
+		<xsd:documentation>2001-04-26 T.D.Wason. IMS meta-data 1.2 XML-Schema.                                  </xsd:documentation>
+		<xsd:documentation>2001-06-07 S.E.Thropp. Changed the multiplicity on all elements to match the         </xsd:documentation>
+		<xsd:documentation>Final 1.2 Binding Specification.                                                     </xsd:documentation>
+		<xsd:documentation>Changed all elements that use the langstringType to a multiplicy of 1 or more        </xsd:documentation>
+		<xsd:documentation>Changed centity in the contribute element to have a multiplicity of 0 or more.       </xsd:documentation>
+		<xsd:documentation>Changed the requirement element to have a multiplicity of 0 or more.                 </xsd:documentation>
+		<xsd:documentation> 2001-07-25 Schawn Thropp.  Updates to bring the XSD up to speed with the W3C        </xsd:documentation>
+		<xsd:documentation> XML Schema Recommendation.  The following changes were made: Change the             </xsd:documentation>
+		<xsd:documentation> namespace to reference the 5/2/2001 W3C XML Schema Recommendation,the base          </xsd:documentation>
+		<xsd:documentation> type for the durtimeType, simpleType, was changed from timeDuration to duration.    </xsd:documentation>
+		<xsd:documentation> Any attribute declarations that have use="default" had to change to use="optional"  </xsd:documentation>
+		<xsd:documentation> - attr.type.  Any attribute declarations that have value ="somevalue" had to change </xsd:documentation>
+		<xsd:documentation> to default = "somevalue" - attr.type (URI)                                          </xsd:documentation>
+		<xsd:documentation> 2001-09-04 Schawn Thropp                                                            </xsd:documentation>
+		<xsd:documentation> Changed the targetNamespace and namespace of schema to reflect version change       </xsd:documentation>
+		<xsd:documentation> 2001-11-04 Chris Moffatt:                                                           </xsd:documentation>
+		<xsd:documentation>  1. Changes to enable the schema to work with commercial XML Tools                  </xsd:documentation>
+		<xsd:documentation>     a. Refer to the xml namespace using the "x" abbreviation instead of "xml"       </xsd:documentation>
+		<xsd:documentation>     b. Remove unecessary non-deterministic constructs from schema.                  </xsd:documentation>
+		<xsd:documentation>        i.e. change occurrences of "#any" to "#other"                                </xsd:documentation>
+		<xsd:documentation>  2. Revert to original IMS MD version 1.2 namespace.                                </xsd:documentation>
+		<xsd:documentation>     i.e. "http://www.imsglobal.org/xsd/imsmd_v1p2"                                  </xsd:documentation>
+		<xsd:documentation>     This change done to support the decision to only change the XML namespace with  </xsd:documentation>
+		<xsd:documentation>     major revisions of the specification ie. where the information model or binding </xsd:documentation>
+		<xsd:documentation>     changes (as opposed to addressing bugs or omissions). A stable namespace is     </xsd:documentation>
+		<xsd:documentation>     necessary to the increasing number of implementors.                             </xsd:documentation>
+		<xsd:documentation>  3. Changed name of schema file to "imsmd_v1p2p2.xsd" and                           </xsd:documentation>
+		<xsd:documentation>     version attribute to "IMS MD 1.2.3" to reflect minor version change             </xsd:documentation>
+		<xsd:documentation>  2005-08-26 Colin Smythe (IMS/GLC)                                                  </xsd:documentation>
+		<xsd:documentation>  1. Added the IMS Copyright statement                                               </xsd:documentation>
+		<xsd:documentation>  2. Removed the x: prefix references and ensured the import statment uses the W3C   </xsd:documentation>
+		<xsd:documentation>     namespace (http://www.w3.org/XML/1998/namespace) and schemalocation             </xsd:documentation>
+		<xsd:documentation>     (http://www.w3.org/2001/03/xml.xsd).                                            </xsd:documentation>
+		<xsd:documentation>  3. Changed name of schema file to "imsmd_v1p2p4.xsd" and made sure the             </xsd:documentation>
+		<xsd:documentation>     version attribute to "IMS MD 1.2.4" to reflect minor version change.            </xsd:documentation>
+		<xsd:documentation>  4. The multiplicity of 'taxon' in 'taxon' path has been changed from 0..1 to 0..*. </xsd:documentation>
+		<xsd:documentation>     This problem was identified in the IMS Maintenance Database as issue: 198.      </xsd:documentation>
+		<xsd:documentation>     This is now consistent with IEEE LOM.            								</xsd:documentation>
+		<xsd:documentation>  5. The recursive element of 'taxon' within 'taxon' has been removed. 				</xsd:documentation>
+		<xsd:documentation>     This problem was identified in the IMS Maintenance Database as issue: 198.      </xsd:documentation>
+		<xsd:documentation>     This is now consistent with IEEE LOM.            								</xsd:documentation>
+		<xsd:documentation>  This is the version used for the IMS specification packages.                       </xsd:documentation>
+	</xsd:annotation>
+	<xsd:group name = "grp.any">
+		<xsd:annotation>
+			<xsd:documentation>Any namespaced element from any namespace may be used for an "any" element.  The namespace for the imported element must be defined in the instance, and the schema must be imported.  </xsd:documentation>
+		</xsd:annotation>
+		<xsd:sequence>
+			<xsd:any namespace = "##other" processContents = "strict" minOccurs = "0" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:group>
+	<xsd:attributeGroup name = "attr.type">
+		<xsd:attribute name = "type" default = "URI">
+			<xsd:simpleType>
+				<xsd:restriction base = "xsd:string">
+					<xsd:enumeration value = "URI"/>
+					<xsd:enumeration value = "TEXT"/>
+				</xsd:restriction>
+			</xsd:simpleType>
+		</xsd:attribute>
+	</xsd:attributeGroup>
+	
+	<!-- Copyright: 2005 (c) IMS Global Learning Consortium Inc.  All Rights Reserved.      -->
+	
+	
+	<!-- IMS Global Learning Consortium, Inc. (IMS) is publishing the information contained -->
+	
+	
+	<!-- in this binding (âSpecificationâ) for purposes of scientific, experimental and     -->
+	
+	
+	<!-- scholarly collaboration only.  IMS makes no warranty or representation regarding   -->
+	
+	
+	<!-- the accuracy or completeness of the Specification.  This material is provided on   -->
+	
+	
+	<!-- an âAs Isâ and âAs Availableâ basis.  The Specification is at all times subject    -->
+	
+	
+	<!-- to change and revision without notice.  It is your sole responsibility to evaluate -->
+	
+	
+	<!-- the usefulness, accuracy and completeness of the Specification as it relates to    -->
+	
+	
+	<!-- you.  IMS would appreciate receiving your comments and suggestions.  Please        -->
+	
+	
+	<!-- contact IMS through our website at: http://www.imsglobal.org.                      -->
+	
+	
+	<!-- ******************** -->
+	
+	
+	<!-- ** Change History ** -->
+	
+	
+	<!-- ******************** -->
+	
+	
+	<!-- *************************** -->
+	
+	
+	<!-- ** Attribute Declaration ** -->
+	
+	
+	<!-- *************************** -->
+	
+	
+	<!-- ************************* -->
+	
+	
+	<!-- ** Element Declaration ** -->
+	
+	
+	<!-- ************************* -->
+	
+	<xsd:element name = "aggregationlevel" type = "aggregationlevelType"/>
+	<xsd:element name = "annotation" type = "annotationType"/>
+	<xsd:element name = "catalogentry" type = "catalogentryType"/>
+	<xsd:element name = "catalog" type = "catalogType"/>
+	<xsd:element name = "centity" type = "centityType"/>
+	<xsd:element name = "classification" type = "classificationType"/>
+	<xsd:element name = "context" type = "contextType"/>
+	<xsd:element name = "contribute" type = "contributeType"/>
+	<xsd:element name = "copyrightandotherrestrictions" type = "copyrightandotherrestrictionsType"/>
+	<xsd:element name = "cost" type = "costType"/>
+	<xsd:element name = "coverage" type = "coverageType"/>
+	<xsd:element name = "date" type = "dateType"/>
+	<xsd:element name = "datetime" type = "datetimeType"/>
+	<xsd:element name = "description" type = "descriptionType"/>
+	<xsd:element name = "difficulty" type = "difficultyType"/>
+	<xsd:element name = "educational" type = "educationalType"/>
+	<xsd:element name = "entry" type = "entryType"/>
+	<xsd:element name = "format" type = "formatType"/>
+	<xsd:element name = "general" type = "generalType"/>
+	<xsd:element name = "identifier" type = "xsd:string"/>
+	<xsd:element name = "intendedenduserrole" type = "intendedenduserroleType"/>
+	<xsd:element name = "interactivitylevel" type = "interactivitylevelType"/>
+	<xsd:element name = "interactivitytype" type = "interactivitytypeType"/>
+	<xsd:element name = "keyword" type = "keywordType"/>
+	<xsd:element name = "kind" type = "kindType"/>
+	<xsd:element name = "langstring" type = "langstringType"/>
+	<xsd:element name = "language" type = "xsd:string"/>
+	<xsd:element name = "learningresourcetype" type = "learningresourcetypeType"/>
+	<xsd:element name = "lifecycle" type = "lifecycleType"/>
+	<xsd:element name = "location" type = "locationType"/>
+	<xsd:element name = "lom" type = "lomType"/>
+	<xsd:element name = "maximumversion" type = "minimumversionType"/>
+	<xsd:element name = "metadatascheme" type = "metadataschemeType"/>
+	<xsd:element name = "metametadata" type = "metametadataType"/>
+	<xsd:element name = "minimumversion" type = "maximumversionType"/>
+	<xsd:element name = "name" type = "nameType"/>
+	<xsd:element name = "purpose" type = "purposeType"/>
+	<xsd:element name = "relation" type = "relationType"/>
+	<xsd:element name = "requirement" type = "requirementType"/>
+	<xsd:element name = "resource" type = "resourceType"/>
+	<xsd:element name = "rights" type = "rightsType"/>
+	<xsd:element name = "role" type = "roleType"/>
+	<xsd:element name = "semanticdensity" type = "semanticdensityType"/>
+	<xsd:element name = "size" type = "sizeType"/>
+	<xsd:element name = "source" type = "sourceType"/>
+	<xsd:element name = "status" type = "statusType"/>
+	<xsd:element name = "structure" type = "structureType"/>
+	<xsd:element name = "taxon" type = "taxonType"/>
+	<xsd:element name = "taxonpath" type = "taxonpathType"/>
+	<xsd:element name = "technical" type = "technicalType"/>
+	<xsd:element name = "title" type = "titleType"/>
+	<xsd:element name = "type" type = "typeType"/>
+	<xsd:element name = "typicalagerange" type = "typicalagerangeType"/>
+	<xsd:element name = "typicallearningtime" type = "typicallearningtimeType"/>
+	<xsd:element name = "value" type = "valueType"/>
+	<xsd:element name = "person" type = "personType"/>
+	<xsd:element name = "vcard" type = "xsd:string"/>
+	<xsd:element name = "version" type = "versionType"/>
+	<xsd:element name = "installationremarks" type = "installationremarksType"/>
+	<xsd:element name = "otherplatformrequirements" type = "otherplatformrequirementsType"/>
+	<xsd:element name = "duration" type = "durationType"/>
+	<xsd:element name = "id" type = "idType"/>
+	
+	<!-- ******************* -->
+	
+	
+	<!-- ** Complex Types ** -->
+	
+	
+	<!-- ******************* -->
+	
+	<xsd:complexType name = "aggregationlevelType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "annotationType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "person" minOccurs = "0"/>
+			<xsd:element ref = "date" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "catalogentryType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "catalog"/>
+			<xsd:element ref = "entry"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "centityType">
+		<xsd:sequence>
+			<xsd:element ref = "vcard"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "classificationType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "purpose" minOccurs = "0"/>
+			<xsd:element ref = "taxonpath" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:element ref = "keyword" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "contextType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "contributeType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "role"/>
+			<xsd:element ref = "centity" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "date" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "copyrightandotherrestrictionsType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "costType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "coverageType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "dateType">
+		<xsd:sequence>
+			<xsd:element ref = "datetime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "descriptionType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "difficultyType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "durationType">
+		<xsd:sequence>
+			<xsd:element ref = "datetime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "educationalType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "interactivitytype" minOccurs = "0"/>
+			<xsd:element ref = "learningresourcetype" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "interactivitylevel" minOccurs = "0"/>
+			<xsd:element ref = "semanticdensity" minOccurs = "0"/>
+			<xsd:element ref = "intendedenduserrole" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "context" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "typicalagerange" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "difficulty" minOccurs = "0"/>
+			<xsd:element ref = "typicallearningtime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:element ref = "language" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "entryType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "generalType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "identifier" minOccurs = "0"/>
+			<xsd:element ref = "title" minOccurs = "0"/>
+			<xsd:element ref = "catalogentry" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "language" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "description" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "keyword" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "coverage" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "structure" minOccurs = "0"/>
+			<xsd:element ref = "aggregationlevel" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "installationremarksType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "intendedenduserroleType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "interactivitylevelType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "interactivitytypeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "keywordType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "kindType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "langstringType">
+		<xsd:simpleContent>
+			<xsd:extension base = "xsd:string">
+				<xsd:attribute ref = "xml:lang"/>
+			</xsd:extension>
+		</xsd:simpleContent>
+	</xsd:complexType>
+	<xsd:complexType name = "learningresourcetypeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "lifecycleType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "version" minOccurs = "0"/>
+			<xsd:element ref = "status" minOccurs = "0"/>
+			<xsd:element ref = "contribute" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "locationType">
+		<xsd:simpleContent>
+			<xsd:extension base = "xsd:string">
+				<xsd:attributeGroup ref = "attr.type"/>
+			</xsd:extension>
+		</xsd:simpleContent>
+	</xsd:complexType>
+	<xsd:complexType name = "lomType">
+		<xsd:sequence>
+			<xsd:element ref = "general" minOccurs = "0"/>
+			<xsd:element ref = "lifecycle" minOccurs = "0"/>
+			<xsd:element ref = "metametadata" minOccurs = "0"/>
+			<xsd:element ref = "technical" minOccurs = "0"/>
+			<xsd:element ref = "educational" minOccurs = "0"/>
+			<xsd:element ref = "rights" minOccurs = "0"/>
+			<xsd:element ref = "relation" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "annotation" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "classification" minOccurs = "0" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "metametadataType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "identifier" minOccurs = "0"/>
+			<xsd:element ref = "catalogentry" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "contribute" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "metadatascheme" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "language" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "nameType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "otherplatformrequirementsType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "personType">
+		<xsd:sequence>
+			<xsd:element ref = "vcard"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "purposeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "relationType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "kind" minOccurs = "0"/>
+			<xsd:element ref = "resource" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "requirementType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "type" minOccurs = "0"/>
+			<xsd:element ref = "name" minOccurs = "0"/>
+			<xsd:element ref = "minimumversion" minOccurs = "0"/>
+			<xsd:element ref = "maximumversion" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "resourceType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "identifier" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:element ref = "catalogentry" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "rightsType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "cost" minOccurs = "0"/>
+			<xsd:element ref = "copyrightandotherrestrictions" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "roleType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "semanticdensityType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "sourceType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "statusType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "stringType">
+		<xsd:simpleContent>
+			<xsd:extension base = "xsd:string">
+				<xsd:attribute ref = "xml:lang"/>
+			</xsd:extension>
+		</xsd:simpleContent>
+	</xsd:complexType>
+	<xsd:complexType name = "structureType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "taxonpathType">
+		<xsd:sequence>
+			<xsd:element ref = "source" minOccurs = "0"/>
+			<xsd:element ref = "taxon" minOccurs = "0" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "taxonType">
+		<xsd:sequence>
+			<xsd:element ref = "id" minOccurs = "0"/>
+			<xsd:element ref = "entry" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "technicalType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "format" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "size" minOccurs = "0"/>
+			<xsd:element ref = "location" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "requirement" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "installationremarks" minOccurs = "0"/>
+			<xsd:element ref = "otherplatformrequirements" minOccurs = "0"/>
+			<xsd:element ref = "duration" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "titleType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "typeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "typicalagerangeType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "typicallearningtimeType">
+		<xsd:sequence>
+			<xsd:element ref = "datetime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "valueType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "versionType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	
+	<!-- ****************** -->
+	
+	
+	<!-- ** Simple Types ** -->
+	
+	
+	<!-- ****************** -->
+	
+	<xsd:simpleType name = "formatType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "sizeType">
+		<xsd:restriction base = "xsd:int"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "datetimeType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "idType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "metadataschemeType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "catalogType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "minimumversionType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "maximumversionType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+</xsd:schema>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS_exceptions.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS_exceptions.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/IMS_exceptions.py	(revision 712)
@@ -0,0 +1,4 @@
+
+
+class ManifestError(Exception):
+    pass
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/INSTALL.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/INSTALL.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/INSTALL.txt	(revision 712)
@@ -0,0 +1,29 @@
+=========================================
+IMSTransport 2.0.0-final Installation
+=========================================
+
+-------------------------
+Installation Instructions
+-------------------------
+
+Installation
+============
+
+This Product can be installed via either an Extension Profile or the QuickInstaller.
+
+Copy this product into the Products directory in your Zope instance. 
+
+Restart your Zope server.
+  
+To add this Product to an existing site:
+  * Click on the site setup link
+  * Click on Add/Remove Products
+  * Click on the IMSTransport check box, and then click  on the install button below.
+
+To add this Product to a new site:
+  * Navigate to the ZMI
+  * Use the drop down list to Add a new Plone Site
+  * Select the IMSTransport Extension Profile
+  * Click Add Plone Site
+
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/Manifest.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/Manifest.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/Manifest.py	(revision 712)
@@ -0,0 +1,600 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+from Acquisition import aq_inner, aq_parent
+from zope.interface import implements
+from zope.event import notify
+from interfaces import IIMSManifestWriter, IIMSManifestReader
+from ManifestEvents import SetNameSpaces, ObjectWriteMetadata, ObjectReadMetadata, \
+                           ObjectWriteOrganizations, ObjectReadOrganizations, \
+                           ObjectCreateObject, ObjectTransformPackage
+from IMS_exceptions import ManifestError
+from zipfile import ZipFile, ZIP_DEFLATED
+from cStringIO import StringIO
+from xml.dom import minidom
+from libxml2 import readFile, parseDoc
+from libxslt import parseStylesheetDoc
+from string import join
+import md5
+import os
+from App import config
+
+
+IMS_schema = 'IMS CONTENT'
+IMS_version = '1.2'
+
+
+class IMSManifestWriter(object):
+    """ Write an IMS content package manifest file. """
+
+    implements(IIMSManifestWriter)
+
+    namespaces = [('xmlns', 'http://www.imsglobal.org/xsd/imscp_v1p1'),
+                  ('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'),]
+    schema_locations = ['http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd',]
+    schema_files = [(os.sep.join(['collective.imstransport','collective','imstransport','IMS']), 'imscp_v1p2.xsd')]
+
+
+    def __init__(self, context):
+        self.context = context
+        self.document = None
+        self.destination = None
+        self.ims_path = ''
+        self.manifest_node = None
+       
+        cfg = config.getConfiguration()
+        cfglist = cfg.instancehome.split(os.sep)[:-2]
+        cfglist += ['src']
+        self.ims_path = os.sep.join(cfglist)
+
+    def setWriterType(self, wtype):
+        """ The writer type field acts as a selector for write manifest events.
+            The Manifest writer will send this type when it fires an event.
+            Event handlers written for the event should first check this value
+            before executing any functionality. That way multiple event handlers
+            can be subscribed, but only one event handler will execute the
+            specified functionality. """
+        self.wtype = wtype
+
+
+    def setDestination(self, destination):
+        """ Set the output object for the writer. """
+        self.destination = destination
+
+        
+    def writeManifest(self):
+        """ Write the manifest. """
+
+        # Create an empyt XML document
+        self.document = minidom.Document()
+
+        # Create the Manifest node
+        manifestId = self._createPathId(self.context.virtual_url_path(), 'MAN')
+        manifestVer = self.context.ModificationDate()
+        self.manifest_node = self._createNode(self.document,
+                                              '',
+                                              'manifest',
+                                              attrs=[('identifier', manifestId),
+                                                     ('xmlns:version', manifestVer)])
+        self.addNamespace()
+        notify(SetNameSpaces(self.context, self))
+
+        # Create the top level Metadata node
+        metadata_node = self._createNode(self.manifest_node, '', 'metadata')
+        self._createNode(metadata_node, '', 'schema', IMS_schema)
+        self._createNode(metadata_node, '', 'schemaversion', IMS_version)
+
+        # Create the Organizations node
+        defaultId = self._createPathId(self.context.virtual_url_path(), 'ORG')
+        organizations_node = self._createNode(self.manifest_node,
+                                              '',
+                                              'organizations',
+                                              attrs=[('default', defaultId)])
+
+        # Send a write organizations event, so that anyone can do what they want here
+        notify(ObjectWriteOrganizations(self.context, organizations_node, self))
+        
+        resources_node = self._createNode(self.manifest_node, '', 'resources')
+
+        allObjects = self._getAllObjects()
+        
+        for obj in allObjects:
+            # Handle the case where an object might be folderish, but
+            # also has a text attribute.
+            if not obj.isPrincipiaFolderish or hasattr(obj.aq_explicit,'getText'):
+                path = self._getObjectPath(obj)
+                self._writeResource(obj, resources_node, path)
+                self._writeObjectData(obj, path)
+
+        self._writeObjectData(self.getManifest(), 'imsmanifest.xml')
+
+        for x in self.schema_files:
+            path = x[0].replace('.', os.sep)
+            fn = os.path.join(self.ims_path, x[0], x[1])
+            f = open(fn, 'rb')
+            schema = f.read()
+            f.close()
+            self._writeObjectData(schema, x[1])
+
+        if self.destination:
+            return self.destination.getOutput()
+        else:
+            return None, None
+
+        
+    def _writeObjectData(self, obj, path):
+        """ Write file data to the destination object. """
+        if type(obj) == type(''):
+            data = obj        
+        else:
+            format = ''
+            if hasattr(obj.aq_explicit, 'Format'):
+                format = obj.Format()
+            if 'Link' == obj.Type():
+                doc = minidom.Document()
+                anchor_node = self._createNode(doc, '', 'a', obj.Title())
+                anchor_node.setAttribute('href', obj.getRemoteUrl())
+                data = doc.toxml(encoding='utf-8')
+            elif obj.Type() in ['File', 'Image']:
+                if hasattr(obj.aq_explicit, 'data'):
+                    data = obj.data
+            elif 'text/html' == format:
+                if hasattr(obj.aq_explicit, 'getText'):
+                    data = obj.getText()
+            elif format in ['text/plain', 'text/x-rst', 'text/structured']:
+                if hasattr(obj.aq_explicit, 'getRawText'):
+                    data = obj.getRawText()
+            else:
+                data = ''
+        if self.destination:
+            self.destination.writeFile(path, data)
+
+    def _getAllObjects(self):
+        """ Get all sub objects. """
+        return [obj.getObject() for obj in self.context.portal_catalog.searchResults(path={'query':('/'.join(self.context.getPhysicalPath())+'/'),})]
+
+    
+    def _getObjectPath(self, obj):
+        """ Get the path of an object. """
+
+        path = obj.virtual_url_path().replace(self.context.aq_inner.aq_parent.virtual_url_path(), '')[1:]
+
+        # If object has type text/html, and is also folderish, change the path
+        # so that both a folder and an html file can be created.
+        if hasattr(obj.aq_explicit, 'Format'):
+            if 'text/html' == obj.Format() and obj.isPrincipiaFolderish:
+                path += '.html'
+
+        return path
+        
+    def _writeResource(self, obj, node, path):
+        """ Write out a resource object """
+
+        resourceId = self._createPathId(obj.virtual_url_path(), 'RES')
+        resource_node = self._createNode(node,
+                                         '',
+                                         'resource',
+                                         attrs=[('type', 'webcontent'),
+                                                ('href', obj.renderBase()),
+                                                ('identifier', resourceId)])
+        
+        metadata_node = self._createNode(resource_node, '', 'metadata')
+        
+        # Send a write metadata event, in case anyone wants to include custom metadata
+        notify(ObjectWriteMetadata(aq_inner(obj), metadata_node, self))
+        
+        file_node = self._createNode(resource_node, '', 'file', attrs=[('href', path)])
+
+        
+    def _createPathId(self, path, pre='RES'):
+        """ Create a unique id given a path """
+        return pre + str(md5.md5(path).hexdigest())
+
+
+    def getManifest(self):
+        """ Get the manifest expressed in XML. """
+        return self.document.toprettyxml(encoding='utf-8')
+
+
+    def _createNode(self, parent, nspace, ename, value=None, attrs=None):
+        """ Create a node in the document. """
+        newnode = self.document.createElementNS(nspace, ename)
+        parent.appendChild(newnode)
+        if value and value != '':
+            if not isinstance(value, unicode):
+                newnode.appendChild(self.document.createTextNode(value.decode('utf-8')))
+            else:
+                newnode.appendChild(self.document.createTextNode(value))                
+        if attrs:
+            for x in attrs:
+                newnode.setAttribute(x[0], x[1])
+        return newnode
+
+
+    def addNamespace(self, namespace=None, location=None, file=None):
+        """ Add a namespace to the manifest. """
+        if namespace:
+            self.namespaces.append(namespace)
+        if location and location not in self.schema_locations:
+            self.schema_locations.append(location)
+        if file and file not in self.schema_files:
+            self.schema_files.append(file)
+        for ns in self.namespaces:
+            self.manifest_node.setAttribute(ns[0], ns[1])
+        self.manifest_node.setAttribute('xsi:schemaLocation', join(self.schema_locations, ' '))
+
+
+class FileWriter:
+    """ Write files out to the file system """
+    
+    def __init__(self, package_name):
+        self.fullpath = os.tempnam('var', 'OBJ')
+        self.fullpath = os.path.join(self.fullpath, package_name)
+        self._mkdirs(self.fullpath.split(os.sep))
+
+
+    def _mkdirs(self, path):
+        """ Make directory structure. """
+        curdir = os.getcwd()
+        if not len(path):
+            return
+        elif not os.path.exists(path[0]):
+            os.mkdir(path[0])
+        os.chdir(path[0])
+        self._mkdirs(path[1:])
+        os.chdir(curdir)
+
+    
+    def writeObject(self, obj, path):
+        ''' Writes content object to the file system '''
+        fullpath = self.fullpath
+        for x in path.split('/'):
+            fullpath = os.path.join(fullpath, x)
+        self._mkdirs(fullpath.split(os.sep)[:-1])
+
+        if hasattr(obj.aq_explicit, 'getText'):
+            file = open(fullpath + '.html', 'w')
+            file.write(obj.getText())
+            file.close
+            
+        elif hasattr(obj.aq_explicit, 'data'):
+            file = open(fullpath,'w')
+            file.write(obj.data)
+            file.close()
+
+        
+    def writeManifest(self, manifest):
+        fullpath = os.path.join(self.fullpath, 'imsmanifest.xml')
+        f = open(fullpath, 'wb')
+        f.write(manifest)
+        f.close()
+
+
+class ZipfileWriter:
+    """ Write a zip file which contains all the IMS Content packaging stuff. """
+
+    def __init__(self, archive_name, package_name):
+        self.fullpath = '%s/' %package_name
+        self.archive_name = archive_name
+        self.package_name = package_name
+        self.archive = StringIO()
+        self.zipfile = ZipFile(self.archive, 'w', ZIP_DEFLATED)
+
+
+    def writeFile(self, path, data):
+        """ Write a file to the zip archive. """
+        fpath = '%s%s' %(self.fullpath, path)
+        self.zipfile.writestr(fpath, data)
+
+
+    def getOutput(self):
+        """ Close the zip file and get the binary archive. """
+        self.zipfile.close()
+        self.archive.seek(0)
+        return self.archive.read(), self.archive_name
+        
+
+class IMSManifestReader(object):
+    """ Read an IMS content package manifest file. """
+
+    implements(IIMSManifestReader)
+
+
+    def __init__(self, context):
+        """
+        """
+        self.context = context
+        self.rtype = None
+        self.source = None
+        self.requiredMetadataSections = []
+
+        for path in os.environ['PYTHONPATH'].split(':'):
+            if 'collective.imstransport' in path:
+                self.ims_path = path
+                break
+        else:
+            self.ims_path = ''
+
+
+
+    def setReaderType(self, rtype):
+        """ The reader type field acts as a selector for read manifest events.
+            The manifest reader will send this type when it fires an event.
+            Event handlers written for the event should first check this value
+            before executing any functionality. That way multiple event handlers
+            can be subscribed, but only one event handler will execute the
+            specified functionality. """
+        self.rtype = rtype
+
+
+    def setSource(self, source):
+        """ Set the source of the file data. """
+        self.source = source
+
+
+    def setRequiredMetadataSections(self, sections):
+        """ Set which metadata sections should be required, so that
+            an error can be thrown if a section is missing. """
+        if type(sections) == type([]):
+            for x in sections:
+                self.requiredMetadataSections.append(x)
+        else:
+            self.requiredMetadataSections = [sections]
+
+
+    def readManifest(self, package_type=None):
+        """ Read the manifest """
+
+        if self.source:
+            manifest = self.source.readManifest()
+            if not manifest:
+                return False, \
+                       'Manifest', \
+                       'Could not locate manifest file "imsmanifest.xml" in the zip archive.'
+            
+            xformdata = {} 
+            if package_type:
+                notify(ObjectTransformPackage(self, manifest, package_type, xformdata))
+
+            if xformdata.has_key('manifest'):
+                manifest = xformdata['manifest']
+            if xformdata.has_key('filedata'):
+                filedata = xformdata['filedata']
+            else:
+                filedata = {}
+            
+            self.document = minidom.parseString(manifest)
+
+            try: 
+                org = self.readOrganizations()
+                resources = self.readResources(org)
+            except ManifestError, e:
+                return False, 'Manifest', e
+            else:
+                for res in resources:
+                    for f in res[0]:
+                        data = None
+                        if self.source:
+                            # If we already have data for the file, use it instead
+                            if filedata.has_key(f):
+                                data = filedata[f]
+                            else:
+                                data = self.source.readFile(f)
+                        if data:
+                            notify(ObjectCreateObject(self.context, self.rtype, str(f), data, res[1]))
+            return True, ''
+        else:
+            return False, 'Internal error. No source object specified.'
+
+                
+    def readOrganizations(self):
+        """ Read the organizations section of the manifest. """
+        org = {}
+        organizations = self.document.getElementsByTagName('organizations')
+        if organizations:
+            notify(ObjectReadOrganizations(self.context, organizations[0], self, org))
+        else:
+            raise ManifestError, 'Manifest file has no "organizations" section.'
+        return org
+
+
+    def readResources(self, org):
+        """ Read all resources. """
+        allResources = []
+        resources = self.document.getElementsByTagName('resources')
+        if resources:
+            for res in resources[0].getElementsByTagName('resource'):
+                metadata = {}
+                # Check to see if navigations options should be set
+                id = res.getAttribute('identifier')
+                if id:
+                    if org.has_key(id):
+                        metadata['excludeFromNav'] = False
+                        metadata['navPosition'] = org[id]
+    
+                    else:
+                        metadata['excludeFromNav'] = True
+                # Get metadata for objects
+                files = []
+                file_nodes = res.getElementsByTagName('file')
+                for f in file_nodes:
+                    fn = f.getAttribute('href')  
+                    if fn: 
+                        files.append(fn) 
+                if not files:
+                    raise ManifestError, 'Missing "file" tag in resource %s.' %id
+
+                # Create the objects
+                self.readMetadata(res, metadata, id)
+                allResources.append((files, metadata))
+
+        return allResources
+
+
+    def readMetadata(self, node, metadata, resid):
+        """ Get the metadata, and set it on an object """
+        metadata_node = node.getElementsByTagName('metadata')
+        if metadata_node:
+            mdSections = []
+            for md in metadata_node[0].childNodes:
+                if md.nodeType == md.ELEMENT_NODE:
+                    notify(ObjectReadMetadata(self.context, metadata, md, self, mdSections, resid))
+            for x in self.requiredMetadataSections:
+                if x not in mdSections:
+                    raise ManifestError, \
+                          'Missing required metadata section "%s" for resource "%s".' %(x, resid)
+        else:
+            raise ManifestError, 'Missing required "metadata" section in resource "%s".' %resid
+        return metadata
+
+
+    def getTextValue(self, node):
+        """ Removes the text from the text_node of a node """
+        for x in node.childNodes:
+            if x.nodeType == x.TEXT_NODE:
+                return x.nodeValue.strip()
+        return None
+                                
+    
+    def getVcardValues(self, node, resid):
+        """
+        Looks for the full name and email values in a VCARD
+        value.
+
+        Added some whitespace stripping, and case
+        insensitive tag searching, so that we could parse the
+        default IMS example package.
+    
+        """
+        text = self.getTextValue(node)
+        textlines = text.strip().split('\n')
+                
+        value = self._getVcardValue('BEGIN', [textlines[0]])
+        if 'VCARD' != value.strip().upper():
+            raise ManifestError, 'Missing VCARD BEGIN tag for resource "%s"' %resid
+
+        value = self._getVcardValue('END', [textlines[-1]])
+        if 'VCARD' != value.strip().upper():
+            raise ManifestError, 'Missing VCARD END tag for resource "%s"' %resid
+            
+        name = self._getVcardValue('FN', textlines)
+        email = self._getVcardValue('EMAIL;INTERNET', textlines)
+
+        return name, email
+
+        
+    def _getVcardValue(self, field, text):
+        """ Try to get a value for a VCARD field. """
+        for textline in text:
+            # If the line is not folded
+            #if textline[0] != ' ':
+                # Look for the Colon delimiter
+            textline = textline.strip()
+            if textline.find(':'):
+                tag = textline.split(':')
+                if field == tag[0].upper().strip():
+                    return tag[1].strip()
+        else:
+            return ''
+                
+
+    def _importFile(self, file_node):
+        ''' Get the file '''
+        pass
+
+
+    def performTransform(self, manifest, package_type):
+        """ Transform the manifest if necessary. """
+
+        if package_type:
+            xform = os.path.join(self.ims_path, 'collective', 'imstransport', 'IMS', package_type[1])
+            doc = parseDoc(manifest)
+            styledoc = readFile(xform, None, 0)
+            style = parseStylesheetDoc(styledoc)
+            mn = ''
+            result = style.applyStylesheet(doc, None)
+            if result and result.get_content():
+                mn = style.saveResultToString(result)
+            style.freeStylesheet()
+            doc.freeDoc()
+            result.freeDoc()
+        return mn
+
+
+class FileReader:
+    """ Read files from the var directory. """
+
+    def __init__(self, package_path):
+        self.fullpath = package_path
+
+
+    def readManifest(self):
+        """ Get the manifest file if it exists. """
+        manifest_path = os.path.join(self.fullpath, 'imsmanifest.xml')
+        file = open(manifest_path, 'rb')
+        manifest = file.read()
+        file.close()
+        return manifest
+
+    def readFile(self, path):
+        """ Get file data from the zip file. """
+        fullpath = self.fullpath
+        for x in path.split('/'):
+            fullpath = os.path.join(fullpath, x)
+        file = open(fullpath, 'rb')
+        data = file.read()
+        file.close()
+        return data
+
+
+class ZipfileReader:
+    """ Reads files from an imported zip file. """
+
+    def __init__(self, files):
+        self.files = ZipFile(files)
+        self.fullpath = ''
+
+
+    def readManifest(self):
+        """ Get the maifest file if it exists. """
+        for x in self.files.namelist():
+            index = x.find('imsmanifest.xml')
+            if index != -1:
+                self.fullpath = x[:index]
+                return self.files.read(x)
+        return None
+    
+
+    def readFile(self, path):
+        """ Get file data from the zip file. """
+        fn = '%s%s' %(self.fullpath, str(path))
+        if fn not in self.files.namelist():
+            fn = fn.replace('/', '\\')
+            if fn not in self.files.namelist():
+                return None
+        return self.files.read(fn)
+
+    def listFiles(self):
+        """ List files in the package. """
+        return self.files.namelist()
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/ManifestEvents.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/ManifestEvents.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/ManifestEvents.py	(revision 712)
@@ -0,0 +1,131 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+
+from zope.component.interfaces import ObjectEvent
+from zope.interface import implements
+from interfaces import ISetNameSpaces, IObjectWriteMetadata, IObjectReadMetadata, \
+                       IObjectWriteOrganizations, IObjectReadOrganizations, \
+                       IObjectWriteContributeNode, IObjectReadContributeNode, \
+                       IObjectCreateObject, IObjectTransformPackage
+
+
+class SetNameSpaces(ObjectEvent):
+    """ Set namespace information in manifest. """
+    implements(ISetNameSpaces)
+
+    def __init__(self, object, writer):
+        super(SetNameSpaces, self).__init__(object)
+        self.writer = writer
+
+class ObjectWriteMetadata(ObjectEvent):
+    """ Write metadata to content package. """
+    implements(IObjectWriteMetadata)
+
+    def __init__(self, object, node, writer):
+        super(ObjectWriteMetadata, self).__init__(object)
+        self.node = node
+        self.writer = writer
+
+        
+class ObjectReadMetadata(ObjectEvent):
+    """ Read metadata from content package. """
+    implements(IObjectReadMetadata)
+
+    def __init__(self, object, metadata, node, reader, mdSections, resid):
+        super(ObjectReadMetadata, self).__init__(object)
+        self.metadata = metadata
+        self.node = node
+        self.reader = reader
+        self.mdSections = mdSections
+        self.resid = resid
+
+        
+class ObjectWriteOrganizations(ObjectEvent):
+    """ Write Organizations entries. """
+    implements (IObjectWriteOrganizations)
+    
+    def __init__(self, object, node, writer):
+        super(ObjectWriteOrganizations, self).__init__(object)
+        self.node = node
+        self.writer = writer
+
+        
+class ObjectReadOrganizations(ObjectEvent):
+    """ Read Organization entries. """
+    implements (IObjectReadOrganizations)
+    
+    def __init__(self, object, node, reader, org):
+        super(ObjectReadOrganizations, self).__init__(object)
+        self.node = node
+        self.reader = reader
+        self.org = org
+
+        
+class ObjectWriteContributeNode(ObjectEvent):
+    """ Write a contribute entry. """
+    implements(IObjectWriteContributeNode)
+
+    def __init__(self, object, node, writer, mwriter):
+        super(ObjectWriteContributeNode, self).__init__(object)
+        self.node = node
+        self.writer = writer
+        self.mwriter = mwriter
+
+
+class ObjectReadContributeNode(ObjectEvent):
+    """ Read a contribute entry. """
+    implements(IObjectReadContributeNode)
+
+    def __init__(self, object, metadata, source, value, vlist, date):
+        super(ObjectReadContributeNode, self).__init__(object)
+        self.metadata = metadata
+        self.source = source
+        self.value = value
+        self.vlist = vlist
+        self.date = date
+
+
+class ObjectCreateObject(ObjectEvent):
+    """ Creates an object from manifest data. """
+    implements(IObjectCreateObject)
+
+    def __init__(self, object, rtype, resource, data, metadata):
+        super(ObjectCreateObject, self).__init__(object)
+        self.rtype = rtype
+        self.resource = resource
+        self.data = data
+        self.metadata = metadata
+        
+
+class ObjectTransformPackage(ObjectEvent):
+    """ Transform an IMS package to a format we can consume. """
+    implements(IObjectTransformPackage)
+
+    def __init__(self, context, manifest, package_type, xformdata):
+        super(ObjectTransformPackage, self).__init__(object)
+        self.context = context
+        self.manifest = manifest
+        self.package_type = package_type
+        self.xformdata = xformdata
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/ManifestHandlers.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/ManifestHandlers.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/ManifestHandlers.py	(revision 712)
@@ -0,0 +1,652 @@
+#################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+
+
+from zope.event import notify
+from Products.CMFCore.utils import UniqueObject, getToolByName
+from ManifestEvents import ObjectWriteContributeNode, ObjectReadContributeNode, \
+                           ObjectTransformPackage
+from IMS_exceptions import ManifestError
+import string
+from mimetypes import guess_type
+import re
+from xml.dom import minidom
+import os
+
+
+RE_BODY = re.compile('<body[^>]*?>(.*)</body>', re.DOTALL )
+LOM_version = 'LOMv1.0'
+LOM_namespace = 'http://www.imsglobal.org/xsd/imsmd_v1p2'
+
+def setNameSpaces(event):
+    """ Set name spaces for manifest file. """
+    event.writer.addNamespace(('xmlns:imsmd', LOM_namespace),
+                              'http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p4.xsd',
+                              (os.sep.join(['collective.imstransport','collective','imstransport','IMS']), 'imsmd_v1p2p4.xsd'))
+
+class WriteLOMMetadata:
+    """ Handle a write LOM metadata event, and write the metadata for an object. """
+
+    def __call__(self, event):
+        """ Catch the write metadata event. """
+        self.writeMetadata(event.object, event.node, event.writer)
+
+
+    def writeMetadata(self, object, node, writer):
+        """ Write out the metadata. """
+
+        rights_holder = object.portal_properties.site_properties.getProperty('rights_holder')
+        rights_holder_email = object.portal_properties.site_properties.getProperty('rights_holduer_email')
+        language = self.getLanguage(object)
+        
+        # LOM Node
+        lom_node = writer._createNode(node,
+                                      LOM_namespace,
+                                      'lom',
+                                      attrs=[('xmlns', LOM_namespace)])
+
+        # General Node
+        general_node = writer._createNode(lom_node, LOM_namespace, 'general')
+        writer._createNode(general_node, LOM_namespace, 'identifier', object.getId())
+        title_node = writer._createNode(general_node, LOM_namespace, 'title')
+        writer._createNode(title_node,
+                           LOM_namespace,
+                           'langstring',
+                           object.Title(),
+                           [('xml:lang', language)])
+        if language:
+            writer._createNode(general_node, LOM_namespace, 'language', language)
+        description = object.Description()
+        if description:
+            desc_node = writer._createNode(general_node, LOM_namespace, 'description')
+            writer._createNode(desc_node,
+                               LOM_namespace,
+                               'langstring',
+                               description,
+                               [('xml:lang', language)])
+        keywords = object.Subject()
+        if keywords:
+            keyword_node = writer._createNode(general_node, LOM_namespace, 'keyword')
+            for kw in keywords:
+                writer._createNode(keyword_node,
+                                   LOM_namespace,
+                                   'langstring',
+                                   kw,
+                                   [('xml:lang', language)])
+
+        # Lifecycle Node
+        lifecycle_node = writer._createNode(lom_node, LOM_namespace, 'lifecycle')
+        notify(ObjectWriteContributeNode(object, lifecycle_node, writer, self))
+                                     
+        # Meta-Metadata Node
+        metametadata_node = writer._createNode(lom_node, LOM_namespace, 'metametadata')
+        catalog_node = writer._createNode(metametadata_node, LOM_namespace, 'catalogentry')
+        writer._createNode(catalog_node,
+                           LOM_namespace,
+                           'catalog',
+                           '%s,%s' %(object.portal_url(),
+                                     object.portal_url.getPortalObject().getProperty('email_from_address')))
+        entry_node = writer._createNode(catalog_node, LOM_namespace, 'entry')
+        writer._createNode(entry_node,
+                           LOM_namespace,
+                           'langstring',
+                           object.id,
+                           [('xml:lang', 'x-none')])
+        contributors = object.Contributors()
+        if contributors:
+            self.createContributeElement(writer,
+                                         LOM_namespace,
+                                         metametadata_node,
+                                         LOM_version,
+                                         'creator',
+                                         contributors,
+                                         object.ModificationDate())        
+        writer._createNode(metametadata_node, LOM_namespace, 'metadatascheme', LOM_version)
+        if language:
+            writer._createNode(metametadata_node, LOM_namespace, 'language', language)
+
+        # Technical Node
+        technical_node = writer._createNode(lom_node, LOM_namespace, 'technical')
+        writer._createNode(technical_node, LOM_namespace, 'format', object.Format())
+        writer._createNode(technical_node, LOM_namespace, 'size', self.getObjSize(object))
+        writer._createNode(technical_node, LOM_namespace, 'location', object.renderBase())
+
+        # Rights Node
+        rights_node = writer._createNode(lom_node, LOM_namespace, 'rights')
+        copyright_other_node = writer._createNode(rights_node,
+                                                  LOM_namespace,
+                                                  'copyrightandotherrestrictions')
+        source_node = writer._createNode(copyright_other_node, LOM_namespace, 'source')           
+        writer._createNode(source_node,
+                           LOM_namespace,
+                           'langstring',
+                           LOM_version,
+                           [('xml:lang', 'x-none')])
+        value_node = writer._createNode(copyright_other_node, LOM_namespace, 'value')
+        writer._createNode(value_node,
+                           LOM_namespace,
+                           'langstring',
+                           'yes',
+                           [('xml:lang', 'x-none')])
+        description_node = writer._createNode(rights_node, LOM_namespace, 'description')
+        writer._createNode(description_node,
+                           LOM_namespace,
+                           'langstring',
+                           self.getCopyrightString(object.Rights(), rights_holder, rights_holder_email),
+                           [('xml:lang', 'x-none')])
+
+    def createContributeElement(self, writer, nspace, lc_node, source, value, entities, date, email=None):
+        """
+           Create a LOM contribute node in the form
+
+               <imsmd:contribute>
+                   <imsmd:role>
+                       <imsmd:source>
+                           <imsmd:langstring xml:lang="x-none">
+                               LOMv1.0
+                           </imsmd:langstring>
+                       </imsmd:source>
+                       <imsmd:value>
+                           <imsmd:langstring xml:lang="x-none">
+                               author
+                           </imsmd:langstring>
+                       </imsmd:value>    
+                   </imsmd:role>
+                   <imsmd:centity>
+                       <imsmd:vcard>
+                           BEGIN:
+                               NAME: Me
+                           END:
+                       </imsmd:vcard>
+                   </imsmd:centity>
+                   <imsmd:date>
+                       <imsmd:datetime>
+                           2006-01-01
+                       </imsmd:datetime>
+                   </imsmd:date>
+               </imsmd:contribute>
+        """
+        contribute_node = writer._createNode(lc_node, nspace, 'contribute')
+        role_node = writer._createNode(contribute_node, nspace, 'role')
+        source_node = writer._createNode(role_node, nspace, 'source')
+        writer._createNode(source_node,
+                           nspace,
+                           'langstring',
+                           source,
+                           [('xml:lang', 'x-none')])
+        value_node = writer._createNode(role_node, nspace, 'value')
+        writer._createNode(value_node,
+                           nspace,
+                           'langstring',
+                           value,
+                           [('xml:lang', 'x-none')])
+        if entities:
+            if type(entities) not in [type([]), type(())]:
+                entities = [entities]
+            for e in entities:
+                centity_node = writer._createNode(contribute_node, nspace, 'centity')
+                writer._createNode(centity_node,
+                                   nspace,
+                                   'vcard',
+                                   self.createVCard(e, email))
+        if date:
+            date_node = writer._createNode(contribute_node, nspace, 'date')
+            writer._createNode(date_node, nspace, 'datetime', date)
+
+    def createVCard(self, name, email=None):
+         """
+         Writes out a VCard entry for a contribute element
+
+         Note: Should replace this with the python vcard library.
+
+         """
+         vCard = 'BEGIN:VCARD\n'
+         vCard += 'FN:'+name+'\n'
+         if email:
+             vCard += 'EMAIL;INTERNET:'+email+'\n'
+         vCard += 'END:VCARD'
+         return vCard
+
+    def getObjSize(self, object):
+        """ Retrieves the correct size of the object"""
+        return '%d' %object.get_size()
+
+    def getLanguage(self, object):
+        """ Get Language setting """
+        lang = object.Language()
+        if not lang:
+            lang = object.portal_properties.site_properties.getProperty('default_language')
+        return lang
+
+    def getCopyrightString(self, copyright, rights_holder, rights_holder_email):
+        cp = ''
+        if copyright:
+            cp += copyright
+        if rights_holder:
+            if cp:
+                cp += ', '
+            cp += rights_holder
+        if rights_holder_email:
+            if cp:
+                cp += ', '
+            cp += rights_holder_email
+        return cp
+            
+         
+WriteLOMMetadataHandler = WriteLOMMetadata()
+
+
+class WriteOrganizations:
+    """ Handle a write organizations event, and write the organization information."""
+    
+    def __call__(self, event):
+        """ Catch the write metadata event. """
+        self._writeOrganizations(event.object, event.node, event.writer)
+        
+    def _writeOrganizations(self, object, node, writer):
+        """ Write items that should appear in the navigation within the organizations section """
+        pass
+
+
+        
+WriteOrganizationsHandler = WriteOrganizations()
+
+
+class ReadOrganizations:
+    """ Handle a read organizations event, and read the organization information."""
+    
+    def __call__(self, event):
+        """ Catch the read metadata event. """
+        self._readOrganizations(event.object, event.org, event.node, event.reader)
+
+    def _readOrganizations(self, object, org, node, reader):
+        """ Handle read organizations event. """
+        default = node.getAttribute('default')
+        organization_nodes = 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')
+                    org[idref] = itemnum
+                    itemnum += 1
+
+
+ReadOrganizationsHandler = ReadOrganizations()
+
+
+class ReadLOMMetadata:
+    """ Handle a read LOM metadata event, and read the metadata for an object. """
+
+    def __call__(self, event):
+        self.readMetadata(event.object,
+                          event.metadata,
+                          event.node,
+                          event.reader,
+                          event.mdSections,
+                          event.resid)
+
+    def readMetadata(self, object, metadata, node, reader, mdSections, resid):
+        """ Create an object and set the metadata on it. """
+
+        mdSections.append(LOM_version)
+
+        if node.nodeName in ['lom', 'imsmd:lom']:
+
+            gen_nodes = node.getElementsByTagNameNS(LOM_namespace, 'general')
+            if gen_nodes:
+                self.readGeneral(object, metadata, gen_nodes[0], reader, resid)
+            else:
+                raise ManifestError, 'No "general" tag found in metadata section for resource %s.' %resid
+
+            lifecycle_nodes = node.getElementsByTagNameNS(LOM_namespace, 'lifecycle')
+            if lifecycle_nodes:
+                self.readLifecycle(object, metadata, lifecycle_nodes[0], reader, resid)
+
+            metametadata_nodes = node.getElementsByTagNameNS(LOM_namespace, 'metametadata')
+            if metametadata_nodes:
+                self.readMetametadata(object, metadata, metametadata_nodes[0], reader)
+
+            technical_nodes = node.getElementsByTagNameNS(LOM_namespace, 'technical')
+            if technical_nodes:
+                self.readTechnical(object, metadata, technical_nodes[0], reader, resid)
+
+            rights_nodes = node.getElementsByTagNameNS(LOM_namespace, 'rights')
+            if rights_nodes:
+                self.readRights(object, metadata, rights_nodes[0], reader)
+
+
+    def readGeneral(self, object, metadata, node, reader, resid):
+        """ Read general node """
+
+        title_nodes = node.getElementsByTagNameNS(LOM_namespace, 'title')        
+        if title_nodes:
+            langstring_nodes = title_nodes[0].getElementsByTagNameNS(LOM_namespace,
+                                                                     'langstring')
+            if langstring_nodes:
+                title = reader.getTextValue(langstring_nodes[0])
+                if title:
+                    metadata['title'] = title
+        
+        if not metadata.has_key('title'):
+            raise ManifestError, 'Required tag "title" missing in lom/general metadata section for resource %s.' %resid
+
+        language_nodes = node.getElementsByTagNameNS(LOM_namespace, 'language')
+        if language_nodes:
+            lang = reader.getTextValue(language_nodes[0])
+            if lang:
+                metadata['language'] = lang
+
+        desc_nodes = node.getElementsByTagNameNS(LOM_namespace, 'description')
+        if desc_nodes:
+            langstring_nodes = desc_nodes[0].getElementsByTagNameNS(LOM_namespace,
+                                                                    'langstring')
+            if langstring_nodes:
+                description = reader.getTextValue(langstring_nodes[0])
+                if description:
+                    metadata['description'] = description
+
+        kw_nodes = node.getElementsByTagNameNS(LOM_namespace, 'keyword')
+        if kw_nodes:
+            kw_lang_nodes = kw_nodes[0].getElementsByTagNameNS(LOM_namespace,'langstring')
+            if kw_lang_nodes:
+                kw_list = []
+                for lang_node in kw_lang_nodes:
+                    kw = reader.getTextValue(lang_node)
+                    if kw:
+                        kw_list.append(kw)
+            if kw_list:
+                metadata['subject'] = kw_list
+
+
+    def readLifecycle(self, object, metadata, node, reader, resid):
+        """ Read Lifecycle node """
+        # Lifecycle Node
+        contribute_nodes = node.getElementsByTagNameNS(LOM_namespace, 'contribute')
+        
+        # For each contribute node there is a role node, a centity node, and possibly a date node
+        for contribute_node in contribute_nodes:
+            source = ''
+            value = ''
+            vlist = []
+            date = ''
+            
+            role_nodes = contribute_node.getElementsByTagNameNS(LOM_namespace, 'role')
+            if role_nodes:
+                source_nodes = role_nodes[0].getElementsByTagNameNS(LOM_namespace, 'source')
+                if source_nodes:
+                    langstring_nodes = source_nodes[0].getElementsByTagNameNS(LOM_namespace, 'langstring')
+                    if langstring_nodes:
+                        source = reader.getTextValue(langstring_nodes[0])
+                value_nodes = role_nodes[0].getElementsByTagNameNS(LOM_namespace, 'value')
+                if value_nodes:
+                    langstring_nodes = value_nodes[0].getElementsByTagNameNS(LOM_namespace, 'langstring')
+                    if langstring_nodes:
+                        value = reader.getTextValue(langstring_nodes[0])
+
+            centity_nodes = contribute_node.getElementsByTagNameNS(LOM_namespace, 'centity')
+            for centity_node in centity_nodes:
+                for cnode in centity_node.childNodes:
+                    if cnode.nodeType == cnode.ELEMENT_NODE:
+                        name, email = reader.getVcardValues(cnode, resid)
+                        if value:
+                            vlist.append((name, email))
+                
+            date_nodes = contribute_node.getElementsByTagNameNS(LOM_namespace, 'date')
+            if date_nodes:
+                datetime_nodes = date_nodes[0].getElementsByTagNameNS(LOM_namespace, 'datetime')
+                if datetime_nodes:
+                    datetime = reader.getTextValue(datetime_nodes[0])
+
+            notify(ObjectReadContributeNode(object, metadata, source, value, vlist, date))
+            
+
+    def readMetametadata(self, object, metadata, node, reader):
+        """ Read Meta-metadata node """
+        pass
+
+    def readTechnical(self, object, metadata, node, reader, resid):
+        """ Read Technical node """
+        format_nodes = node.getElementsByTagNameNS(LOM_namespace, 'format')
+        if format_nodes:
+            format = reader.getTextValue(format_nodes[0])
+            if format:
+                metadata['Format'] = format
+        #if not metadata.has_key('Format'):
+        #    raise ManifestError, \
+        #          'Required tag "format" missing in lom/technical metadata section for resource %s.' %resid
+        
+    def readRights(self, object, metadata, node, reader):
+        """ Read Rights node """
+        
+        description_nodes = node.getElementsByTagNameNS(LOM_namespace,'description')
+        if description_nodes:
+            langstring_nodes = description_nodes[0].getElementsByTagNameNS(LOM_namespace,'langstring')
+            if langstring_nodes:
+                description = reader.getTextValue(langstring_nodes[0])
+                if description:
+                    metadata['rights'] = description
+
+
+        
+ReadLOMMetadataHandler = ReadLOMMetadata()
+
+
+def writeContributeNode(event):
+    """ Write a LOM contribute node. """
+    creators = event.object.Creators()
+    if creators:
+        event.mwriter.createContributeElement(event.writer,
+                                              LOM_namespace,
+                                              event.node,
+                                              LOM_version,
+                                              'author',
+                                              creators,
+                                              event.object.ModificationDate())
+    contributors = event.object.Contributors()
+    if contributors:
+        event.mwriter.createContributeElement(event.writer,
+                                              LOM_namespace,
+                                              event.node,
+                                              LOM_version,
+                                              'unknown',
+                                              contributors,
+                                              event.object.ModificationDate())
+    
+
+
+def readContributeNode(event):
+    """ Read a LOM contribute Node. """
+
+    if LOM_version == event.source:
+
+        # Creator
+        if 'author' == event.value.lower() and event.vlist:
+            event.metadata['creators'] = [x[0] for x in event.vlist]
+            if event.date:
+                event.metadata['creation_date'] = event.date
+
+        # Contributors
+        if 'unknown' == event.value.lower() and event.vlist:
+            event.metadata['contributors'] = [x[0] for x in event.vlist]
+
+
+
+class createObjects:
+    """ Create new objects. """
+
+    def __init__(self):
+        pass
+
+    def __call__(self, event):
+        if 'IMSTransport' == 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
+        objtype = self.getObjectType(filepath, metadata)
+        parent = self.createFolders(filepath, objtype, object)
+        newobj = self.getNewObject(filepath, objtype, object, parent)
+        self.setObjectData(filepath, objtype, object, newobj, data, metadata)
+                 
+
+    def getObjectType(self, filepath, metadata):
+        """ Get the type of the object. """
+
+        objtype='File'
+        if metadata.has_key('Type'):
+            # Get type from resource metadata
+            objtype = metadata['Type']
+        elif metadata.has_key('ResType'):
+            # Get type from resource tag
+            objtype = metadata['ResType']
+        else:
+            # Get object type from mimetype
+            if metadata.has_key('Format'):
+                # Get the mimetype out of this field
+                restype = metadata['Format']
+            else:
+                # Get the mimetype from the mimetype library
+                restype = guess_type(filepath)[0]
+            if restype:
+                # Set object type based on mimetype
+                if restype in ['text/html', 'text/htm' 'text/plain' 'text/x-rst', 'text/structured']:
+                    objtype = 'Document'
+                elif re.match('^image', restype):
+                    objtype = 'Image'
+                else:
+                    objtype = 'File'
+
+        return objtype
+                
+            
+    def createFolders(self, filepath, objtype, object):
+        """ Create folders for the object if they do not already exist. """
+        parent = object
+
+        if objtype != 'Folder':
+            # Get the ZODB path, create folders if they do not exist
+            for p in filepath.split('/')[:-1]:
+                newparent = getattr(parent.aq_inner.aq_explicit, p, None)
+                if newparent:
+                    parent = newparent
+                else:
+                    parent = self.createFolder(parent, p)
+                    parent.title = parent.id
+
+        return parent
+
+
+    def getNewObject(self, filepath, objtype, object, parent):
+        """ Get the new object if it exists, otherwise create it. """
+        id = filepath.split('/')[-1]
+        newobj = None
+        if parent == object and object.portal_type == objtype:
+            newobj = object
+        elif getattr(parent.aq_explicit, id, None):
+            # 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 one
+        if not newobj:
+            parent.invokeFactory(objtype, id)
+            newobj = getattr(parent, id)
+            newobj = object.portal_factory.doCreate(newobj, id)
+
+        return newobj
+
+
+    def setObjectData(self, filepath, objtype, object, newobj, data, metadata):
+        """ Set the file data on the object. """
+        if objtype == 'Document':
+            if metadata.has_key('Format'):
+                fmt = metadata['Format']
+            else:
+                fmt = guess_type(filepath)[0]
+            newobj.setText(data, mimetype=fmt, filename=filepath.split('/')[-1])           
+        elif 'File' == objtype:
+            newobj.setFile(data)
+        elif 'Image' == objtype:
+            newobj.setImage(data)
+        elif 'Link' == objtype:
+            newobj.setRemoteUrl(data)
+        
+        # Set the metadata on the object
+        for key in metadata.keys():
+            field = newobj.getField(key)
+            if field:
+                mutator = field.getMutator(newobj)
+                if mutator:
+                    if field.__name__ == 'excludeFromNav':
+                        mutator('False')
+                    else:
+                        mutator(metadata[key])
+                    
+        # Reindex the object so that the new stuff appears
+        object.portal_catalog.reindexObject(newobj, object.portal_catalog.indexes() )
+
+
+    def createFolder(self, parent, id):
+        """ Create a folder """
+
+        parent.invokeFactory('Folder',id)
+        obj = getattr(parent, id)
+        obj.setExcludeFromNav(True)
+        obj.setTitle(id)
+        obj = parent.portal_factory.doCreate(obj, id)
+        
+        parent.portal_catalog.reindexObject(obj, parent.portal_catalog.indexes())
+
+        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
+
+DefaultCreateObjects = createObjects()
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/README.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/README.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/README.txt	(revision 712)
@@ -0,0 +1,49 @@
+IMS Transport Tool 
+------------------ 
+by the `Center for Open Sustainable Learning`_ at Utah State University. 
+
+.. _`Center for Open Sustainable Learning`: http://cosl.usu.edu 
+
+The IMS Transport Tool allows Plone users to upload content in the form of an IMS package.
+Although preliminary support is included for popular proprietary
+learning management system packages, support for extending this product
+to handle the import or export of any IMS package is also included.
+
+What's New
+---------- 
+
+
+Installation 
+------------ 
+
+For full installation instructions see the "INSTALL.txt" file.
+
+
+
+Features 
+-------- 
+
+  * Experimental support for importing MIT CP into Plone.
+
+  * Experimental support for importing Web CT and Blackboard IMS packages into Plone. 
+  
+  * Uses Zope 3 events. 
+  
+  * Uses a two stage processing engine, which allows transforms over existing IMS
+    package manifests to be rewritten into a common format. 
+
+  * Maps LOM metadata to Dublin Core fields used in Plone objects. 
+
+  * Easily extensible. 
+
+Requires 
+-------- 
+
+  * Plone 3.0.0 and greater
+  
+  * Zope 2.10.4 and greater
+
+  * BeautifulSoup 3.0.4
+
+
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/TransformHandlers.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/TransformHandlers.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/TransformHandlers.py	(revision 712)
@@ -0,0 +1,428 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+
+
+from zope.event import notify
+from Products.CMFCore.utils import UniqueObject, getToolByName
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from config import WWW_DIR
+from ManifestEvents import ObjectWriteContributeNode, ObjectReadContributeNode, ObjectTransformPackage
+from IMS_exceptions import ManifestError
+import string
+import mimetypes
+import re
+from xml.dom import minidom
+from xml.xpath import Evaluate
+import os
+from libxslt import parseStylesheetDoc
+from libxml2 import readFile, parseDoc
+import mimetypes
+from zope.component import getUtility
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+
+
+class WebCTTransform:
+    """ Transform WebCT content. """
+    
+    def __call__(self, event):
+        if 'WebCT CE 6.0' == event.package_type[0]:
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        self.getFileData(manifest, xformdata, context)
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+        
+    def evaluateExpressionNs(self,doc,nslist,expression):
+
+        xc = doc.xpathNewContext()
+        
+        for ns in nslist:
+            xc.xpathRegisterNs(ns[0],ns[1])        
+            
+        mods = xc.xpathEval(expression)
+            
+        return mods
+
+    def getFileData(self, manifest, xformdata, context):
+        
+        doc = parseDoc(manifest)
+        xc = doc.xpathNewContext()
+        xc.xpathRegisterNs("imsct","http://www.imsproject.org/content")
+        xc.xpathRegisterNs("lom","http://www.imsproject.org/metadata")
+        
+        modules = xc.xpathEval('/imsct:manifest/imsct:manifest')
+        
+        fdata = {}
+        filename = ''
+
+        
+        for module in modules:
+           
+            xc.setContextNode(module)
+            manifest_type = xc.xpathEval('.//lom:learningresourcetype/lom:value/lom:langstring')[0].getContent()
+            manifest_title = xc.xpathEval('.//lom:general/lom:title/lom:langstring')[0].getContent()
+            manifest_id = xc.xpathEval('.')[0].hasProp('identifier').getContent()
+            
+            if manifest_type == 'Content Module':
+                
+                tabletitle = manifest_title
+                items = []
+
+                xc.setContextNode(module)
+                web_nodes = xc.xpathEval('imsct:resources//imsct:resource[@type=\"webcontent\"]')
+
+                for web_node in web_nodes:
+                    
+                    
+                    id = web_node.hasProp('identifier').getContent()
+                    refname = ''
+                    
+                    xc.setContextNode(web_node)
+                    file_node = xc.xpathEval("imsct:file")
+                    title = xc.xpathEval("//imsct:item[@identifierref=\"" + id + "\"]/imsct:title")[0].getContent()
+                    
+                    if file_node:
+                        refname = file_node[0].hasProp('href').getContent()
+                                              
+                        if not title:
+                            title = refname
+    
+                        items.append((refname, title))
+
+                ims_util = getUtility(IIMSTransportUtility)
+                body = ims_util.tocpage(tabletitle=tabletitle, tocitems=items)
+                fdata[manifest_id + '.html'] = body
+                    
+                
+            elif manifest_type == 'URL':
+                data = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+                xc.setContextNode(module)
+                url_title = xc.xpathEval("imsct:metadata//lom:title/lom:langstring")[0].getContent()
+                url_filename = xc.xpathEval("imsct:resources/imsct:resource")[0].hasProp('identifier').getContent() + '.html'
+                refname = xc.xpathEval("imsct:resources/imsct:resource/imsct:file")[0].hasProp('href').getContent() 
+                
+                data += "<a href =\"%s\">%s</a>" %(refname,url_title)
+                
+                fdata[url_filename] = data
+                
+                
+            elif manifest_type == 'Glossary':
+                xc.setContextNode(module)
+                res_node = xc.xpathEval('imsct:resources//imsct:resource')[0]
+                xc.setContextNode(res_node)
+                hrefname = xc.xpathEval('imsct:file')[0].hasProp('href').getContent()
+
+                data = context.source.readFile(hrefname)
+                data = context.performTransform(data, ['WebCT Glossary', 'WebCT_glossary_xform.xsl'])
+                filename = string.join(hrefname.split('.')[:-1],'.') + '.html'
+
+                fdata[filename] = data
+                
+                
+            elif manifest_type == 'Image Database':
+
+                xc.setContextNode(module)
+                web_nodes = xc.xpathEval('imsct:resources//imsct:resource')
+
+                for web_node in web_nodes:
+                    db_path = web_node.hasProp('href').getContent()
+                    xc.setContextNode(web_node)
+                    file_nodes = xc.xpathEval('imsct:file')
+                    
+                    for file_node in file_nodes:
+                        hrefname = file_node.hasProp('href').getContent()
+                        
+                        if db_path == hrefname:
+                            
+                            items=[]
+                            data = context.source.readFile(hrefname)
+                            doc = parseDoc(data)
+                            xcim = doc.xpathNewContext()
+                            xcim.xpathRegisterNs("didl","http://www.mpeg.org/mpeg-21/2002/01-DIDL-NS")
+                            tabletitle = xcim.xpathEval('/didl:DIDL/didl:CONTAINER/didl:DESCRIPTOR/didl:STATEMENT')[0].getContent()
+                            containers = xcim.xpathEval('/didl:DIDL/didl:CONTAINER/didl:CONTAINER')
+
+                            
+                            for container in containers:
+                                xcim.setContextNode(container)
+                                title = xcim.xpathEval('didl:DESCRIPTOR/didl:STATEMENT')
+                                if title:
+                                    title = title[0].getContent()
+                                refs = xcim.xpathEval('didl:REFERENCE')
+                                
+                                if refs:
+                                    for ref in refs:
+                                        urifile = string.replace(ref.hasProp('URI').getContent(),'.xml','.html')
+                                        items.append((urifile, title))
+                                    
+                            filename = string.join(hrefname.split('.')[:-1],'.') + '.html'
+                            ims_util = getUtility(IIMSTransportUtility)
+                            body = ims_util.tocpage(tabletitle=tabletitle, tocitems=items)
+                            
+                            fdata[filename] = body
+                            
+                        elif re.compile('\.xml$').search(hrefname,1):
+                            data = context.source.readFile(hrefname)
+                            data = context.performTransform(data, ['WebCT Images', 'WebCT_image_xform.xsl'])
+                            filename = string.join(hrefname.split('.')[:-1],'.') + '.html'
+
+                            fdata[filename] = data
+                    
+        xformdata['filedata'] = fdata
+
+
+WebCTTransformHandler = WebCTTransform()
+
+
+class BlackboardTransform:
+    """ Transfrom Blackboard content. """
+
+    def __call__(self, event):
+        if 'Blackboard 6.1/7.0' == event.package_type[0]:
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        """ Transform the blackboard package into something we can consume. """
+        xformdata['filedata'] = {}
+        self.getFileData(context, manifest, xformdata['filedata'])
+        self.getNavigationData(context, manifest, xformdata['filedata'])
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+
+    def getFileData(self, context, manifest, filedata):
+        """ Blackboard stores all its documents in XML format. Get these
+            documents and transform them into HTML. """
+        files = context.source.listFiles()
+        for fn in files:
+            if 'dat' == fn.split('.')[-1]:
+                data = context.source.readFile(fn)
+                doc = parseDoc(data)
+                root = doc.getRootElement()
+                if 'CONTENT' == root.name:
+                    id = fn.split('.')[0]
+                    docfn = id + '.html'
+                    data = context.performTransform(data, ['Blackboard Content', 'Blackboard_content_import_xform.xsl'])
+                    data = data.replace('@X@EmbeddedFile.location@X@', '%s/embedded/' %id)
+                    filedata[docfn] = data.replace('@X@LOCALFOLDERLOCATION@X@', '%s/' %id)
+
+    def getNavigationData(self, context, manifest, filedata):
+        """ Blackboard embeds its navigation structure in the Organizations section
+            of the manifest. Create documents with links to the resources so that
+            eduCommons can recreate the navigation structure. """
+        doc = parseDoc(manifest)
+        nodes = doc.xpathEval('/manifest/organizations/organization/item')
+        for n in nodes:
+            tabletitle = n.xpathEval('title')[0].get_content()
+            items = []
+            for item in n.xpathEval('.//item'):
+                id = '%s.html' %(item.prop('identifierref'))
+                title = item.xpathEval('title')[0].get_content()
+                if filedata.has_key(id) and filedata[id]:
+                    items.append((id, title))
+            if items:
+                ims_util = getUtility(IIMSTransportUtility)
+                body = ims_util.tocpage(tabletitle=tabletitle, tocitems=items)
+                filedata[n.prop('identifierref') + '.html'] = body
+    
+
+BlackboardTransformHandler = BlackboardTransform()
+
+#Currently not supported
+class eXeTransform:
+    """ Transform eXe content. """
+
+    def __call__(self, event):
+        if 'eXe' == event.package_type[0]:
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+
+eXeTransformHandler = eXeTransform()
+
+#Currently not supported
+class MITTransform:
+    """ Transform MIT content. """
+
+    def __init__(self):
+        self.toc = []
+        self.base = ''
+
+    def __call__(self, event):
+        if 'MIT OCW' == event.package_type[0]:
+            self.toc = []
+            self.base = ''
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        xformdata['filedata'] = {}
+        manifest = self.parseMITManifest(context, manifest, xformdata['filedata'])
+        self.setMITPageBody(context, xformdata['filedata'])
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+
+    def setMITPageBody(self, context, fdata):
+        """ Set the body text for a file. Strips out MIT header and navigation bar """
+        fns = context.source.listFiles()
+        for fn in fns:
+            import os
+            mimetype = mimetypes.guess_type(fn)
+            textDoc = ''
+            if mimetype:
+                if mimetype[0]:
+                    textDoc = mimetype[0].split('/')[0]
+
+            if fn[-1] != os.sep and textDoc == 'text':
+                data = context.source.readFile(fn)
+                from BeautifulSoup import BeautifulSoup
+                soup = BeautifulSoup(data)
+                
+                ftext = ''
+                if soup.findAll('div',attrs={'class':'maincontent'}):
+                    bc = soup.findAll('div',attrs={'class':'bread-crumb'})
+                    if bc:
+                        titleTag = bc[0].nextSibling.nextSibling
+                        bc[0].extract()
+                        if titleTag.name == 'h1':
+                            titleTag.extract()
+                        ftext = str(soup.findAll('div',attrs={'class':'maincontent'})[0])
+                
+                if not ftext:
+                    tbls = soup('table')
+                    for tbl in tbls:
+                        if tbl.has_key('summary'):
+                            summary = tbl['summary']
+                            if summary.find('Main Content Header') > 0:
+                                ftext = str(tbl)
+
+                if ftext:
+                    fdata[fn] = ftext
+            
+    def parseMITManifest(self, context, manifest, fdata):
+        """ Parses and modifies MITManifest where necessary """
+        
+        title = ''
+        doc = parseDoc(manifest)
+        xc = doc.xpathNewContext()
+        self.setMITNamespaces(xc)
+        self.parseMITResources(context, xc, fdata)
+
+        return doc.serialize()
+
+    def setMITNamespaces(self,xc):
+        """ Set the MIT specific namespaces """
+        xc.xpathRegisterNs("mitcp","http://www.imsglobal.org/xsd/imscp_v1p1")
+        xc.xpathRegisterNs("adlcp","http://www.adlnet.org/xsd/adlcp_rootv1p2")
+        xc.xpathRegisterNs("ocw","http://ocw.mit.edu/xmlns/ocw_imscp")
+        xc.xpathRegisterNs("lom","http://ocw.mit.edu/xmlns/LOM")
+
+    def parseMITResources(self, context, xc, fdata):
+        """ Parse each of the MIT Resource objects """
+        resources = xc.xpathEval('/mitcp:manifest/mitcp:resources/mitcp:resource')
+        self.base = xc.xpathEval("//@xml:base")[0].getContent()
+        for resource in resources:
+            xc.setContextNode(resource)
+            resid = resource.hasProp('identifier').getContent()
+            self.addMITTocEntry(xc,resid)
+            self.updateMITMetadata(xc,context,resid)
+
+        self.createMITTocPage(context, "Table of Contents", self.toc,  fdata)
+
+    def updateMITMetadata(self,xc,context,resid):
+        """ Updates the MIT Manifest with lom object contained in separate xml files """
+        resources = xc.xpathEval("//mitcp:resource[@identifier='" + resid +"']")
+        if resources:
+            xc.setContextNode(resources[0])
+            locations = xc.xpathEval("./mitcp:metadata/adlcp:location")
+            if locations:
+                location = self.base + locations[0].getContent()
+                zf = context.source.readFile(location)
+
+                if zf:
+                    zfdoc = parseDoc(zf)
+                    zfxc = zfdoc.xpathNewContext()
+                    self.setMITNamespaces(zfxc)
+                    mdQuery = xc.xpathEval('//mitcp:resource[@identifier="'+resid+'"]/mitcp:metadata')
+                    if mdQuery:
+                        mdNode = mdQuery[0]
+                        lomNode = zfxc.xpathEval('//lom:lom')
+                        if lomNode:
+                            mdNode.addChild(lomNode[0])
+                    
+#                    self.setMITKeywords(mdNode,zfxcring"))
+#                    self.setMITTerm(xc,self.getMITMetadata(zfxc,"//lom:lifeCycle/lom:version/lom:string"))
+#                    self.setMITCreators(mdNode,zfxc,"//[contains(text(),'Author')]/parent::node()/parent::node()/lom:entity"))
+#                    self.setMITCreators(mdNode,zfxc)
+#                    self.setMITDescription(xc,self.getMITMetadata(zfxc,"//lom:general/lom:description/lom:string"))
+                             
+    def addMITTocEntry(self,xc,resid):
+        """ Add a table of contents entry """
+        tocref = ''
+        files = xc.xpathEval("./mitcp:file")
+
+        if len(files) == 1:
+            thref = xc.xpathEval("./mitcp:file/@href")
+            if thref:
+                tocref = self.base + thref[0].getContent()
+                    
+        items = xc.xpathEval('/mitcp:manifest/mitcp:organizations//mitcp:item[@identifierref="' + resid + '"]')
+
+        for item in items:
+            xc.setContextNode(item)
+            title = self.getMITItemTitle(xc,item,resid)
+            # All files that have  ocw:sectionTemplateType are visible
+            isvis = xc.xpathEval('@ocw:sectionTemplateType')
+            if isvis and tocref:
+                if isvis[0].getContent() != '':
+                    self.toc.append((tocref,title))
+                
+    def createMITTocPage(self, context, tabletitle, tocitems, fdata):
+        """ Creates the MIT Table of Contents Page """
+        if not tocitems:
+            tocitems.append(('','Home'))
+
+        ims_util = getUtility(IIMSTransportUtility)
+        body = ims_util.tocpage(tabletitle="Table of Contents", tocitems=tocitems)
+        fdata['index.html'] = body
+
+    def getMITItemTitle(self,xc,item,id):
+        """ Get the title of the item, if there is none, then return the id """
+        
+        titles = xc.xpathEval("mitcp:title")
+        title = ''
+        if titles:
+            title = titles[0].getContent()
+        else:
+            title = id
+
+        return title
+        
+    def getMITMetadata(self, xc, xpathQuery):
+        mds = xc.xpathEval(xpathQuery)
+        if mds:
+            return [md.getContent() for md in mds]
+        else:
+            return []
+
+MITTransformHandler = MITTransform()
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/__init__.py	(revision 712)
@@ -0,0 +1,38 @@
+##################################################################################
+#
+#    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
+#
+##################################################################################
+
+__version__ = "$Revision: 2618 $"[11:-2]
+
+
+from Globals import package_home
+from Products.CMFCore import utils, permissions, DirectoryView
+from Products.CMFPlone.utils import ToolInit
+from Products.Archetypes.public import *
+from Products.Archetypes import listTypes
+from Products.Archetypes.utils import capitalize
+from zope.i18nmessageid import MessageFactory
+
+import os, os.path
+
+def initialize(context):
+
+	pass
+
+IMSTransportMessageFactory = MessageFactory('IMSTransport')
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/__init__.py	(revision 712)
@@ -0,0 +1,1 @@
+# Treat folder as product
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/configure.zcml
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/configure.zcml	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/configure.zcml	(revision 712)
@@ -0,0 +1,43 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+	   xmlns:browser="http://namespaces.zope.org/browser"
+           xmlns:five="http://namespaces.zope.org/five"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="IMSTransport">
+
+  <browser:page
+	name="imsimport_form"
+	for="*"
+	class=".imstransportform.ImportForm"
+	permission="zope2.View"
+	/>
+
+  <browser:page
+	name="imsexport_form"
+	for="*"
+	class=".imstransportform.ExportForm"
+	permission="zope2.View"
+	/>
+
+<browser:page
+	name="imschoice_form"
+	for="*"
+	template="imschoice.pt"
+	permission="zope2.View"
+	/>
+
+  <adapter factory=".imstransportform.ImportFormAdapter"
+	   for="Products.ATContentTypes.content.folder.ATFolder"/>
+
+  <adapter factory=".imstransportform.ExportFormAdapter"
+	   for="Products.ATContentTypes.content.folder.ATFolder"/>
+
+  <utility provides="zope.schema.interfaces.IVocabularyFactory"
+           component=".imstransportform.transportVocabulary"
+           name="imsvocab"
+           />
+
+  <five:traversable class="OFS.Application.Application" /> 
+  
+  <five:traversable class="Products.CMFCore.PortalObject.PortalObjectBase" />
+
+</configure>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/imschoice.pt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/imschoice.pt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/imschoice.pt	(revision 712)
@@ -0,0 +1,35 @@
+<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="IMSTransport">
+
+
+<metal:block fill-slot="top_slot" />
+           
+
+<div metal:fill-slot="main">
+
+    <h1 class="documentFirstHeading"
+        i18n:translate="">IMS Import/Export</h1>
+
+    <p><strong i18n:translate="">Import and Export objects using IMS standards.</strong></p>
+
+    <ul><li>
+
+    <a href="@@imsimport_form" i18n:domain="IMSTransport" i18n:translate="">Import IMS Package</a><br />
+            <span class="discreet" i18n:domain="IMSTransport" i18n:translate="">Import an IMS content package.</span></li>
+
+      <li>
+        <a href="@@imsexport_form" i18n:domain="IMSTransport" i18n:translate="">Export IMS Package</a><br />
+            <span class="discreet" i18n:domain="IMSTransport" i18n:translate="">Export an IMS content package.</span></li>
+
+
+</div>
+
+
+</html>
+
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/imstransportform.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/imstransportform.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/browser/imstransportform.py	(revision 712)
@@ -0,0 +1,197 @@
+
+##################################################################################
+#
+#    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.formlib.form import FormFields, action
+from zope.interface import Interface
+from zope import schema
+
+
+from zope.interface import Interface, Attribute
+from zope.component import getUtility
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+from zope.schema.vocabulary import SimpleVocabulary
+from Products.Five.formlib.formbase import EditForm
+from zope.schema._bootstrapinterfaces import WrongType
+from zope.schema.interfaces import IVocabularyFactory
+from zope.schema import TextLine
+
+from Products.CMFDefault.formlib.widgets import ChoiceRadioWidget
+from Products.CMFCore.utils import getToolByName
+from zope.interface import implements
+from zope.app.file.file import File
+from zope.app.file.interfaces import IFile
+from zope.app.form.browser.textwidgets import FileWidget
+from collective.imstransport.Manifest import ZipfileReader, ZipfileWriter
+from zipfile import ZipFile, BadZipfile
+from StringIO import StringIO
+
+from collective.imstransport import IMSTransportMessageFactory as _
+
+
+class ZipFileLine(TextLine):
+
+    def _validate(self, value):
+        try:
+            ZipFile(StringIO(value))
+        except BadZipfile, e:
+            raise WrongType(e)
+
+def transportVocabulary(self):
+
+    defmsg = _(u'Default')
+    if getattr(self,'context',None):
+        ts = getToolByName(self.context,'translation_service')
+        imstransport_prop = self.context.portal_properties.ims_transport_properties
+        import_xforms = imstransport_prop.import_xforms
+
+        items = [(ts.translate(defmsg),u'Default'),]
+        for xform in import_xforms:
+            xform_info = getattr(imstransport_prop,xform)
+            id = xform
+            title = str(xform_info[0])
+            value = (ts.translate(title),id)
+            items.append(value) 
+        
+        return SimpleVocabulary.fromItems(items)
+
+    return []
+
+class IImport(Interface):
+    """ Import Form """
+
+    filename = ZipFileLine(title=_(u"IMS File Import"),
+                           description=_(u"The name of the ims package on your local machine."),
+                           required=True)
+
+
+    packagetype = schema.Choice(title=_(u"Package Type"),
+                                description=_(u"The type of the ims package being uploaded"),
+                                required=True,
+                                default=u'Default',
+                                vocabulary="imsvocab")
+
+class IExport(Interface):
+    """ Export Form """
+
+    filename = TextLine(title=_(u"IMS File Export"),
+                           description=_(u"The name of the zip file where you want to export the ims package."),
+                           required=True)
+
+
+class ImportFormAdapter(object):
+    """ Adapter for the import form """
+
+    implements(IImport)
+
+    def __init__(self,context):
+        self.context = context
+
+    def get_zipfile_name(self):
+        pass
+
+    def set_zipfile_name(self, title):
+        pass
+
+    def get_type(self):
+        return 'Default'
+
+    def set_type(self):
+        pass
+    
+    filename = property(get_zipfile_name, set_zipfile_name)
+    packagetype = property(get_type, set_type)
+
+class ExportFormAdapter(object):
+    """ Adapter for the export form """
+
+    implements(IExport)
+
+    def __init__(self,context):
+        self.context = context
+
+    def get_zipfile_name(self):
+        return self.context.id + '.zip'
+
+    def set_zipfile_name(self, title):
+        pass
+
+    filename = property(get_zipfile_name, set_zipfile_name)
+
+class ImportForm(EditForm):
+    """ Render the import form  """
+    form_fields = FormFields(IImport)
+    form_fields['filename'].custom_widget = FileWidget
+
+    form_fields['packagetype'].custom_widget = ChoiceRadioWidget
+    label = _(u'Import Content')
+    description = _(u'Import IMS content package')
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.ims_util = getUtility(IIMSTransportUtility)
+
+    @action(_(u'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)
+
+        self.request.response.redirect('.')
+
+
+class ExportForm(EditForm):
+    """ Render the export form  """
+    form_fields = FormFields(IExport)
+    label = _(u'Export Content')
+    description = _(u'Export IMS content package')
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.ims_util = getUtility(IIMSTransportUtility)
+
+    @action(_(u'Export') )
+    def action_export(self, action, data):
+
+        container = self.context
+        filename = self.context.REQUEST['form.filename']
+        content, fn = self.ims_util.exportZipfile(self.context,filename)
+
+        if content:
+            container.REQUEST.RESPONSE.setHeader('content-type', 'application/zip')
+            container.REQUEST.RESPONSE.setHeader('content-length', len(content))
+            container.REQUEST.RESPONSE.setHeader('Content-Disposition',
+                                                 ' attachment; filename=%s' %filename)
+            container.REQUEST.RESPONSE.write(str(content))
+
+
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/config.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/config.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/config.py	(revision 712)
@@ -0,0 +1,52 @@
+##################################################################################
+#
+#    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: 2618 $"[11:-2]
+
+#
+# Product configuration. This contents of this module will be imported into
+# __init__.py and every content type module.
+#
+# If you wish to perform custom configuration, you may put a file AppConfig.py
+# in your product's root directory. This will be included in this file if
+# found.
+#
+from Products.CMFCore.permissions import setDefaultRoles
+import os
+
+PROJECTNAME = "IMSTransport"
+
+OTT_DIR = os.path.abspath(os.path.dirname(__file__))
+WWW_DIR = os.path.join(OTT_DIR, 'www')
+
+DEFAULT_ADD_CONTENT_PERMISSION = "Add portal content"
+setDefaultRoles(DEFAULT_ADD_CONTENT_PERMISSION, ('Manager', 'Owner', 'Member'))
+
+product_globals=globals()
+
+
+try:
+    from collective.imstransport.AppConfig import *
+except ImportError:
+    pass
+
+# End of config.py
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/configure.zcml
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/configure.zcml	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/configure.zcml	(revision 712)
@@ -0,0 +1,83 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
+           xmlns:five="http://namespaces.zope.org/five"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+	   i18n_domain="IMSTransport">
+
+  <five:registerPackage package="." />
+
+  <include package=".browser" />
+  <include package=".utilities" />
+
+  <adapter
+      for="Products.ATContentTypes.interface.folder.IATFolder"
+      provides=".interfaces.IIMSManifestWriter"
+      factory=".Manifest.IMSManifestWriter" />
+
+  <adapter
+      for="Products.ATContentTypes.interface.folder.IATFolder"
+      provides=".interfaces.IIMSManifestReader"
+      factory=".Manifest.IMSManifestReader" />
+
+
+  <i18n:registerTranslations directory="locales" />
+
+
+  <subscriber
+      for=".interfaces.ISetNameSpaces"
+      handler=".ManifestHandlers.setNameSpaces" />
+
+  <subscriber
+      for=".interfaces.IObjectWriteMetadata"
+      handler=".ManifestHandlers.WriteLOMMetadataHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectReadMetadata"
+      handler=".ManifestHandlers.ReadLOMMetadataHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectWriteOrganizations"
+      handler=".ManifestHandlers.WriteOrganizationsHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectReadOrganizations"
+      handler=".ManifestHandlers.ReadOrganizationsHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectWriteContributeNode"
+      handler=".ManifestHandlers.writeContributeNode" />
+
+  <subscriber
+      for=".interfaces.IObjectReadContributeNode"
+      handler=".ManifestHandlers.readContributeNode" />
+
+  <subscriber
+      for=".interfaces.IObjectCreateObject"
+      handler=".ManifestHandlers.DefaultCreateObjects" />
+      
+  <subscriber
+      for=".interfaces.IObjectTransformPackage"
+      handler=".TransformHandlers.WebCTTransformHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectTransformPackage"
+      handler=".TransformHandlers.BlackboardTransformHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectTransformPackage"
+      handler=".TransformHandlers.MITTransformHandler" />
+
+  <genericsetup:registerProfile
+     name="default"
+     title="IMSTransport"
+     directory="profiles/default"
+     description="Extension Profile for IMS Transport Product."
+     provides="Products.GenericSetup.interfaces.EXTENSION"
+     />
+
+
+  <five:traversable class="OFS.Application.Application" />
+
+  <five:traversable class="Products.CMFCore.PortalObject.PortalObjectBase" />
+
+</configure>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-ca.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-ca.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-ca.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-de.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-de.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-de.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-es.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-es.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-es.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-18 00:00+0000\n"
+"Last-Translator: Oriol BorrÂ·s <oriol.borras@upm.es>\n"
+"Language-Team: Oficina OCW-UPM <ocw-upm@upm.es>\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: es\n"
+"Language-Name: Spanish\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-fr.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-fr.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-fr.po	(revision 712)
@@ -0,0 +1,48 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-03-20 10:11+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"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-ja.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-ja.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-ja.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-06 00:06+0900\n"
+"Last-Translator: Haruo Takemura <h-tak@ga2.so-net.ne.jp>\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: ja\n"
+"Language-Name: Japanese\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-nl.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-nl.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-nl.po	(revision 712)
@@ -0,0 +1,49 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-06 18:36+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"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-tr.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-tr.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-tr.po	(revision 712)
@@ -0,0 +1,48 @@
+# Internationalization Master Template for IMSTransport
+# David Ray <davidray@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport 1.0\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-cn.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-cn.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-cn.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-12 15:02+0800\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\n"
+"Language-Team: Mark <PKUGSE@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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-hk.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-hk.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-hk.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-hk\n"
+"Language-Name: Chinese (Hongkong)\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-tw.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-tw.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone-zh-tw.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-tw\n"
+"Language-Name: Traditional Chinese\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone.pot
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone.pot	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/i18n/plone.pot	(revision 712)
@@ -0,0 +1,49 @@
+# --- 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-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/interfaces.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/interfaces.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/interfaces.py	(revision 712)
@@ -0,0 +1,88 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+from zope.interface import Interface
+from zope.component.interfaces import IObjectEvent
+
+
+class IIMSManifestWriter(Interface):
+    """ Write an IMS Content Package manifest document. """
+
+    def setWriterType(wtype):
+        """ Set the writer type, which determines how objects are written,
+            and which event handler writes them. """
+
+    def setDestination(dest):
+        """ Set the destination for data written by the manifest writer. """
+
+    def writeManifest():
+        """ Write the manifest. """
+
+    def getManifest():
+        """ Get the manifest expressed in XML. """
+
+class IIMSManifestReader(Interface):
+    """ Read an IMS Content Package manifest document. """
+
+    def setReaderType(rtype):
+        """ Set the reader type, which determines how objects are created,
+            and which event handler creates them. """
+
+    def setSource(source):
+        """ Set the source of the data used by the manifest reader. """
+
+    def setRequiredMetadataSections(sections):
+        """ Set which metadata sections should be required. Useful if you
+            want to define your own metadata section, and have it be required. """
+
+    def readManifest(manifest):
+        """ Read a manifest """
+
+class ISetNameSpaces(IObjectEvent):
+    """ Set namespace information in manifest. """
+    
+class IObjectWriteMetadata(IObjectEvent):
+    """ Write LOM Metadata event """
+    
+class IObjectReadMetadata(IObjectEvent):
+    """ Write LOM Metadata event """
+    
+class IObjectWriteOrganizations(IObjectEvent):
+    """ Write and organization entry """
+    
+class IObjectReadOrganizations(IObjectEvent):
+    """ Write and organization entry """
+
+class IObjectWriteContributeNode(IObjectEvent):
+    """ Write contribute node event """
+
+class IObjectReadContributeNode(IObjectEvent):
+    """ Read contribute node event """
+    
+class IObjectCreateObject(IObjectEvent):
+    """ Create an object from manifest data. """
+    
+class IObjectTransformPackage(IObjectEvent):
+    """ Transform IMS package into a format we can consume. """
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/IMSTransport.pot
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/IMSTransport.pot	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/IMSTransport.pot	(revision 712)
@@ -0,0 +1,106 @@
+# --- 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-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,103 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,103 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-18 00:00+0000\n"
+"Last-Translator: Oriol BorrÂ·s <oriol.borras@upm.es>\n"
+"Language-Team: Oficina OCW-UPM <ocw-upm@upm.es>\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: es\n"
+"Language-Name: Spanish\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "Exportar"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "Cargar"
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,107 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-03-20 10:11+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: IMSTransport\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: FRANCE\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "Exportez"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "Uploadez"
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-06 00:06+0900\n"
+"Last-Translator: Haruo Takemura <h-tak@ga2.so-net.ne.jp>\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: ja\n"
+"Language-Name: Japanese\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "ãšã¯ã¹ããŒã"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "ã¢ããã­ãŒã"
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,108 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-06 18:36+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: IMSTransport\n"
+"X-Poedit-Language: Dutch\n"
+"X-Poedit-Country: NETHERLANDS\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "Exporteer"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "Upload"
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,109 @@
+# Internationalization Master Template for IMSTransport
+# David Ray <davidray@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport 1.0\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "DosyayÄ± Aktar"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr "Ä°Ã§eriÄi Aktar"
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr "IMSAktarmaFormu_baÅlÄ±k"
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr "IMS Ä°Ã§erik Paketini Aktar"
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+#, fuzzy
+msgid "Export an IMS content package."
+msgstr "IMS Ä°Ã§erik Paketini Aktarma"
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr "Bilgi YÃ¶netim Sistemi"
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr "IMS DosyasÄ± Aktar"
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr "IMS DosyasÄ± Al"
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr "BaÅlÄ±k_IMS"
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr "IMSalmaformu_baÅlÄ±k"
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+#, fuzzy
+msgid "Import an IMS content package."
+msgstr "IMS Ä°Ã§erik Paketini Alma"
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr "AÃ§Ä±klama_IMS"
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr "Paket Tipi"
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr "Yerel Makinenizdeki IMS Paketinin adÄ±"
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr "IMS paketini aktarmak istediÄiniz zip dosyasÄ±nÄ±n adÄ±"
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr "YÃŒklenen IMS paketinin tipi"
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "YÃŒkle"
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-12 15:02+0800\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\n"
+"Language-Team: Mark <PKUGSE@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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "å¯Œåº"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "äžäŒ "
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-hk\n"
+"Language-Name: Chinese (Hongkong)\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "å°åº"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "äžå³"
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-tw\n"
+"Language-Name: Traditional Chinese\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "å°åº"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "äžå³"
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/actions.xml
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/actions.xml	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/actions.xml	(revision 712)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<object name="portal_actions" meta_type="Plone Actions Tool"
+   xmlns:i18n="http://xml.zope.org/namespaces/i18n">
+ <object name="object" meta_type="CMF Action Category">
+  <property name="title"></property>
+  <object name="import" meta_type="CMF Action" i18n:domain="IMSTransport">
+   <property name="title" i18n:translate="">IMS</property>
+   <property name="description" i18n:translate=""></property>
+   <property name="url_expr">string:@@imschoice_form</property>
+   <property name="icon_expr"></property>
+   <property name="available_expr">python: object.restrictedTraverse('plone_context_state').is_structural_folder() and not object.restrictedTraverse('plone_context_state').is_portal_root()</property>
+   <property name="permissions">
+    <element value="Modify portal content"/>
+   </property>
+   <property name="visible">True</property>
+  </object>
+ </object>
+</object>
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/import_steps.xml
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/import_steps.xml	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/import_steps.xml	(revision 712)
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<import-steps>
+  <import-step id="imstransport-final" version="20070514-01"
+	       handler="collective.imstransport.setupHandlers.importFinalSteps"
+	       title="IMSTransport Final Steps Setup">
+    <dependency step="plone-final"/>
+  </import-step>
+</import-steps>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/propertiestool.xml
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/propertiestool.xml	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/profiles/default/propertiestool.xml	(revision 712)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<object name="portal_properties" meta_type="Plone Properties Tool"
+	xmlns:i18n="http://xml.zope.org/namespaces/i18n" i18n:domain="plone">
+  <object name="ims_transport_properties" meta_type="Plone Property Sheet">
+    <property name="title">IMS Licensing properties</property>
+    <property name="import_xforms" type="lines" >
+      <element value="mitdspace_import_xform" />
+      <element value="WebCT_import_xform" />
+      <element value="Blackboard_import_xform" />
+    </property>
+    <property name="mitdspace_import_xform" type="lines">
+      <element value="MIT OCW" i18n:attributes="value" />
+      <element value="MITDspace_import_xform.xsl" />
+    </property>
+    <property name="WebCT_import_xform" type="lines">
+      <element value="WebCT CE 6.0" i18n:attributes="value" />
+      <element value="WebCT_import_xform.xsl" />
+    </property>
+    <property name="Blackboard_import_xform" type="lines">
+      <element value="Blackboard 6.1/7.0" i18n:attributes="value" />
+      <element value="Blackboard_import_xform.xsl" />
+    </property>
+    <property name="Blackboard_content_import_transform" type="lines">
+      <element value="Blackboard Content" i18n:attributes="value" />
+      <element value="Blackboard_content_import_xform.xsl" />
+    </property>
+    <property name="WebCT_image_xform" type="lines">
+      <element value="WebCT Images" i18n:attributes="value" />
+      <element value="WebCT_image_xform.xsl" />
+    </property>
+    <property name="WebCT_glossary_xform" type="lines">
+      <element value="WebCT Glossary" i18n:attributes="value" />
+      <element value="WebCT_glossary_xform.xsl" />
+    </property>
+  </object>
+</object>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/setupHandlers.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/setupHandlers.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/setupHandlers.py	(revision 712)
@@ -0,0 +1,47 @@
+##################################################################################
+#    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.app.component.interfaces import ISite
+from Products.Five.site.localsite import enableLocalSiteHook
+from zope.app.component.hooks import setSite
+from utilities.interfaces import IIMSTransportUtility
+from utilities.utils import IMSTransportUtility
+from zope.component import getSiteManager
+
+
+def importFinalSteps(context):
+    site = context.getSite()
+    setupUtilities(site)
+
+def setupUtilities(site):
+    """ Register a local utility """
+
+    if not ISite.providedBy(site):
+        enableLocalSiteHook(site)
+
+    setSite(site)
+
+    sm = getSiteManager()
+    if not sm.queryUtility(IIMSTransportUtility):
+        sm.registerUtility(IMSTransportUtility('transportutility'),
+                        IIMSTransportUtility)
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/base.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/base.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/base.py	(revision 712)
@@ -0,0 +1,45 @@
+
+from zope.testing import doctest
+from Products.PloneTestCase.PloneTestCase import setupPloneSite, installProduct
+from Products.PloneTestCase.PloneTestCase import PloneTestCase, FunctionalTestCase
+from setuptools import find_packages
+
+from Products.Five import fiveconfigure
+from Products.Five import zcml
+from Testing import ZopeTestCase as ztc
+from Products.PloneTestCase.layer import onsetup
+
+
+packages=find_packages('src', exclude=['enpraxis.educommons']),
+package_dir = {'':'src'},
+
+
+@onsetup
+def setup_imstransport_project():
+    """
+    Load and install packages required for the collective.imstransport tests
+    """
+
+    fiveconfigure.debug_mode = True
+    
+    import collective.imstransport
+    zcml.load_config('configure.zcml',collective.imstransport)
+    
+    fiveconfigure.debug_mode = False
+
+    ztc.installPackage('collective.imstransport')
+
+
+setup_imstransport_project()
+setupPloneSite(with_default_memberarea=0,extension_profiles=['collective.imstransport:default'])
+
+oflags = (doctest.ELLIPSIS |
+          doctest.NORMALIZE_WHITESPACE)
+
+prod = "collective.imstransport"
+
+class IMSTransportTestCase(PloneTestCase):
+    """ Test Class """
+
+class IMSTransportFunctionalTestCase(FunctionalTestCase, IMSTransportTestCase):
+    """ Functional test class """
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/framework.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/framework.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/framework.py	(revision 712)
@@ -0,0 +1,106 @@
+##############################################################################
+#
+# ZopeTestCase
+#
+# COPY THIS FILE TO YOUR 'tests' DIRECTORY.
+#
+# This version of framework.py will use the SOFTWARE_HOME
+# environment variable to locate Zope and the Testing package.
+#
+# If the tests are run in an INSTANCE_HOME installation of Zope,
+# Products.__path__ and sys.path with be adjusted to include the
+# instance's Products and lib/python directories respectively.
+#
+# If you explicitly set INSTANCE_HOME prior to running the tests,
+# auto-detection is disabled and the specified path will be used
+# instead.
+#
+# If the 'tests' directory contains a custom_zodb.py file, INSTANCE_HOME
+# will be adjusted to use it.
+#
+# If you set the ZEO_INSTANCE_HOME environment variable a ZEO setup
+# is assumed, and you can attach to a running ZEO server (via the
+# instance's custom_zodb.py).
+#
+##############################################################################
+#
+# The following code should be at the top of every test module:
+#
+# import os, sys
+# if __name__ == '__main__':
+#     execfile(os.path.join(sys.path[0], 'framework.py'))
+#
+# ...and the following at the bottom:
+#
+# if __name__ == '__main__':
+#     framework()
+#
+##############################################################################
+
+__version__ = '0.2.3'
+
+# Save start state
+#
+__SOFTWARE_HOME = os.environ.get('SOFTWARE_HOME', '')
+__INSTANCE_HOME = os.environ.get('INSTANCE_HOME', '')
+
+if __SOFTWARE_HOME.endswith(os.sep):
+    __SOFTWARE_HOME = os.path.dirname(__SOFTWARE_HOME)
+
+if __INSTANCE_HOME.endswith(os.sep):
+    __INSTANCE_HOME = os.path.dirname(__INSTANCE_HOME)
+
+# Find and import the Testing package
+#
+if not sys.modules.has_key('Testing'):
+    p0 = sys.path[0]
+    if p0 and __name__ == '__main__':
+        os.chdir(p0)
+        p0 = ''
+    s = __SOFTWARE_HOME
+    p = d = s and s or os.getcwd()
+    while d:
+        if os.path.isdir(os.path.join(p, 'Testing')):
+            zope_home = os.path.dirname(os.path.dirname(p))
+            sys.path[:1] = [p0, p, zope_home]
+            break
+        p, d = s and ('','') or os.path.split(p)
+    else:
+        print 'Unable to locate Testing package.',
+        print 'You might need to set SOFTWARE_HOME.'
+        sys.exit(1)
+
+import Testing, unittest
+execfile(os.path.join(os.path.dirname(Testing.__file__), 'common.py'))
+
+# Include ZopeTestCase support
+#
+if 1:   # Create a new scope
+
+    p = os.path.join(os.path.dirname(Testing.__file__), 'ZopeTestCase')
+
+    if not os.path.isdir(p):
+        print 'Unable to locate ZopeTestCase package.',
+        print 'You might need to install ZopeTestCase.'
+        sys.exit(1)
+
+    ztc_common = 'ztc_common.py'
+    ztc_common_global = os.path.join(p, ztc_common)
+
+    f = 0
+    if os.path.exists(ztc_common_global):
+        execfile(ztc_common_global)
+        f = 1
+    if os.path.exists(ztc_common):
+        execfile(ztc_common)
+        f = 1
+
+    if not f:
+        print 'Unable to locate %s.' % ztc_common
+        sys.exit(1)
+
+# Debug
+#
+print 'SOFTWARE_HOME: %s' % os.environ.get('SOFTWARE_HOME', 'Not set')
+print 'INSTANCE_HOME: %s' % os.environ.get('INSTANCE_HOME', 'Not set')
+sys.stdout.flush()
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/testIMSImport.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/testIMSImport.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/testIMSImport.py	(revision 712)
@@ -0,0 +1,308 @@
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Products.CMFPlone.tests import PloneTestCase
+from unittest import TestSuite, makeSuite
+from Testing import ZopeTestCase
+from Testing.ZopeTestCase import user_name
+from AccessControl import Unauthorized
+from base import IMSTransportTestCase
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+from zope.component import getUtility
+
+class testIMSTransport(IMSTransportTestCase):
+    """
+    
+    """
+
+
+    def testImport(self):
+        """ Test that IMS import works for a default package. """
+        self.setRoles(['Manager'])
+        itt = getUtility(IIMSTransportUtility)
+
+#        from collective.imstransport.ManifestEvents import SetNameSpaces
+#        from collective.imstransport.interfaces import ISetNameSpaces
+#        from enpraxis.educommons.eventHandlers import setNameSpaces
+#        from zope import component
+
+#        sm = component.getSiteManager()
+
+#        sm.unregisterHandler(setNameSpaces, (SetNameSpaces,ISetNameSpaces))
+
+        self.portal.invokeFactory('Folder', 'testfolder')
+        testfolder = getattr(self.portal, 'testfolder')
+        results = itt.importZipfile(testfolder, 
+                                    'src/collective.imstransport/collective/imstransport/tests/IMS_Sample_Course.zip', 
+                                    'Default',
+                                    'LOMv1.0')
+        assert results[0], results[2]
+
+        # Test sample folder
+        assert getattr(testfolder, 'course')
+        assert getattr(testfolder, 'course.html')
+
+        # Test the sample page
+        assert getattr(testfolder.course, 'sample-page')
+        samplepage = getattr(testfolder.course, 'sample-page')
+
+        assert 'Sample Page' == samplepage.Title()
+        assert 'This is a sample page for IMS Packaging' == samplepage.Description()
+        assert 'Ray, David' in samplepage.Creators()
+        assert 'text/html' == samplepage.Format()
+        assert 'Page' == samplepage.Type()
+        assert '<h2>Sample Text</h2>' in samplepage.getText()
+        
+        # Test example subfolder
+        assert getattr(testfolder.course, 'sample-folder')
+        samplefolder = getattr(testfolder.course, 'sample-folder')
+        assert 'sample-page-in-folder' in samplefolder.objectIds()
+        sfolderpage = getattr(samplefolder, 'sample-page-in-folder')
+        assert 'Page' == sfolderpage.Type()
+        assert '<h2>My parent folder is Sample Folder</h2>' in sfolderpage.getText()
+
+        # Test Sample file
+        assert getattr(testfolder.course, 'samplefile.txt')
+        samplefile = getattr(testfolder.course, 'samplefile.txt')
+        assert 'Sample File' == samplefile.Title()
+        assert 'This is a sample file for IMS Packaging.' == samplefile.Description()
+        assert 'Ray, David' in samplefile.Creators()
+        assert 'text/plain' == samplefile.Format()
+        assert 'File' == samplefile.Type()
+        assert samplefile.size() > 0
+
+        # Test Sample image
+        assert getattr(testfolder.course, 'sampleimage.gif')
+        sampleimage = getattr(testfolder.course, 'sampleimage.gif')
+        assert 'Sample Image' == sampleimage.Title()
+        assert 'This is a sample image for IMS Packaging.' == sampleimage.Description()
+        assert 'Ray, David' in sampleimage.Creators()
+        assert 'image/gif' == sampleimage.Format()
+        assert 'Image' == sampleimage.Type()
+        assert sampleimage.size() > 0
+
+    def testWebCTImport(self):
+        """
+        """
+        self.setRoles(['Manager'])
+        itt = getUtility(IIMSTransportUtility)
+        self.portal.invokeFactory('Folder', 'testwctfolder')
+        testwctfolder = getattr(self.portal, 'testwctfolder')
+        results = itt.importZipfile(testwctfolder, 
+                                    'src/collective.imstransport/collective/imstransport/tests/WebCTTest.zip', 
+                                    'WebCT_import_xform',
+                                    'LOMv1.0')
+        assert results[0], results[2]
+
+        assert getattr(testwctfolder, 'URL_8805229_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805229_R.html')
+        assert 'assignments-external web' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://cnn.com">assignments-external web</a>' in testpage.getText()
+        
+        assert getattr(testwctfolder, 'URL_8805232_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805232_R.html')
+        assert 'syllabus-external web' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://slashdot.org">syllabus-external web</a>' in testpage.getText()
+        
+        assert getattr(testwctfolder, 'URL_8805235_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805235_R.html')
+        assert 'exams-external web' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://slashdot.org">exams-external web</a>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'URL_8805241_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805241_R.html')
+        assert 'External Website' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://digg.com">External Website</a>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'CMD_8805178_R.html')
+        testpage = getattr(testwctfolder, 'CMD_8805178_R.html')
+        assert 'assignment worksheets' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<td><a href="COURSE_8805174_M/my_files/untitled.html">Put your title here</a></td>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'COURSE_8805174_M')
+        testfolder = getattr(testwctfolder, 'COURSE_8805174_M')
+        assert getattr(testfolder, 'my_files')
+        my_files = getattr(testfolder, 'my_files')
+        assert getattr(my_files, 'untitled.html')
+        assert getattr(my_files, 'samplefile.txt')
+        assert getattr(my_files, 'sampleimage.gif')
+        assert getattr(my_files, 'untitled2.html')
+
+        assert getattr(testwctfolder, 'CMD_8805179_R.html')
+        testpage = getattr(testwctfolder, 'CMD_8805179_R.html')
+        assert 'readings' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<td><a href="COURSE_8805174_M/my_files/untitled2.html">Put your title here</a></td>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'URL_8805290_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805290_R.html')
+        assert 'Google' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://www.google.com">Google</a>' in testpage.getText()
+
+    def testBBImport(self):
+        """
+        """
+        self.setRoles(['Manager'])
+        itt = getUtility(IIMSTransportUtility)
+        self.portal.invokeFactory('Folder', 'testbbfolder')
+        testbbfolder = getattr(self.portal, 'testbbfolder')
+        results = itt.importZipfile(testbbfolder, 
+                                    'src/collective.imstransport/collective/imstransport/tests/BBTest.zip', 
+                                    'Blackboard_import_xform',
+                                    'LOMv1.0')
+        assert results[0], results[2]
+
+        assert getattr(testbbfolder, 'res00001.html')
+        testdocument = getattr(testbbfolder, 'res00001.html')
+        assert 'COURSE_DEFAULT.CourseInformation.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00007.html">Test Image</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00005.html')
+        testdocument = getattr(testbbfolder, 'res00005.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'Hello World<p></p>\n' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00006.html')
+        testdocument = getattr(testbbfolder, 'res00006.html')
+        assert 'Test File' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'samplefile.txt' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00006')
+        testfolder = getattr(testbbfolder, 'res00006')
+        assert 'Folder' == testfolder.Type()
+        assert getattr(testfolder, 'samplefile.txt')
+        testfile = getattr(testfolder, 'samplefile.txt')
+        assert 'Test File' == testfile.Title()
+        assert 'test_user_1_' in testfile.Creators()
+        assert 'text/plain' == testfile.Format()
+        assert 'File' == testfile.Type()
+        assert testfile.size() > 0
+
+        assert getattr(testbbfolder, 'res00007.html')
+        testdocument = getattr(testbbfolder, 'res00007.html')
+        assert 'Test Image' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'sampleimage.gif' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00007')
+        testfolder = getattr(testbbfolder, 'res00007')
+        assert 'Folder' == testfolder.Type()
+        assert getattr(testfolder, 'sampleimage.gif')
+        testimage = getattr(testfolder, 'sampleimage.gif')
+        assert 'Test Image' == testimage.Title()
+        assert 'test_user_1_' in testimage.Creators()
+        assert 'image/gif' == testimage.Format()
+        assert 'Image' == testimage.Type()
+        assert testimage.size() > 0
+
+        assert getattr(testbbfolder, 'res00009.html')
+        testdocument = getattr(testbbfolder, 'res00009.html')
+        assert 'Test Document 2' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'Another test<p></p>\n' == testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00002.html')
+        testdocument = getattr(testbbfolder, 'res00002.html')
+        assert 'COURSE_DEFAULT.CourseDocuments.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00010.html">Test Document</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00010.html')
+        testdocument = getattr(testbbfolder, 'res00010.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00010//course.html" title="course.html">' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00010')
+        testfolder = getattr(testbbfolder, 'res00010')
+        assert 'Folder' == testfolder.Type()
+        assert getattr(testfolder, 'course.html')
+        testdocument = getattr(testfolder, 'course.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<h3>COURSE TITLE</h3>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00003.html')
+        testdocument = getattr(testbbfolder, 'res00003.html')
+        assert 'COURSE_DEFAULT.Assignments.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00011.html">Test Document</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00011.html')
+        testdocument = getattr(testbbfolder, 'res00011.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'Hello World<p></p>\n' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00002.html')
+        testdocument = getattr(testbbfolder, 'res00002.html')
+        assert 'COURSE_DEFAULT.CourseDocuments.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00010.html">Test Document</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00004.html')
+        testdocument = getattr(testbbfolder, 'res00004.html')
+        assert 'COURSE_DEFAULT.ExternalLinks.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00012.html">Slashdot</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00012.html')
+        testdocument = getattr(testbbfolder, 'res00012.html')
+        assert 'Slashdot' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="http://slashdot.org">Slashdot</a><p></p>\n' in testdocument.getText()
+
+def test_suite():
+    suite = TestSuite()
+    suite.addTest(makeSuite(testIMSTransport))
+    return suite
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/testIMSexport.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/testIMSexport.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/tests/testIMSexport.py	(revision 712)
@@ -0,0 +1,105 @@
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Products.CMFPlone.tests import PloneTestCase
+from unittest import TestSuite, makeSuite
+from Testing import ZopeTestCase
+from Testing.ZopeTestCase import user_name
+from AccessControl import Unauthorized
+from base import IMSTransportTestCase
+
+
+class testIMSTransport(IMSTransportTestCase):
+    
+    def testExportImportPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        it_tool = self.portal.portal_IMSTransportTool
+
+        self.testExportPackage()
+        
+        po.invokeFactory('Folder','testFolder2')
+        test_folder2 = getattr(po, 'testFolder2')       
+        it_tool.importZipfile(test_folder2,'var/mydoc.zip','Default')
+   
+        assert test_folder2.testFolder.Title() == 'MyFolder'
+        assert test_folder2.testFolder.testDoc.Title() == 'MyDoc'
+        assert test_folder2.testFolder.testDoc.Creators()[0] == 'Test User1'
+        assert test_folder2.testFolder.testDoc.Creators()[1] == 'New User2'
+        assert test_folder2.testFolder.testDoc.Description() == 'Test Description'
+        
+
+    def testExportPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        
+        if hasattr(po, 'testFolder'):
+            test_folder = getattr(po, 'testFolder')
+        else:
+            po.invokeFactory('Folder','testFolder')
+            test_folder = getattr(po, 'testFolder')
+            
+        test_folder.setTitle('MyFolder')    
+        test_folder.invokeFactory('Document', 'testDoc')
+        test_doc = getattr(test_folder, 'testDoc')
+        test_doc.setTitle('MyDoc')
+        test_doc.setCreators('Test User1\nNew User2')
+        test_doc.setExcludeFromNav(1)
+        test_doc.setDescription('Test Description')
+        
+        it_tool = self.portal.portal_IMSTransportTool
+        manifest = it_tool.exportZipfile(test_folder,'var/mydoc.zip')
+        
+        zf = file(manifest[1],'w')
+        zf.write(manifest[0])
+        zf.close()
+        
+    def testExportImportNonAsciiPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        it_tool = self.portal.portal_IMSTransportTool
+
+        self.testExportNonAsciiPackage()
+        
+        po.invokeFactory('Folder','testFolder2')
+        test_folder2 = getattr(po, 'testFolder2')       
+        it_tool.importZipfile(test_folder2,'var/mydoc.zip','Default')
+   
+        assert test_folder2.testFolder.Title() == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Title() == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Creators()[0] == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Creators()[1] == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Description() == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        
+
+    def testExportNonAsciiPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        
+        if hasattr(po, 'testFolder'):
+            test_folder = getattr(po, 'testFolder')
+        else:
+            po.invokeFactory('Folder','testFolder')
+            test_folder = getattr(po, 'testFolder')
+            
+        test_folder.setTitle('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')    
+        test_folder.invokeFactory('Document', 'testDoc')
+        test_doc = getattr(test_folder, 'testDoc')
+        test_doc.setTitle('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')
+        test_doc.setCreators('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž\nÃ±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')
+        test_doc.setExcludeFromNav(1)
+        test_doc.setDescription('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')
+        
+        it_tool = self.portal.portal_IMSTransportTool
+        manifest = it_tool.exportZipfile(test_folder,'var/mydoc.zip')
+        
+        zf = file(manifest[1],'w')
+        zf.write(manifest[0])
+        zf.close()
+
+def test_suite():
+    suite = TestSuite()
+    suite.addTest(makeSuite(testIMSTransport))
+    return suite
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/__init__.py	(revision 712)
@@ -0,0 +1,1 @@
+# Make this directory a product.
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/configure.zcml
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/configure.zcml	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/configure.zcml	(revision 712)
@@ -0,0 +1,6 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="IMSTransport">
+
+
+</configure>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/interfaces.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/interfaces.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/interfaces.py	(revision 712)
@@ -0,0 +1,34 @@
+##################################################################################
+#    Copyright (C) 2006-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
+
+class IIMSTransportUtility(Interface):
+    """ IMS Transport Utility """
+
+    def importZipfile(request):
+        """ Import a zip file. """
+
+    def exportZipfile(request):
+        """ Export a zip file. """
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/utils.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/utils.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/utilities/utils.py	(revision 712)
@@ -0,0 +1,65 @@
+##################################################################################
+#    Copyright (C) 2006-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 interfaces import IIMSTransportUtility
+from OFS.SimpleItem import SimpleItem
+from zope.interface import implements
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from collective.imstransport.config import *
+from collective.imstransport.interfaces import IIMSManifestWriter, IIMSManifestReader
+from collective.imstransport.Manifest import ZipfileReader, ZipfileWriter
+from zipfile import BadZipfile
+from zope.component import getUtility
+from zope.schema.interfaces import IVocabularyFactory
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+
+class IMSTransportUtility(SimpleItem):
+    """ IMS Transport Utility """
+
+    tocpage = PageTemplateFile('tableofcontents', WWW_DIR)
+
+    implements(IIMSTransportUtility)
+    
+    def importZipfile(self, object, file, package_type, mdVersions=None, rtype='IMSTransport'):
+        """ Import a zip file. """
+
+        reader = IIMSManifestReader(object)
+        reader.setReaderType(rtype)
+        try:
+            zfr = ZipfileReader(file)
+        except BadZipfile, e:
+            return False, 'Zip', e
+        reader.setSource(zfr)
+        if mdVersions:
+            reader.setRequiredMetadataSections(mdVersions)
+
+	imstransport = object.portal_properties.ims_transport_properties
+        pt = getattr(imstransport, package_type, None)
+        return reader.readManifest(pt)
+
+    def exportZipfile(self, object, filename, wtype='IMSTransport'):
+        """ Export a zip file. """
+        writer = IIMSManifestWriter(object)
+        writer.setWriterType(wtype)
+        writer.setDestination(ZipfileWriter(filename, object.getId()))
+        return writer.writeManifest()
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/version.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/version.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/version.txt	(revision 712)
@@ -0,0 +1,1 @@
+2.1.0
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/IMS_transport_form.zpt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/IMS_transport_form.zpt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/IMS_transport_form.zpt	(revision 712)
@@ -0,0 +1,10 @@
+<tal:header tal:replace="structure here/manage_page_header|nothing">Header</tal:header>
+<tal:message tal:define="manage_tabs_message options/manage_tabs_message | request/manage_tabs_message | nothing"
+    tal:replace="structure here/manage_tabs">Tabs</tal:message>
+<tal:body>
+
+  <h3>IMS Transport</h3>
+
+
+</tal:body>
+<tal:footer tal:replace="structure here/manage_page_footer|nothing">footer</tal:footer>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/overview.zpt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/overview.zpt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/overview.zpt	(revision 712)
@@ -0,0 +1,10 @@
+<tal:header tal:replace="structure here/manage_page_header|nothing">Header</tal:header>
+<tal:message tal:define="manage_tabs_message options/manage_tabs_message | request/manage_tabs_message | nothing"
+    tal:replace="structure here/manage_tabs">Tabs</tal:message>
+<tal:body>
+
+  <h3>Overview</h3>
+
+
+</tal:body>
+<tal:footer tal:replace="structure here/manage_page_footer|nothing">footer</tal:footer>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/tableofcontents.zpt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/tableofcontents.zpt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/collective/imstransport/www/tableofcontents.zpt	(revision 712)
@@ -0,0 +1,17 @@
+<table class="documentTable" style="width: 499px;" border="0" cellpadding="0" cellspacing="0">
+  <thead>
+    <tr>
+      <td tal:content="options/tabletitle">Title</td>
+    </tr>
+  </thead>
+  <tbody>
+    <tal:items tal:repeat="item options/tocitems">
+      <tr tal:define="oddrow repeat/item/odd;" 
+          tal:attributes="class python:test(oddrow, 'odd', 'even')">
+        <td ><a href=""
+                tal:attributes="href python:item[0]"
+                tal:content="python:item[1]">Item</a></td>
+      </tr>
+    </tal:items>
+  </tbody>
+</table>
Index: /3.2/collective.imstransport.orig/tags/2.1.0/docs/HISTORY.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/docs/HISTORY.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/docs/HISTORY.txt	(revision 712)
@@ -0,0 +1,8 @@
+Changelog
+=========
+
+2.1.0 - Unreleased
+----------------
+
+* Initial release
+
Index: /3.2/collective.imstransport.orig/tags/2.1.0/docs/INSTALL.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/docs/INSTALL.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/docs/INSTALL.txt	(revision 712)
@@ -0,0 +1,43 @@
+collective.imstransport Installation
+==========================
+
+To install collective.imstransport 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 collective.imstransport``. Find out how to install setuptools
+   (and EasyInstall) here:
+   http://peak.telecommunity.com/DevCenter/EasyInstall
+
+ * Create a file called ``collective.imstransport-configure.zcml`` in the
+   ``/path/to/instance/etc/package-includes`` directory.  The file
+   should only contain this::
+
+       <include package="collective.imstransport" />
+
+
+Alternatively, if you are using zc.buildout and the plone.recipe.zope2instance
+recipe to manage your project, you can do this:
+
+ * Add ``collective.imstransport`` to the list of eggs to install, e.g.:
+ 
+    [buildout]
+    ...
+    eggs =
+        ...
+        collective.imstransport
+        
+  * Tell the plone.recipe.zope2instance recipe to install a ZCML slug:
+  
+    [instance]
+    recipe = plone.recipe.zope2instance
+    ...
+    zcml =
+        collective.imstransport
+        
+  * 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: /3.2/collective.imstransport.orig/tags/2.1.0/docs/LICENSE.GPL
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/docs/LICENSE.GPL	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/docs/LICENSE.GPL	(revision 712)
@@ -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: /3.2/collective.imstransport.orig/tags/2.1.0/docs/LICENSE.txt
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/docs/LICENSE.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/docs/LICENSE.txt	(revision 712)
@@ -0,0 +1,16 @@
+  collective.imstransport 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: /3.2/collective.imstransport.orig/tags/2.1.0/setup.cfg
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/setup.cfg	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/setup.cfg	(revision 712)
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = dev
+tag_svn_revision = true
Index: /3.2/collective.imstransport.orig/tags/2.1.0/setup.py
===================================================================
--- /3.2/collective.imstransport.orig/tags/2.1.0/setup.py	(revision 712)
+++ /3.2/collective.imstransport.orig/tags/2.1.0/setup.py	(revision 712)
@@ -0,0 +1,33 @@
+from setuptools import setup, find_packages
+import os
+
+version = '2.1.0'
+
+setup(name='collective.imstransport',
+      version=version,
+      description="An AddOn that supports importing and exporting of IMS content packages.",
+      long_description=open("README.txt").read() + "\n" +
+                       open(os.path.join("docs", "HISTORY.txt")).read(),
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[
+        "Framework :: Plone",
+        "Programming Language :: Python",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+        ],
+      keywords='IMS Package import export',
+      author='enPraxis',
+      author_email='info@enpraxis.net',
+      url='http://plone.org/products/ims-transport/t',
+      license='GPL',
+      packages=find_packages(exclude=['ez_setup']),
+      namespace_packages=['collective'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+          'setuptools',
+          # -*- Extra requirements: -*-
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )
Index: /3.2/collective.imstransport.orig/trunk/README.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/README.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/README.txt	(revision 712)
@@ -0,0 +1,4 @@
+Introduction
+============
+
+placeholder text
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/PKG-INFO
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/PKG-INFO	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/PKG-INFO	(revision 712)
@@ -0,0 +1,27 @@
+Metadata-Version: 1.0
+Name: collective.imstransport
+Version: 2.1.0dev-r77997
+Summary: An AddOn that supports importing and exporting of IMS content packages.
+Home-page: http://plone.org/products/ims-transport/t
+Author: enPraxis
+Author-email: info@enpraxis.net
+License: GPL
+Description: Introduction
+        ============
+        
+        placeholder text
+        
+        Changelog
+        =========
+        
+        2.1.0 - Unreleased
+        ----------------
+        
+        * Initial release
+        
+        
+Keywords: IMS Package import export
+Platform: UNKNOWN
+Classifier: Framework :: Plone
+Classifier: Programming Language :: Python
+Classifier: Topic :: Software Development :: Libraries :: Python Modules
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/SOURCES.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/SOURCES.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/SOURCES.txt	(revision 712)
@@ -0,0 +1,97 @@
+README.txt
+setup.cfg
+setup.py
+collective/__init__.py
+collective.imstransport.egg-info/PKG-INFO
+collective.imstransport.egg-info/SOURCES.txt
+collective.imstransport.egg-info/dependency_links.txt
+collective.imstransport.egg-info/entry_points.txt
+collective.imstransport.egg-info/namespace_packages.txt
+collective.imstransport.egg-info/not-zip-safe
+collective.imstransport.egg-info/requires.txt
+collective.imstransport.egg-info/top_level.txt
+collective/imstransport/IMS_exceptions.py
+collective/imstransport/INSTALL.txt
+collective/imstransport/Manifest.py
+collective/imstransport/ManifestEvents.py
+collective/imstransport/ManifestHandlers.py
+collective/imstransport/README.txt
+collective/imstransport/TransformHandlers.py
+collective/imstransport/__init__.py
+collective/imstransport/config.py
+collective/imstransport/configure.zcml
+collective/imstransport/interfaces.py
+collective/imstransport/refresh.txt
+collective/imstransport/setupHandlers.py
+collective/imstransport/tool.gif
+collective/imstransport/version.txt
+collective/imstransport/IMS/Angel_import_xform.xsl
+collective/imstransport/IMS/Blackboard_content_import_xform.xsl
+collective/imstransport/IMS/Blackboard_import_xform.xsl
+collective/imstransport/IMS/MITDspace_import_xform.xsl
+collective/imstransport/IMS/WebCT_glossary_xform.xsl
+collective/imstransport/IMS/WebCT_image_xform.xsl
+collective/imstransport/IMS/WebCT_import_xform.xsl
+collective/imstransport/IMS/eXe_import_xform.xsl
+collective/imstransport/IMS/imscp_v1p2.xsd
+collective/imstransport/IMS/imsmd_v1p2p4.xsd
+collective/imstransport/browser/__init__.py
+collective/imstransport/browser/configure.zcml
+collective/imstransport/browser/imschoice.pt
+collective/imstransport/browser/imstransportform.py
+collective/imstransport/i18n/plone-ca.po
+collective/imstransport/i18n/plone-de.po
+collective/imstransport/i18n/plone-es.po
+collective/imstransport/i18n/plone-fr.po
+collective/imstransport/i18n/plone-ja.po
+collective/imstransport/i18n/plone-nl.po
+collective/imstransport/i18n/plone-tr.po
+collective/imstransport/i18n/plone-zh-cn.po
+collective/imstransport/i18n/plone-zh-hk.po
+collective/imstransport/i18n/plone-zh-tw.po
+collective/imstransport/i18n/plone.pot
+collective/imstransport/locales/IMSTransport.pot
+collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po
+collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.mo
+collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po
+collective/imstransport/profiles/default/actions.xml
+collective/imstransport/profiles/default/import_steps.xml
+collective/imstransport/profiles/default/propertiestool.xml
+collective/imstransport/tests/BBTest.zip
+collective/imstransport/tests/IMS_Sample_Course.zip
+collective/imstransport/tests/WebCTTest.zip
+collective/imstransport/tests/__init__.py
+collective/imstransport/tests/base.py
+collective/imstransport/tests/framework.py
+collective/imstransport/tests/testIMSImport.py
+collective/imstransport/tests/testIMSexport.py
+collective/imstransport/utilities/__init__.py
+collective/imstransport/utilities/configure.zcml
+collective/imstransport/utilities/interfaces.py
+collective/imstransport/utilities/utils.py
+collective/imstransport/www/IMS_transport_form.zpt
+collective/imstransport/www/overview.zpt
+collective/imstransport/www/tableofcontents.zpt
+docs/HISTORY.txt
+docs/INSTALL.txt
+docs/LICENSE.GPL
+docs/LICENSE.txt
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/dependency_links.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/dependency_links.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/dependency_links.txt	(revision 712)
@@ -0,0 +1,1 @@
+
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/entry_points.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/entry_points.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/entry_points.txt	(revision 712)
@@ -0,0 +1,3 @@
+
+      # -*- Entry points: -*-
+      
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/namespace_packages.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/namespace_packages.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/namespace_packages.txt	(revision 712)
@@ -0,0 +1,1 @@
+collective
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/not-zip-safe
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/not-zip-safe	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/not-zip-safe	(revision 712)
@@ -0,0 +1,1 @@
+
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/requires.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/requires.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/requires.txt	(revision 712)
@@ -0,0 +1,1 @@
+setuptools
Index: /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/top_level.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/top_level.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective.imstransport.egg-info/top_level.txt	(revision 712)
@@ -0,0 +1,1 @@
+collective
Index: /3.2/collective.imstransport.orig/trunk/collective/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/__init__.py	(revision 712)
@@ -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: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Angel_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Angel_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Angel_import_xform.xsl	(revision 712)
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+   
+    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+        xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+        xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+        xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
+        xmlns:lom="http://ocw.mit.edu/xmlns/LOM"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+        xmlns:cwsp="http://www.dspace.org/xmlns/cwspace_imscp"
+        xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
+        xmlns:ocw="http://ocw.mit.edu/xmlns/ocw_imscp"
+        version="1.0">   
+    
+    
+    
+    <xsl:output method="xml" indent="yes" />
+        
+    <xsl:template match="/">
+        <manifest 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">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>        
+    </xsl:template>
+    
+        <xsl:template match="manifest/organizations">
+            <organizations>
+                <xsl:attribute name="default">     
+                    <xsl:value-of select="@default"/>
+                </xsl:attribute>
+                <xsl:apply-templates/>
+            </organizations>
+        </xsl:template>       
+
+        <xsl:template match="organization">
+            <organization>
+                <xsl:attribute name="identifier">
+                    <xsl:value-of select = "@identifier" />
+                </xsl:attribute>
+                <xsl:apply-templates/>
+            </organization>
+        </xsl:template>        
+        
+        <xsl:template match="title">
+            <title>
+                <xsl:value-of select="."/>
+            </title>
+        </xsl:template>
+        
+        <xsl:template match="item">
+            <item>
+                <xsl:variable name="identifierref" select="@identifierref"/>
+                <xsl:variable name="resource" select="/manifest/resources//resource[@identifier=$identifierref]/@href"/>
+                <xsl:variable name="ext" select="substring-after($resource,'.')"/>
+                
+                <xsl:attribute name="identifier">
+                    <xsl:value-of select = "@identifier" />
+                </xsl:attribute>
+                <xsl:attribute name="identifierref">
+                    <xsl:value-of select = "$identifierref" />
+                    <xsl:value-of select="concat('.',$ext)"/>                    
+                </xsl:attribute>
+                <xsl:attribute name="isvisible">
+                     <xsl:text>true</xsl:text>
+                 </xsl:attribute>
+                <xsl:apply-templates/>
+            </item>
+        </xsl:template>
+        
+        <xsl:template match="resources">
+            <resources>
+                <xsl:apply-templates />
+            </resources>   
+        </xsl:template>
+        
+        <xsl:template match="resource">
+            <resource>
+                
+                
+                <xsl:variable name="identifier" select="@identifier"/>
+                <xsl:variable name="title" select="/manifest/organizations//item[@identifierref=$identifier]/title"/>
+                
+                <xsl:attribute name="identifier">
+                    <xsl:value-of select="concat(@identifier,'.',substring-after(@href,'.'))"/>
+                </xsl:attribute>
+                <xsl:attribute name="href">
+                    <xsl:value-of select="@href"/>
+                </xsl:attribute>
+                <xsl:attribute name="type">
+                    <xsl:value-of select="@type"/>
+                </xsl:attribute>
+                
+                <metadata>
+                    <imsmd:lom>
+                        <imsmd:general>
+                            <imsmd:title>
+                                <imsmd:langstring xml:lang="en">
+                                           <xsl:value-of select="$title"/>
+                                </imsmd:langstring>
+                            </imsmd:title>
+                        </imsmd:general>
+                        <imsmd:technical>
+                            
+                        </imsmd:technical>
+                    </imsmd:lom>
+                    <eduCommons:eduCommons>
+                        <xsl:if test="$title='Welcome'">
+                            <eduCommons:objectType>
+                                Course
+                            </eduCommons:objectType>
+                        </xsl:if>
+                        <eduCommons:license category="Site Default"/>
+                        <eduCommons:clearedCopyright>true</eduCommons:clearedCopyright>
+                    </eduCommons:eduCommons>
+                </metadata>
+                
+                
+                
+                <xsl:apply-templates select="file" />
+            </resource>
+        </xsl:template>
+        
+
+        <xsl:template match="file">
+            <file>
+                <xsl:attribute name="href">
+                    <xsl:value-of select="translate(@href,'\','/')"/>
+                </xsl:attribute>
+            </file>
+        </xsl:template>
+        
+        
+        
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Blackboard_content_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Blackboard_content_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Blackboard_content_import_xform.xsl	(revision 712)
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+    
+    <xsl:output method="html" indent="yes"/>
+    
+    <xsl:template match="/CONTENT">
+        <xsl:variable name="content_type" select="CONTENTHANDLER/@value"/>
+        <xsl:choose>
+            <xsl:when test="$content_type = 'resource/x-bb-document' or $content_type = 'resource/x-bb-assignment'">
+                <xsl:value-of select="BODY/TEXT" disable-output-escaping="yes"/>
+                <p>
+                    <xsl:apply-templates select="FILES/FILE"/>
+                </p>
+            </xsl:when>
+            <xsl:when test="$content_type = 'resource/x-bb-externallink'">
+                <p>
+                    <a>
+                        <xsl:attribute name="href">
+                            <xsl:value-of select="URL/@value"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="title">
+                            <xsl:value-of select="TITLE/@value"/>
+                        </xsl:attribute>
+                        <xsl:value-of select="TITLE/@value"/>
+                    </a>
+                </p>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+    
+    <xsl:template match="FILE">
+        <a>
+            <xsl:attribute name="href">
+                <xsl:text>@X@LOCALFOLDERLOCATION@X@/</xsl:text>
+                <xsl:value-of select="NAME"/>
+            </xsl:attribute>
+            <xsl:attribute name="title">
+                <xsl:value-of select="LINKNAME/@value"/>
+            </xsl:attribute>
+            <xsl:value-of select="LINKNAME/@value"/>
+        </a><br />    
+    </xsl:template>
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Blackboard_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Blackboard_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/Blackboard_import_xform.xsl	(revision 712)
@@ -0,0 +1,169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+    version="1.0"
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
+    xmlns:bb="http://www.blackboard.com/content-packaging/">
+    
+    <xsl:output method="xml" indent="yes"/>
+    
+    <xsl:template match="/">
+        <manifest xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p4.xsd http://cosl.usu.edu/xsd/eduCommonsv1.2 http://cosl.usu.edu/xsd/educommonsv1.2.xsd">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>
+    </xsl:template>
+    
+    <xsl:template match="organizations">
+        <organizations>
+            <xsl:apply-templates/>
+        </organizations>
+    </xsl:template>
+    
+    <xsl:template match="organization">
+        <organization>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </organization>
+    </xsl:template>
+    
+    <xsl:template match="organization/item">
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:attribute name="isvisible">
+                <xsl:text>true</xsl:text>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+    
+    <xsl:template match="item">
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+    
+    <xsl:template match="title">
+        <title>
+            <xsl:value-of select="."/>
+        </title>
+    </xsl:template>
+    
+    <xsl:template match="resources">
+        <resources>
+            <xsl:apply-templates select="resource"/>
+        </resources>
+    </xsl:template>
+    
+    <xsl:template match="resource">
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:variable name="title" select="/manifest/organizations//item[@identifierref=$identifier]/title"/>
+        <xsl:variable name="visible" select="/manifest/organizations//item[@identifierref=$identifier]"/>
+        <xsl:variable name="resid" select="@identifier"/>
+        <xsl:variable name="restype" select="@type"/>
+        <xsl:variable name="resbase" select="concat(@xml:base, '/')"/>
+        <xsl:variable name="docfilename" select="concat(@xml:base, '.html')"/>
+        <xsl:choose>
+            <xsl:when test="$restype='resource/x-bb-document' or $visible">
+                <resource>
+                    <xsl:attribute name="identifier">
+                        <xsl:choose>
+                            <xsl:when test="$visible">
+                                <xsl:value-of select="$identifier"/>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:value-of select="generate-id()"/>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:attribute>
+                    <xsl:attribute name="type">
+                        <xsl:text>webcontent</xsl:text>
+                    </xsl:attribute>
+                    <metadata>
+                        <imsmd:lom>
+                            <imsmd:general>
+                                <imsmd:title>
+                                    <imsmd:langstring xml:base="en">
+                                        <xsl:value-of select="$title"/>
+                                    </imsmd:langstring>
+                                </imsmd:title>
+                            </imsmd:general>
+                        </imsmd:lom>
+                    </metadata>
+                    <file>
+                        <xsl:attribute name="href">
+                            <xsl:value-of select="$docfilename"/>
+                        </xsl:attribute>
+                    </file>
+                </resource>
+            </xsl:when>
+        </xsl:choose>
+        <xsl:choose>
+            <xsl:when test="file">
+                <xsl:for-each select="file">
+                    <xsl:variable name="pos">
+                        <xsl:number value="position()" format="1"/>
+                    </xsl:variable>
+                    <resource>
+                        <xsl:choose>
+                            <xsl:when test="$pos=1">
+                                <xsl:attribute name="identifier">
+                                    <xsl:value-of select="$resid"/>
+                                </xsl:attribute>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:attribute name="identifier">
+                                    <xsl:value-of select="generate-id()"/>
+                                </xsl:attribute>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                        <xsl:attribute name="type">
+                            <xsl:value-of select="$restype"/>
+                        </xsl:attribute>
+                        <metadata>
+                            <imsmd:lom>
+                                <imsmd:general>
+                                    <imsmd:title>
+                                        <imsmd:langstring xml:lang="en">
+                                            <xsl:choose>
+                                                <xsl:when test="$title">
+                                                    <xsl:value-of select="$title"/>
+                                                </xsl:when>
+                                                <xsl:otherwise>
+                                                    <xsl:value-of select="@href"/>
+                                                </xsl:otherwise>
+                                            </xsl:choose>
+                                        </imsmd:langstring>
+                                    </imsmd:title>
+                                </imsmd:general>    
+                            </imsmd:lom>
+                        </metadata>
+                        <file>
+                            <xsl:attribute name="href">
+                                <xsl:value-of select="concat($resbase, translate(@href, '\', '/'))"/>
+                            </xsl:attribute>
+                        </file>
+                    </resource>
+                </xsl:for-each>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/MITDspace_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/MITDspace_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/MITDspace_import_xform.xsl	(revision 712)
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2" xmlns:lom="http://ocw.mit.edu/xmlns/LOM"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:cwsp="http://www.dspace.org/xmlns/cwspace_imscp"
+    xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
+    xmlns:ocw="http://ocw.mit.edu/xmlns/ocw_imscp"
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2" version="1.0">
+
+    <xsl:output method="xml" indent="yes"/>
+
+    <xsl:template match="/">
+        <manifest
+            xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p4.xsd">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="imscp:manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>
+    </xsl:template>
+
+    <xsl:template match="imscp:manifest/imscp:metadata">
+        <metadata>
+            <schema>IMS Content</schema>
+            <schemaversion>1.2</schemaversion>
+        </metadata>
+    </xsl:template>
+
+    <xsl:template match="imscp:manifest/imscp:organizations">
+        <organizations>
+            <xsl:attribute name="default">
+                <xsl:value-of select="concat('ORG',@default)"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </organizations>
+    </xsl:template>
+
+    <xsl:template match="imscp:organization">
+        <organization>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="concat('ORG',@identifier    )"/>
+            </xsl:attribute>
+            <xsl:apply-templates select="imscp:item"/>
+        </organization>
+    </xsl:template>
+
+    <xsl:template match="imscp:title">
+        <title>
+            <xsl:value-of select="."/>
+        </title>
+    </xsl:template>
+
+    <xsl:template match="imscp:item">
+        <xsl:if test="@ocw:sectionTemplateType = 'CourseHomePage' ">
+            <item identifier="indexitem" identifierref="index">
+                <xsl:apply-templates select="imscp:title"/>
+            </item>
+        </xsl:if>
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="concat('ITM',generate-id())"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:choose>
+                <xsl:when test="@ocw:sectionTemplateType and (@ocw:sectionTemplateType != '')">
+                    <xsl:attribute name="isvisible">
+                        <xsl:text>true</xsl:text>
+                    </xsl:attribute>
+                </xsl:when>
+            </xsl:choose>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+
+    <xsl:template match="imscp:resources">
+        <resources> 
+            <xsl:apply-templates select="imscp:resource"/>
+        </resources>
+    </xsl:template>
+
+
+    <xsl:template match="imscp:resource">
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:if test="/imscp:manifest/imscp:organizations//imscp:item[@identifierref=$identifier]/@ocw:sectionTemplateType = 'CourseHomePage' ">
+            <resource identifier="index" type="webcontent">
+                <metadata>
+                    <imsmd:lom>
+                        <imsmd:general>
+                            <imsmd:identifier>index</imsmd:identifier>
+                            <imsmd:title>
+                                <imsmd:langstring xml:lang="x-none">
+                                    <xsl:value-of select="imscp:metadata/lom:lom/lom:general/lom:title"/>
+                                 </imsmd:langstring>
+                            </imsmd:title>
+                        </imsmd:general>
+                    </imsmd:lom>
+                    <eduCommons:eduCommons>
+                        <eduCommons:objectType>Course</eduCommons:objectType>
+                        <eduCommons:license category="Site Default"/>
+                        <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                        <eduCommons:accessible>false</eduCommons:accessible>
+                    </eduCommons:eduCommons>
+                </metadata>
+                <file href="index.html"/>
+            </resource>
+        </xsl:if>
+        <xsl:apply-templates select="imscp:file"/>
+    </xsl:template>
+    
+    
+    <xsl:template match="imscp:file">
+        <xsl:variable name="identifier" select="../@identifier"/>
+        <xsl:variable name="filecount" select="count(../imscp:file)"/>
+        <xsl:variable name="home" select="/imscp:manifest/imscp:organizations//imscp:item[@identifierref=$identifier]/@ocw:sectionTemplateType"/>
+        <xsl:variable name="restype" select="../@type"/>
+        <xsl:variable name="reshref" select="../@href"/>
+        <xsl:variable name="title" select="../imscp:metadata/lom:lom/lom:general/lom:title"/>
+        
+        <xsl:variable name="fidentifier">
+            <xsl:choose>
+                <xsl:when test="$filecount > 1 and not ($reshref = @href)">
+                    <xsl:value-of select="concat($identifier,generate-id())"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="$identifier"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+                
+        <resource>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="$fidentifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="type">
+                    <xsl:variable name="contenttype" select="../@type"/>
+                    <xsl:choose>
+                        <xsl:when test="$filecount > 1 and not ($reshref = @href) or string-length($contenttype) = 0">
+                            <xsl:value-of select=" 'webcontent' "/>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:value-of select="$contenttype"/>        
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+             
+            
+                <metadata>
+                    <imsmd:lom>
+                        <imsmd:general>
+                            <imsmd:identifier> 
+                                <xsl:value-of select="$fidentifier"/>
+                            </imsmd:identifier>                 
+                            <imsmd:title>
+                                <imsmd:langstring>
+                                    <xsl:attribute name="xml:lang">
+                                        <xsl:variable name="language" select="../imscp:metadata/lom:lom/lom:general/lom:title/lom:string/@language"/>
+                                        <xsl:choose>
+                                            <xsl:when test="string-length($language) = 0">
+                                                <xsl:value-of select=" 'x-none' "/>
+                                            </xsl:when>
+                                            <xsl:otherwise>
+                                                <xsl:value-of select="$language"/>        
+                                            </xsl:otherwise>
+                                        </xsl:choose>
+                                    </xsl:attribute>
+                                <xsl:choose>
+                                    <xsl:when test="$filecount > 1 and not ($reshref = @href) or string-length($title)=0">
+                                        <xsl:call-template name="getFilename">
+                                            <xsl:with-param name="file_path" select="@href"/>
+                                        </xsl:call-template>
+                                    </xsl:when> 
+                                    <xsl:otherwise>
+                                        <xsl:value-of select="$title"/>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                                </imsmd:langstring>
+                            </imsmd:title>
+                            
+
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:general/lom:language"/>
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:general/lom:description"/>
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:classification"/>
+                        </imsmd:general>
+                        
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:lifeCycle"/>
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:technical" />
+                            <xsl:apply-templates select="../imscp:metadata/lom:lom/lom:rights"/>
+                    </imsmd:lom>
+                    <xsl:if test="$home='CourseHomePage' ">
+                        <eduCommons:eduCommons>
+                            <eduCommons:excludeFromNav>
+                                true
+                            </eduCommons:excludeFromNav>
+                            <eduCommons:homePagePath>
+                                    <xsl:variable name="base_dir" select="//@xml:base"/>
+                                    <xsl:value-of select="concat($base_dir,@href) "/>
+                            </eduCommons:homePagePath>
+                        </eduCommons:eduCommons>
+                      </xsl:if>  
+                </metadata>
+            
+            <file>
+                <xsl:attribute name="href">
+                    <xsl:variable name="base_dir" select="//@xml:base"/>
+                    <xsl:value-of select="concat($base_dir,@href) "/>
+                </xsl:attribute>
+            </file>
+        </resource>
+    </xsl:template>
+    
+    
+    <!-- rules for the lom:rights section -->
+    <xsl:template match="lom:rights">
+        <imsmd:rights>
+            <imsmd:copyrightandotherrestrictions>
+                <imsmd:source>
+                    <imsmd:langstring xml:lang="x-none">
+                        <xsl:value-of select="lom:copyrightAndOtherRestrictions/lom:source"/>
+                    </imsmd:langstring>
+                </imsmd:source>
+                <imsmd:value>
+                    <imsmd:langstring xml:lang="x-none">
+                        <xsl:value-of select="lom:copyrightAndOtherRestrictions/lom:value"/>
+                    </imsmd:langstring>
+                </imsmd:value>
+            </imsmd:copyrightandotherrestrictions>
+            <imsmd:description>
+                <imsmd:langstring xml:lang="x-none">
+                    <xsl:value-of select="lom:description/lom:string"/>
+                </imsmd:langstring>
+            </imsmd:description>
+        </imsmd:rights>
+    </xsl:template>
+    
+    <!-- rules for lom:technical section -->
+    
+    <xsl:template match="lom:technical">
+        <imsmd:technical>
+            <xsl:apply-templates select="lom:format"/>
+            <xsl:apply-templates select="lom:size"/>
+            <xsl:apply-templates select="lom:location"></xsl:apply-templates>
+         </imsmd:technical>
+    </xsl:template>
+    
+    <xsl:template match="lom:format">
+        <imsmd:format>
+            <xsl:value-of select="."/>
+        </imsmd:format>
+    </xsl:template>
+    
+    <xsl:template match="lom:size">
+        <imsmd:size>
+            <xsl:value-of select="."/>
+        </imsmd:size>
+    </xsl:template>
+
+    <xsl:template match="lom:location">
+        <imsmd:location>
+            <xsl:value-of select="."/>
+        </imsmd:location>
+    </xsl:template>
+    
+    <!-- rules for lom:general section -->
+    <xsl:template match="lom:language">
+        <imsmd:language>
+            <xsl:value-of select="."/>
+        </imsmd:language>
+    </xsl:template>
+    
+    <xsl:template match="lom:description">
+        <imsmd:description>
+            <xsl:apply-templates select="lom:string"/>
+        </imsmd:description>
+    </xsl:template>
+    
+    <xsl:template match="lom:classification">
+        <xsl:apply-templates select="lom:keyword"/>
+    </xsl:template>
+    
+    <xsl:template match="lom:keyword">
+        <imsmd:keyword>
+            <xsl:apply-templates select="lom:string"/>
+        </imsmd:keyword>
+    </xsl:template>
+    
+    
+    <!-- rules for the lom:lifeCycle section -->
+    
+    <xsl:template match="lom:lifeCycle">
+        <imsmd:lifecycle>
+            <xsl:apply-templates select="lom:contribute"/>
+        </imsmd:lifecycle>
+    </xsl:template>
+    
+    <xsl:template match="lom:contribute">
+        <imsmd:contribute>
+            <xsl:apply-templates select=" lom:role"/>
+            <imsmd:centity>
+                <imsmd:vcard>
+                    <xsl:text>BEGIN:VCARD
+                    </xsl:text>
+                    <xsl:text>FN:</xsl:text>
+                    <xsl:value-of select="lom:entity"/>
+                    <xsl:text>
+                    </xsl:text>
+                    <xsl:text>END:VCARD</xsl:text>
+                </imsmd:vcard>
+            </imsmd:centity>
+            <imsmd:date>
+                <imsmd:datetime>
+                    <xsl:value-of select="lom:date/lom:dateTime"/>
+                </imsmd:datetime>
+            </imsmd:date>
+        </imsmd:contribute>
+    </xsl:template>
+    
+    <xsl:template match="lom:role">
+        <imsmd:role>
+            <imsmd:source>
+                <imsmd:langstring>
+                    <xsl:attribute name="xml:lang">
+                        <xsl:value-of select="'x-none'"/>
+                    </xsl:attribute>
+                    <xsl:value-of select="substring-after(lom:source,'OCW_')"/>
+                </imsmd:langstring>
+            </imsmd:source>
+            <imsmd:value>
+                <imsmd:langstring>
+                    <xsl:attribute name="xml:lang">
+                        <xsl:value-of select="'x-none'"/>
+                    </xsl:attribute>
+                    <xsl:value-of select="lom:value"/>
+                </imsmd:langstring>               
+            </imsmd:value>
+        </imsmd:role>
+    </xsl:template>
+    
+    <!-- generic rules -->
+
+    <xsl:template match="lom:string">
+        <xsl:variable name="language" select="@language"/>
+        <imsmd:langstring>
+            <xsl:attribute name="xml:lang">
+                <xsl:choose>
+                    <xsl:when test="string-length($language) = 0">
+                        <xsl:value-of select=" 'x-none' "/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="$language"/>        
+                    </xsl:otherwise>
+                    </xsl:choose>
+            </xsl:attribute>
+            <xsl:value-of select="."/>
+        </imsmd:langstring>
+    </xsl:template>
+    
+    <xsl:template match="adlcp:location"> </xsl:template>
+
+    
+    <!-- the following rules are for retrieving a title from a reference --> 
+    <xsl:template name="getFilename">
+        <xsl:param name="file_path"/>
+        <xsl:variable name="rfile_path">
+            <xsl:call-template name="reverse_chars">
+                <xsl:with-param name="string_var" select="@href"/>
+            </xsl:call-template>
+        </xsl:variable>
+        <xsl:variable name="trim_rfile_path" select="substring-before($rfile_path,'/')"/>
+        <xsl:variable name="file_name">
+            <xsl:choose>
+                <xsl:when test="$trim_rfile_path">
+                    <xsl:call-template name="reverse_chars">
+                        <xsl:with-param name="string_var" select="$trim_rfile_path"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:call-template name="reverse_chars">
+                        <xsl:with-param name="string_var" select="$rfile_path"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:variable name="wext_file_name" select="substring-before($file_name,'.')"/>
+        <xsl:choose>
+            <xsl:when test="$wext_file_name">
+                <xsl:value-of select="$wext_file_name"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$file_name"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template name="reverse_chars">
+        <xsl:param name="string_var"/>
+        <xsl:param name="rstring"/>
+        <xsl:choose>
+            <xsl:when test="$string_var">
+                <xsl:call-template name="reverse_chars">
+                    <xsl:with-param name="string_var" select="substring($string_var, 2)"/>
+                    <xsl:with-param name="rstring"
+                        select="concat(substring($string_var, 1, 1),
+                        $rstring)"
+                    />
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$rstring"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_glossary_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_glossary_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_glossary_xform.xsl	(revision 712)
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:webct="http://www.webct.com/IMS" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+    
+    <xsl:template match="/">
+        <html><head/>
+        <body>
+        <table class="documentTable" style="width: 499px;" border="0" cellpadding="0" cellspacing="0">
+            <thead>
+            <tr><td>
+                <xsl:value-of select="'keyword'"/>
+            </td><td>
+                    <xsl:value-of select="'definition'"/>
+                </td></tr>
+            </thead>
+            <tbody>
+        <xsl:apply-templates select="webct:glossary/webct:gloss"/>
+                </tbody>
+         </table>
+        </body>    
+        </html>
+    </xsl:template>
+    
+    <xsl:template match="webct:glossary/webct:gloss">
+
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:choose>
+                        <xsl:when test="position() mod 2 = 1">
+                            <xsl:value-of select="'odd'"/>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:value-of select="'even'"/>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+                <td>
+                <xsl:value-of select="webct:keyword"/>
+                </td><td>
+                    <xsl:value-of select="webct:definition"/>
+             </td></tr>
+    </xsl:template>       
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_image_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_image_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_image_xform.xsl	(revision 712)
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:fn="http://www.w3.org/2005/02/xpath-functions" xmlns:didl="http://www.mpeg.org/mpeg-21/2002/01-DIDL-NS" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+    
+    <xsl:template match="/">
+        <html><head/>
+        <body>
+        <table class="documentTable" style="width: 499px;" border="0" cellpadding="0" cellspacing="0">
+            <thead><tr><td>
+                <xsl:value-of select="'Images'"/>
+            </td></tr></thead>
+            <tbody>
+        <xsl:apply-templates select="didl:DIDL/didl:CONTAINER/didl:ITEM"/>
+                </tbody>
+         </table>
+        </body>    
+        </html>
+    </xsl:template>
+    
+    <xsl:template match="didl:DIDL/didl:CONTAINER/didl:ITEM">
+
+            <tr>
+                <xsl:attribute name="class">
+                    <xsl:choose>
+                        <xsl:when test="position() mod 2 = 1">
+                            <xsl:value-of select="'odd'"/>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:value-of select="'even'"/>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:attribute>
+                <td>
+                <a>
+                    <xsl:attribute name="href">
+                        <xsl:value-of select="didl:COMPONENT/didl:RESOURCE/@REF"/>
+                    </xsl:attribute>
+                    <xsl:value-of select="didl:DESCRIPTOR/didl:DESCRIPTOR/didl:STATEMENT"/>
+                </a>
+             </td></tr>
+    </xsl:template>
+    
+    <xsl:template match="didl:COMPONENT">
+     </xsl:template>
+        
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/WebCT_import_xform.xsl	(revision 712)
@@ -0,0 +1,434 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0" 
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:fn="http://www.w3.org/2005/02/xpath-functions"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"                
+    xmlns:cwsp="http://www.dspace.org/xmlns/cwspace_imscp"
+    xmlns:adlcp="http://www.adlnet.org/xsd/adlcp_rootv1p2"
+    xmlns:ocw="http://ocw.mit.edu/xmlns/ocw_imscp"
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2"
+    xmlns:imsct="http://www.imsproject.org/content"
+    xmlns:lom="http://www.imsproject.org/metadata"
+    xmlns:webct="http://www.webct.com/IMS"
+    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">
+
+    <xsl:output method="xml" indent="yes" />
+    
+    <xsl:template match="/imsct:manifest">
+        <manifest>
+            <xsl:attribute name="version">
+                <xsl:text>1.0</xsl:text>
+            </xsl:attribute>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="xsi:schemaLocation">
+                <xsl:text>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</xsl:text>
+            </xsl:attribute>
+            <metadata>
+                <xsl:value-of select="unparsed-entity-uri('http://www.google.com')"/>
+                <schema>IMS Content</schema>
+                <schemaversion>1.2</schemaversion>
+                <xsl:call-template name="general" >
+                    <xsl:with-param name="title" select="imsct:metadata/lom:lom/lom:general/lom:title/lom:langstring"/>
+                    <xsl:with-param name="identifier" select="@identifier"/>
+                </xsl:call-template>
+            </metadata>
+            <organizations>
+                <organization>
+                    <xsl:attribute name="identifier">
+                        <xsl:value-of select="imsct:organizations/imsct:organization/@identifier"/>
+                    </xsl:attribute>
+                    <xsl:apply-templates select=".//imsct:manifest">
+                        <xsl:with-param name="section" select="'organizations'"/>
+                    </xsl:apply-templates>
+                 </organization>
+            </organizations>
+            <resources>
+            <xsl:apply-templates select=".//imsct:manifest">
+                <xsl:with-param name="section" select="'resources'"/>
+            </xsl:apply-templates>
+             </resources>
+        </manifest>
+    </xsl:template>
+  
+    
+    <xsl:template match="imsct:manifest">
+        <xsl:param name="section"/>
+        <xsl:variable name="manifest_type" select="imsct:metadata//lom:learningresourcetype/lom:value/lom:langstring"/>
+        <xsl:variable name="manifest_title" select="imsct:metadata//lom:title/lom:langstring"/>
+        <xsl:variable name="manifest_id" select="@identifier"/>
+        
+        <xsl:if test="$manifest_type='Content Module' ">
+            <xsl:call-template name="resource">
+                <xsl:with-param name="section" select="$section"/>
+                <xsl:with-param name="title" select="$manifest_title"/>
+                <xsl:with-param name="file_name" select="concat($manifest_id,'.html')"/>
+                <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+             </xsl:call-template>
+        </xsl:if>
+        
+        <xsl:apply-templates select="imsct:resources/imsct:resource">
+            <xsl:with-param name="manifest_type" select="$manifest_type"/>
+            <xsl:with-param name="manifest_title" select="$manifest_title"/>
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="manifest_id" select="$manifest_id"/>
+        </xsl:apply-templates>
+    </xsl:template>    
+ 
+    
+    
+    <xsl:template match="imsct:resources/imsct:resource">
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:if test="imsct:file">
+            <xsl:if test="imsct:file/@href != ''">
+            <xsl:choose>
+                <xsl:when test="$manifest_type='Glossary'">
+                    <xsl:call-template name="Glossary">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="section" select="$section"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:when test="$manifest_type='Image Database'">
+                    <xsl:apply-templates select="imsct:file">
+                        <xsl:with-param name="section" select="$section"/>
+                        <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="database" select="@href"/>
+                    </xsl:apply-templates>
+                </xsl:when>
+                <!--xsl:when test="$manifest_type='Organizer Page'">
+                    <xsl:call-template name="OrgPage"/>
+                </xsl:when-->
+                <xsl:when test="$manifest_type='Single Page'">
+                    <xsl:call-template name="SinglePage">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="section" select="$section"/>                        
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:when test="$manifest_type='Content Module'">
+                    <xsl:call-template name="ContentModule">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="section" select="$section"/>                        
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:when test="$manifest_type='URL' ">
+                    <xsl:call-template name="URL">
+                        <xsl:with-param name="manifest_title" select="$manifest_title"/>
+                        <xsl:with-param name="manifest_id" select="$manifest_id"/>
+                        <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                        <xsl:with-param name="section" select="$section"/>     
+                    </xsl:call-template>
+                </xsl:when>
+            </xsl:choose>
+        </xsl:if>
+        </xsl:if>    
+    </xsl:template>
+    
+    
+    
+    <xsl:template name="ContentModule">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:if test="@type='webcontent'">        
+            <xsl:call-template name="resource">
+                <xsl:with-param name="section" select="$section"/>
+                <xsl:with-param name="title" select="//imsct:item[@identifierref=$identifier]/imsct:title"/>
+                <xsl:with-param name="file_name">
+                    <xsl:call-template name="ChangeExtension">
+                        <xsl:with-param name="file_name" select="imsct:file/@href"/>
+                    </xsl:call-template>
+                </xsl:with-param>
+                <xsl:with-param name="isvis" select="'false'"/>                
+            </xsl:call-template>    
+        </xsl:if>
+    </xsl:template>
+    
+    
+    <xsl:template name="Glossary">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:call-template name="resource">
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="title" select="$manifest_title"/>
+            <xsl:with-param name="file_name">
+                <xsl:call-template name="ChangeExtension">
+                    <xsl:with-param name="file_name" select="imsct:file/@href"/>
+                </xsl:call-template>
+            </xsl:with-param>
+            <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>                
+        </xsl:call-template>
+    </xsl:template>
+    
+    
+    <xsl:template match="imsct:file">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="database"/>
+        
+        <xsl:if test="$manifest_type='Image Database'">
+            <xsl:variable name="title">
+                <xsl:choose>
+                    <xsl:when test="@href = $database">
+                        <xsl:value-of select="$manifest_title"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:call-template name="getTitle">
+                            <xsl:with-param name="file_path" select="@href"/>
+                        </xsl:call-template> 
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:variable>
+            <xsl:variable name="isvis">
+                <xsl:choose>
+                    <xsl:when test="@href = $database">
+                        <xsl:value-of select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="'false'"/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:variable>
+            <xsl:call-template name="resource">
+                <xsl:with-param name="section" select="$section"/>
+                <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                <xsl:with-param name="title" select="$title"/>
+                <xsl:with-param name="file_name">
+                    <xsl:call-template name="ChangeExtension">
+                        <xsl:with-param name="file_name" select="@href"/>
+                    </xsl:call-template>
+                </xsl:with-param>
+                <xsl:with-param name="isvis" select="$isvis"/>                
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>
+    
+    
+    <xsl:template name="getTitle">
+        <xsl:param name="file_path"/>
+        <xsl:variable name="rfile_path">
+            <xsl:call-template name="reverse3">
+                <xsl:with-param name="theString" select="@href"/>
+            </xsl:call-template>
+        </xsl:variable>
+        <xsl:variable name="trim_rfile_path" select="substring-before($rfile_path,'/')"/>
+        <xsl:variable name="file_name">
+            <xsl:choose>
+                <xsl:when test="$trim_rfile_path">
+                    <xsl:call-template name="reverse3">
+                        <xsl:with-param name="theString" select="$trim_rfile_path"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:call-template name="reverse3">
+                        <xsl:with-param name="theString" select="$rfile_path"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>    
+        </xsl:variable>
+        <xsl:variable name="wext_file_name" select="substring-before($file_name,'.')"/>
+        <xsl:choose>
+            <xsl:when test="$wext_file_name">
+                <xsl:value-of select="$wext_file_name"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$file_name"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    
+    <xsl:template name="reverse3">
+        <xsl:param name="theString" />
+        <xsl:param name="reversedString" />
+        <xsl:choose>
+            <xsl:when test="$theString">
+                <xsl:call-template name="reverse3">
+                    <xsl:with-param name="theString"
+                        select="substring($theString, 2)" />
+                    <xsl:with-param name="reversedString"
+                        select="concat(substring($theString, 1, 1),
+                        $reversedString)" />
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$reversedString" />
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    
+    <xsl:template name="ChangeExtension">
+        <xsl:param name="file_name"/>
+        <xsl:choose>
+            <xsl:when test="substring($file_name,string-length($file_name)-3,4)='.xml'">
+                <xsl:value-of select="concat(substring($file_name,1,string-length($file_name)-4),'.html')"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$file_name"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+    
+    
+    <xsl:template name="OrgPage"/>
+
+    
+ 
+    <xsl:template name="URL">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:call-template name="resource">
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="file_name" select="concat(@identifier,'.html') "/>                        
+            <xsl:with-param name="title" select="$manifest_title"/>
+            <xsl:with-param name="manifest_type" select="$manifest_type"/>
+            <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+        </xsl:call-template>
+    </xsl:template>    
+    
+    
+    <xsl:template name="SinglePage">
+        <xsl:param name="section"/>
+        <xsl:param name="manifest_title"/>
+        <xsl:param name="manifest_id"/>
+        <xsl:call-template name="resource">
+            <xsl:with-param name="section" select="$section"/>
+            <xsl:with-param name="file_name">
+                <xsl:call-template name="ChangeExtension">
+                    <xsl:with-param name="file_name" select="imsct:file/@href"/>
+                </xsl:call-template>
+            </xsl:with-param>            
+            <xsl:with-param name="title" select="$manifest_title"/>
+            <xsl:with-param name="isvis" select="//imsct:item[@identifierref=$manifest_id]/@isvisible"/>
+        </xsl:call-template>
+    </xsl:template>
+    
+    
+    <xsl:template name="resource">
+        <xsl:param name="section"/>
+        <xsl:param name="title"/>
+        <xsl:param name="file_name"/>
+        <xsl:param name="manifest_type"/>
+        <xsl:param name="isvis"/>
+        <xsl:variable name="res_id" select="generate-id()"/>
+        <xsl:variable name="org_id" select="concat($res_id,'_O')"/>
+        <xsl:choose>
+            <xsl:when test="$section='resources'">
+                <xsl:call-template name="res_resource">
+                    <xsl:with-param name="title" select="$title"/>
+                    <xsl:with-param name="identifier" select="$res_id"/>
+                    <xsl:with-param name="file_name" select="$file_name"/>
+                    <xsl:with-param name="manifest_type" select="$manifest_type"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="$section='organizations' ">
+                <xsl:call-template name="org_item">
+                    <xsl:with-param name="title" select="$title"/>
+                    <xsl:with-param name="isvis" select="$isvis"/>
+                    <xsl:with-param name="identifier" select="$org_id"/>
+                    <xsl:with-param name="identifierref" select="$res_id"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose> 
+    </xsl:template>
+    
+    
+    
+    <xsl:template name="res_resource">
+        <xsl:param name="identifier"/>
+        <xsl:param name="title"/>
+        <xsl:param name="file_name"/>
+        <xsl:param name="manifest_type"/>
+        <resource>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="$identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="type">
+                <xsl:choose>
+                    <xsl:when test="$manifest_type='URL' ">
+                        <xsl:value-of select="'external link'"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                         <xsl:text>webcontent</xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:attribute>
+            <metadata>
+                <imsmd:lom>
+                    <xsl:call-template name="general">
+                        <xsl:with-param name="title" select="$title"/>
+                        <xsl:with-param name="identifier" select="$identifier"/>
+                    </xsl:call-template>
+                </imsmd:lom>
+                <eduCommons:eduCommons>
+                    <eduCommons:license category="Site Default"/>
+                    <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                    <eduCommons:accessible>false</eduCommons:accessible>
+                </eduCommons:eduCommons>
+            </metadata>
+                <file>
+                    <xsl:attribute name="href">
+                        <xsl:value-of select="$file_name"/>
+                    </xsl:attribute>
+               </file>
+        </resource>    
+    </xsl:template>
+
+    
+    <xsl:template name="org_item">
+        <xsl:param name="title"/>
+        <xsl:param name="identifier"/>
+        <xsl:param name="isvis"/>
+        <xsl:param name="identifierref"/>
+        <item>   
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="$identifier"/>      
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="$identifierref"/>
+            </xsl:attribute>
+            <xsl:attribute name="isvisible" >
+                <xsl:value-of select="$isvis"/>
+            </xsl:attribute>      
+            <title>
+                <xsl:value-of select="$title"/>
+            </title>
+        </item>
+    </xsl:template>
+
+    
+    <xsl:template name="general">
+        <xsl:param name="title"/>
+        <xsl:param name="identifier"/>
+        <imsmd:general>
+            <imsmd:identifier>
+                <xsl:value-of select="$identifier"/>
+            </imsmd:identifier>
+            <imsmd:title>
+                <imsmd:langstring xml:lang="en">
+                    <xsl:value-of select="$title"/>                            
+                </imsmd:langstring>                 
+            </imsmd:title>
+        </imsmd:general>
+    </xsl:template>
+    
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/eXe_import_xform.xsl
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/eXe_import_xform.xsl	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/eXe_import_xform.xsl	(revision 712)
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet 
+    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+    version="1.0"
+    xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:imscp="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:imsmd="http://www.imsglobal.org/xsd/imsmd_v1p2"
+    xmlns:eduCommons="http://cosl.usu.edu/xsd/eduCommonsv1.2">
+   
+    <xsl:output method="xml" indent="yes"/>
+    
+    <xsl:template match="/">
+        <manifest xsi:schemaLocation="http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p4.xsd http://cosl.usu.edu/xsd/eduCommonsv1.2 http://cosl.usu.edu/xsd/educommonsv1.2.xsd">
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="imscp:manifest/@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </manifest>
+    </xsl:template>
+    
+    <xsl:template match="imscp:metadata">
+        <metadata>
+            <schema>IMS Content</schema>
+            <schemaversion>1.2</schemaversion>
+        </metadata>
+    </xsl:template>
+    
+    <xsl:template match="imscp:organizations">
+        <organizations>
+            <xsl:apply-templates select="imscp:organization"/>
+        </organizations>
+    </xsl:template>
+    
+    <xsl:template match="imscp:organization">
+        <organization>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </organization>
+    </xsl:template>
+    
+    <xsl:template match="imscp:title">
+        <title>
+            <xsl:value-of select="."/>
+        </title>
+    </xsl:template>
+    
+    <xsl:template match="imscp:item">
+        <item>
+            <xsl:attribute name="identifier">
+                <xsl:value-of select="@identifier"/>
+            </xsl:attribute>
+            <xsl:attribute name="identifierref">
+                <xsl:value-of select="@identifierref"/>
+            </xsl:attribute>
+            <xsl:attribute name="isvisible">
+                <xsl:value-of select="@isvisible"/>
+            </xsl:attribute>
+            <xsl:apply-templates/>
+        </item>
+    </xsl:template>
+    
+    <xsl:template match="imscp:resources">
+        <resources>
+            <xsl:apply-templates select="imscp:resource"/>
+        </resources>
+    </xsl:template>
+    
+    <xsl:template match="imscp:resource">
+        <xsl:variable name="identifier" select="@identifier"/>
+        <xsl:variable name="title" select="/imscp:manifest/imscp:organizations//imscp:item[@identifierref=$identifier]/imscp:title"/>
+        <xsl:variable name="restype" select="@type"/>
+        <xsl:variable name="reshref" select="@href"/>
+        <xsl:for-each select="imscp:file">
+            <resource>
+                <xsl:choose>
+                    <xsl:when test="@href=$reshref">
+                        <xsl:attribute name="identifier">
+                            <xsl:value-of select="$identifier"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="type">
+                            <xsl:value-of select="$restype"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="href">
+                            <xsl:value-of select="@href"/>
+                        </xsl:attribute>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:attribute name="identifier">
+                            <xsl:value-of select="concat('RES', generate-id())"/>
+                        </xsl:attribute>
+                        <xsl:attribute name="type">
+                            <xsl:text>unknown</xsl:text>
+                        </xsl:attribute>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:choose>
+                    <xsl:when test="@href=$reshref">
+                        <metadata>
+                            <imsmd:lom>
+                                <imsmd:general>
+                                    <imsmd:title>
+                                        <imsmd:langstring xml:lang="en">
+                                            <xsl:value-of select="$title"/>
+                                        </imsmd:langstring>
+                                    </imsmd:title>
+                                </imsmd:general>
+                            </imsmd:lom>
+                            <xsl:choose>
+                                <xsl:when test="$title='Home'">
+                                    <eduCommons:eduCommons>
+                                        <eduCommons:objectType>Course</eduCommons:objectType>
+                                        <eduCommons:license category="Site Default"/>
+                                        <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                                    </eduCommons:eduCommons>
+                                </xsl:when>
+                            </xsl:choose>
+                        </metadata>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <metadata>
+                            <imsmd:lom>
+                            <imsmd:general>
+                                <imsmd:title>
+                                    <imsmd:langstring xml:lang="en">
+                                        <xsl:value-of select="@href"/>
+                                    </imsmd:langstring>
+                                </imsmd:title>
+                            </imsmd:general>
+                            </imsmd:lom>
+                            <eduCommons:eduCommons>
+                                <eduCommons:license category="Site Default"/>
+                                <eduCommons:clearedCopyright>false</eduCommons:clearedCopyright>
+                            </eduCommons:eduCommons>
+                        </metadata>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <file>
+                    <xsl:attribute name="href">
+                        <xsl:value-of select="@href"/>
+                    </xsl:attribute>
+                </file>
+            </resource>
+        </xsl:for-each>
+    </xsl:template>
+    
+   
+</xsl:stylesheet>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/imscp_v1p2.xsd
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/imscp_v1p2.xsd	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/imscp_v1p2.xsd	(revision 712)
@@ -0,0 +1,332 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+<xs:schema xmlns="http://www.imsglobal.org/xsd/imscp_v1p1"
+    targetNamespace="http://www.imsglobal.org/xsd/imscp_v1p1"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    xmlns:xsi="http://www.w3.org/2000/10/XMLSchema-instance"
+    version="IMS CP 1.2"
+    elementFormDefault="qualified"
+    attributeFormDefault="unqualified">
+    <xs:import namespace = "http://www.w3.org/XML/1998/namespace" schemaLocation = "http://www.w3.org/2001/03/xml.xsd"/>
+    <xs:annotation>
+        <xs:documentation>
+            XSD Data File Information
+            -------------------------
+            Author:       CP1P2 Project Team
+            Date:         20th November, 2005
+            Version:      1.0
+            Status:       Public Draft
+            Description:  This is a normative representation of the IMS CP 1.2 Information Model for binding 
+                          purposes.  Read the corresponding IMS CP Information Model for the Platform 
+                          Independent Model representation.
+
+            History:      This is version 1 of the IMS CP v1.2 XSD.  It directly supercedes IMS CP v1.1.4 XSD.
+                          Note that the target namespace has NOT been changed.
+                          Apart from the functional additions, the main structural changes are:
+                          (1) All of the elements and attributes are defined as local to their host object;
+                          (2) Comments have been added to the complexType definitions.
+
+            Copyright:    2005 (c) IMS Global Learning Consortium Inc.  All Rights Reserved.
+                          IMS Global Learning Consortium, Inc. (IMS) is publishing the information
+                          contained in this binding ("Specification") for purposes of scientific
+                          experimental and scholarly collaboration only.  IMS makes no warranty or 
+                          representation regarding the accuracy or completeness of the Specification.
+                          This material is provided on an "As Is" and "As Available basis".
+                          The Specification is at all times subject to change and revision without
+                          notice. It is your sole responsibility to evaluate the usefulness, accuracy
+                          and completeness of the Specification as it relates to you.  IMS would
+                          appreciate receiving your comments and suggestions.  Please contact IMS
+                          through our website at: http://www.imsglobal.org.
+
+            Source XSLT File Information
+            ----------------------------
+            XSL Generator:    UMLtoXSDTransformv0p7.xsl
+            XSLT Processor:   Xalan
+            Release:          1.0 Beta 1
+            Date:             31st October, 2005
+
+            Auto-generation Tool
+            --------------------
+            This WSDL/XSD was auto-generated using the IMS WSDL/XSD auto-generation tool.  While every attempt
+            has been made to ensure that this tool auto-generates the XSDs correctly, users should be aware
+            that this is an experimental tool.  Permission is given to make use of this tool.  IMS makes no
+            claim on the materials created by third party users of this tool.  Details on how to use this tool
+            are contained in the IMS document: "IMS General Web Services: WSDL/XSD Binding Auto-generation"
+            available at the IMS web-site.
+            Tool Copyright:  2005 (c) IMS Global Learning Consortium Inc.  All Rights Reserved.
+        </xs:documentation>
+    </xs:annotation>
+
+        <!-- Generate Global Attributes ***********************************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate Namespaced extension Group  *************************************************************  -->
+
+            <xs:group name="grp.any">
+                <xs:annotation>
+                    <xs:documentation>
+                        Any namespaced element from any namespace may be included within an "any" element.
+                        The namespace for the imported element must be defined in the instance, and the schema must be imported.
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:any namespace = "##other" processContents = "strict" minOccurs = "0" maxOccurs = "unbounded"/>
+                </xs:sequence>
+            </xs:group>
+
+        <!-- =====================================  -->
+
+        <!-- Generate the enumerated simpleType declarations **************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate the simpleType elements based IMS data-types  *******************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate the derived data-type elements **********************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Generate the data-type elements ******************************************************************  -->
+
+            <xs:complexType name="Manifest.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A manifest element is a container for data structures whose contents describe a 
+                        semantically complete instance of the IMS Content Packaging Information Model.  
+                        
+                        A manifest element may contain and reference child manifest elements 
+                        in the same IMS Manifest document.  The root manifest element defines an 
+                        entire IMS Package.  A child manifest element defines a semantically complete 
+                        subset of that Package.
+
+                        <p>Represents a binding of the kinds of objects defined as children of ims-cp-imManifest : Manifest.[ ManifestMetadata, Organizations, Resources, Manifest, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="metadata" type="ManifestMetadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="organizations" type="Organizations.Type" minOccurs = "1" maxOccurs = "1"/>
+                    <xs:element name="resources" type="Resources.Type" minOccurs = "1" maxOccurs = "1"/>
+                    <xs:element name="manifest" type="Manifest.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="version" use="optional" type="xs:string"/>
+                <xs:attribute ref="xml:base" use="optional"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Metadata.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        An instance of the metadata element contains data structures 
+                        that declare descriptive information about a metadata element's 
+                        parent only.
+                        
+                        One or more different metadata models may be declared as
+                        child extensions of a metadata element.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imMetadata:  Metadata.[ Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+            </xs:complexType>
+
+            <xs:complexType name="Organizations.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        The organizations element is a container for all data structures 
+                        that describe the way or ways that information encapsulated by 
+                        its parent manifest element is structured. 
+
+                        <p>Represents of binding of the child objects of ims-cp-imOrganizations: Organizations.[ Organization, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="organization" type="Organization.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="default" use="optional" type="xs:IDREF"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Resources.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        The Resources element is a container for data structures containing 
+                        references  to one or more assets.  Asset references may be grouped 
+                        within a containing resources element in whatever manner seems best.
+                          
+                        The scope of referenced assets is specific to a resources element's parent 
+                        manifest element only. 
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imResources: Resources.[ Resource, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="resource" type="Resource.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute ref="xml:base" use="optional"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Organization.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        An organization element is a container for all data structures relating 
+                        to a particular way or view that information encapsulated by a 
+                        grandparent manifest object is structured.  
+                        
+                        Multiple organization elements within the same parent organizations 
+                        element are equivalent in purpose: Each shows a different way for 
+                        structuring the same information declared within a grandparent 
+                        manifest object.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-Organization: Organization[ Title, Item, Metadata, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="title" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="item" type="Item.Type" minOccurs = "1" maxOccurs = "unbounded"/>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="structure" use="optional" default="hierarchical" type="xs:string"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Resource.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A resource element is a container for a particular asset 
+                        or collection of assets.  A resource may contain references 
+                        to assets that are all of the same type or different types (i.e., file formats).
+                        
+                        The scope or boundary of an IMS Package is defined by the asset 
+                        references collected into all resources containers associated with the
+                        root manifest element, whether as a child, direcdt descendant, or externally 
+                        linked descendant. 
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imResource: Resource.[ Metadata, File, Dependency, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="file" type="File.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:element name="dependency" type="Dependency.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="type" use="required" type="xs:string"/>
+                <xs:attribute ref="xml:base" use="optional"/>
+                <xs:attribute name="href" use="optional" type="xs:anyURI"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Item.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        An item element represents a structural node in a particular organization.  
+                        An item element may be a parent or sibling of other Item elements, 
+                        each one representing a unique structural node.
+                        
+                        An organization has no meaning unless it has at least one Item element.
+
+                        <p>Represents a binding of the kinds of child objects of ims-cp-imItem: Item.[ Title, Item, Metadata, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="title" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="item" type="Item.Type" minOccurs = "0" maxOccurs = "unbounded"/>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifier" use="required" type="xs:ID"/>
+                <xs:attribute name="identifierref" use="optional" type="xs:string"/>
+                <xs:attribute name="isvisible" use="optional" type="xs:boolean"/>
+                <xs:attribute name="parameters" use="optional" type="xs:string"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="File.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A file element declares a reference to a single asset.  The reference may
+                        be relative to the Package containing the file element or absolute 
+                        (external to the Package).
+                        
+                        A file element may contain child extensions declaring alternative references
+                         to the same asset as that referenced by the file element's href attribute.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imFile: File.[ Metadata, Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="metadata" type="Metadata.Type" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="href" use="required" type="xs:anyURI"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="Dependency.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        A dependency element provides a way to associate another collection of 
+                        asset references within the scope of the dependency element's parent 
+                        resource element.
+                        
+                        This element allows the parsimonious declaration of asset references.  
+                        Shared asset references can be declared once and associated many 
+                        times through a Dependency element.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imDependency: Dependency.[ Extension ].</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+                <xs:attribute name="identifierref" use="required" type="xs:string"/>
+                <xs:anyAttribute namespace = "##other" processContents = "strict"/>
+            </xs:complexType>
+
+            <xs:complexType name="ManifestMetadata.Type">
+                <xs:annotation>
+                    <xs:documentation>
+                        This metadata element contains data structures that declare 
+                        descriptive information about an entire Package.
+                        
+                        One or more different metadata models may be declared as
+                        child extensions of a metadata element.
+                        
+                        The schema and schemaversion children define the kind or collection 
+                        of metadata models being used.
+
+                        <p>Represents a binding of the kinds of child objects defined for ims-cp-imManifestMetadata:  ManifestMetadata.[ Schema, SchemaVersion, MetadataModel ]..</p>
+                    </xs:documentation>
+                </xs:annotation>
+                <xs:sequence>
+                    <xs:element name="schema" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:element name="schemaversion" type="xs:string" minOccurs = "0" maxOccurs = "1"/>
+                    <xs:group ref="grp.any"/>
+                </xs:sequence>
+            </xs:complexType>
+
+        <!-- =====================================  -->
+
+        <!-- Declaration of the elements **********************************************************************  -->
+
+        <!-- =====================================  -->
+
+        <!-- Declaration of the root element(s) ***************************************************************  -->
+
+            <xs:element name="manifest" type="Manifest.Type"/>
+
+        <!-- =====================================  -->
+
+</xs:schema>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/imsmd_v1p2p4.xsd
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/imsmd_v1p2p4.xsd	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS/imsmd_v1p2p4.xsd	(revision 712)
@@ -0,0 +1,588 @@
+<?xml version = "1.0" encoding = "UTF-8"?>
+<!--Generated by Turbo XML 2.3.1.100. Conforms to w3c http://www.w3.org/2001/XMLSchema-->
+<xsd:schema xmlns = "http://www.imsglobal.org/xsd/imsmd_v1p2"
+	 targetNamespace = "http://www.imsglobal.org/xsd/imsmd_v1p2"
+	 xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
+	 xmlns:xsd = "http://www.w3.org/2001/XMLSchema"
+	 version = "IMS MD 1.2.4"
+	 elementFormDefault = "qualified">
+	<xsd:import namespace = "http://www.w3.org/XML/1998/namespace" schemaLocation = "http://www.w3.org/2001/03/xml.xsd"/>
+	<xsd:annotation>
+		<xsd:documentation>2001-04-26 T.D.Wason. IMS meta-data 1.2 XML-Schema.                                  </xsd:documentation>
+		<xsd:documentation>2001-06-07 S.E.Thropp. Changed the multiplicity on all elements to match the         </xsd:documentation>
+		<xsd:documentation>Final 1.2 Binding Specification.                                                     </xsd:documentation>
+		<xsd:documentation>Changed all elements that use the langstringType to a multiplicy of 1 or more        </xsd:documentation>
+		<xsd:documentation>Changed centity in the contribute element to have a multiplicity of 0 or more.       </xsd:documentation>
+		<xsd:documentation>Changed the requirement element to have a multiplicity of 0 or more.                 </xsd:documentation>
+		<xsd:documentation> 2001-07-25 Schawn Thropp.  Updates to bring the XSD up to speed with the W3C        </xsd:documentation>
+		<xsd:documentation> XML Schema Recommendation.  The following changes were made: Change the             </xsd:documentation>
+		<xsd:documentation> namespace to reference the 5/2/2001 W3C XML Schema Recommendation,the base          </xsd:documentation>
+		<xsd:documentation> type for the durtimeType, simpleType, was changed from timeDuration to duration.    </xsd:documentation>
+		<xsd:documentation> Any attribute declarations that have use="default" had to change to use="optional"  </xsd:documentation>
+		<xsd:documentation> - attr.type.  Any attribute declarations that have value ="somevalue" had to change </xsd:documentation>
+		<xsd:documentation> to default = "somevalue" - attr.type (URI)                                          </xsd:documentation>
+		<xsd:documentation> 2001-09-04 Schawn Thropp                                                            </xsd:documentation>
+		<xsd:documentation> Changed the targetNamespace and namespace of schema to reflect version change       </xsd:documentation>
+		<xsd:documentation> 2001-11-04 Chris Moffatt:                                                           </xsd:documentation>
+		<xsd:documentation>  1. Changes to enable the schema to work with commercial XML Tools                  </xsd:documentation>
+		<xsd:documentation>     a. Refer to the xml namespace using the "x" abbreviation instead of "xml"       </xsd:documentation>
+		<xsd:documentation>     b. Remove unecessary non-deterministic constructs from schema.                  </xsd:documentation>
+		<xsd:documentation>        i.e. change occurrences of "#any" to "#other"                                </xsd:documentation>
+		<xsd:documentation>  2. Revert to original IMS MD version 1.2 namespace.                                </xsd:documentation>
+		<xsd:documentation>     i.e. "http://www.imsglobal.org/xsd/imsmd_v1p2"                                  </xsd:documentation>
+		<xsd:documentation>     This change done to support the decision to only change the XML namespace with  </xsd:documentation>
+		<xsd:documentation>     major revisions of the specification ie. where the information model or binding </xsd:documentation>
+		<xsd:documentation>     changes (as opposed to addressing bugs or omissions). A stable namespace is     </xsd:documentation>
+		<xsd:documentation>     necessary to the increasing number of implementors.                             </xsd:documentation>
+		<xsd:documentation>  3. Changed name of schema file to "imsmd_v1p2p2.xsd" and                           </xsd:documentation>
+		<xsd:documentation>     version attribute to "IMS MD 1.2.3" to reflect minor version change             </xsd:documentation>
+		<xsd:documentation>  2005-08-26 Colin Smythe (IMS/GLC)                                                  </xsd:documentation>
+		<xsd:documentation>  1. Added the IMS Copyright statement                                               </xsd:documentation>
+		<xsd:documentation>  2. Removed the x: prefix references and ensured the import statment uses the W3C   </xsd:documentation>
+		<xsd:documentation>     namespace (http://www.w3.org/XML/1998/namespace) and schemalocation             </xsd:documentation>
+		<xsd:documentation>     (http://www.w3.org/2001/03/xml.xsd).                                            </xsd:documentation>
+		<xsd:documentation>  3. Changed name of schema file to "imsmd_v1p2p4.xsd" and made sure the             </xsd:documentation>
+		<xsd:documentation>     version attribute to "IMS MD 1.2.4" to reflect minor version change.            </xsd:documentation>
+		<xsd:documentation>  4. The multiplicity of 'taxon' in 'taxon' path has been changed from 0..1 to 0..*. </xsd:documentation>
+		<xsd:documentation>     This problem was identified in the IMS Maintenance Database as issue: 198.      </xsd:documentation>
+		<xsd:documentation>     This is now consistent with IEEE LOM.            								</xsd:documentation>
+		<xsd:documentation>  5. The recursive element of 'taxon' within 'taxon' has been removed. 				</xsd:documentation>
+		<xsd:documentation>     This problem was identified in the IMS Maintenance Database as issue: 198.      </xsd:documentation>
+		<xsd:documentation>     This is now consistent with IEEE LOM.            								</xsd:documentation>
+		<xsd:documentation>  This is the version used for the IMS specification packages.                       </xsd:documentation>
+	</xsd:annotation>
+	<xsd:group name = "grp.any">
+		<xsd:annotation>
+			<xsd:documentation>Any namespaced element from any namespace may be used for an "any" element.  The namespace for the imported element must be defined in the instance, and the schema must be imported.  </xsd:documentation>
+		</xsd:annotation>
+		<xsd:sequence>
+			<xsd:any namespace = "##other" processContents = "strict" minOccurs = "0" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:group>
+	<xsd:attributeGroup name = "attr.type">
+		<xsd:attribute name = "type" default = "URI">
+			<xsd:simpleType>
+				<xsd:restriction base = "xsd:string">
+					<xsd:enumeration value = "URI"/>
+					<xsd:enumeration value = "TEXT"/>
+				</xsd:restriction>
+			</xsd:simpleType>
+		</xsd:attribute>
+	</xsd:attributeGroup>
+	
+	<!-- Copyright: 2005 (c) IMS Global Learning Consortium Inc.  All Rights Reserved.      -->
+	
+	
+	<!-- IMS Global Learning Consortium, Inc. (IMS) is publishing the information contained -->
+	
+	
+	<!-- in this binding (âSpecificationâ) for purposes of scientific, experimental and     -->
+	
+	
+	<!-- scholarly collaboration only.  IMS makes no warranty or representation regarding   -->
+	
+	
+	<!-- the accuracy or completeness of the Specification.  This material is provided on   -->
+	
+	
+	<!-- an âAs Isâ and âAs Availableâ basis.  The Specification is at all times subject    -->
+	
+	
+	<!-- to change and revision without notice.  It is your sole responsibility to evaluate -->
+	
+	
+	<!-- the usefulness, accuracy and completeness of the Specification as it relates to    -->
+	
+	
+	<!-- you.  IMS would appreciate receiving your comments and suggestions.  Please        -->
+	
+	
+	<!-- contact IMS through our website at: http://www.imsglobal.org.                      -->
+	
+	
+	<!-- ******************** -->
+	
+	
+	<!-- ** Change History ** -->
+	
+	
+	<!-- ******************** -->
+	
+	
+	<!-- *************************** -->
+	
+	
+	<!-- ** Attribute Declaration ** -->
+	
+	
+	<!-- *************************** -->
+	
+	
+	<!-- ************************* -->
+	
+	
+	<!-- ** Element Declaration ** -->
+	
+	
+	<!-- ************************* -->
+	
+	<xsd:element name = "aggregationlevel" type = "aggregationlevelType"/>
+	<xsd:element name = "annotation" type = "annotationType"/>
+	<xsd:element name = "catalogentry" type = "catalogentryType"/>
+	<xsd:element name = "catalog" type = "catalogType"/>
+	<xsd:element name = "centity" type = "centityType"/>
+	<xsd:element name = "classification" type = "classificationType"/>
+	<xsd:element name = "context" type = "contextType"/>
+	<xsd:element name = "contribute" type = "contributeType"/>
+	<xsd:element name = "copyrightandotherrestrictions" type = "copyrightandotherrestrictionsType"/>
+	<xsd:element name = "cost" type = "costType"/>
+	<xsd:element name = "coverage" type = "coverageType"/>
+	<xsd:element name = "date" type = "dateType"/>
+	<xsd:element name = "datetime" type = "datetimeType"/>
+	<xsd:element name = "description" type = "descriptionType"/>
+	<xsd:element name = "difficulty" type = "difficultyType"/>
+	<xsd:element name = "educational" type = "educationalType"/>
+	<xsd:element name = "entry" type = "entryType"/>
+	<xsd:element name = "format" type = "formatType"/>
+	<xsd:element name = "general" type = "generalType"/>
+	<xsd:element name = "identifier" type = "xsd:string"/>
+	<xsd:element name = "intendedenduserrole" type = "intendedenduserroleType"/>
+	<xsd:element name = "interactivitylevel" type = "interactivitylevelType"/>
+	<xsd:element name = "interactivitytype" type = "interactivitytypeType"/>
+	<xsd:element name = "keyword" type = "keywordType"/>
+	<xsd:element name = "kind" type = "kindType"/>
+	<xsd:element name = "langstring" type = "langstringType"/>
+	<xsd:element name = "language" type = "xsd:string"/>
+	<xsd:element name = "learningresourcetype" type = "learningresourcetypeType"/>
+	<xsd:element name = "lifecycle" type = "lifecycleType"/>
+	<xsd:element name = "location" type = "locationType"/>
+	<xsd:element name = "lom" type = "lomType"/>
+	<xsd:element name = "maximumversion" type = "minimumversionType"/>
+	<xsd:element name = "metadatascheme" type = "metadataschemeType"/>
+	<xsd:element name = "metametadata" type = "metametadataType"/>
+	<xsd:element name = "minimumversion" type = "maximumversionType"/>
+	<xsd:element name = "name" type = "nameType"/>
+	<xsd:element name = "purpose" type = "purposeType"/>
+	<xsd:element name = "relation" type = "relationType"/>
+	<xsd:element name = "requirement" type = "requirementType"/>
+	<xsd:element name = "resource" type = "resourceType"/>
+	<xsd:element name = "rights" type = "rightsType"/>
+	<xsd:element name = "role" type = "roleType"/>
+	<xsd:element name = "semanticdensity" type = "semanticdensityType"/>
+	<xsd:element name = "size" type = "sizeType"/>
+	<xsd:element name = "source" type = "sourceType"/>
+	<xsd:element name = "status" type = "statusType"/>
+	<xsd:element name = "structure" type = "structureType"/>
+	<xsd:element name = "taxon" type = "taxonType"/>
+	<xsd:element name = "taxonpath" type = "taxonpathType"/>
+	<xsd:element name = "technical" type = "technicalType"/>
+	<xsd:element name = "title" type = "titleType"/>
+	<xsd:element name = "type" type = "typeType"/>
+	<xsd:element name = "typicalagerange" type = "typicalagerangeType"/>
+	<xsd:element name = "typicallearningtime" type = "typicallearningtimeType"/>
+	<xsd:element name = "value" type = "valueType"/>
+	<xsd:element name = "person" type = "personType"/>
+	<xsd:element name = "vcard" type = "xsd:string"/>
+	<xsd:element name = "version" type = "versionType"/>
+	<xsd:element name = "installationremarks" type = "installationremarksType"/>
+	<xsd:element name = "otherplatformrequirements" type = "otherplatformrequirementsType"/>
+	<xsd:element name = "duration" type = "durationType"/>
+	<xsd:element name = "id" type = "idType"/>
+	
+	<!-- ******************* -->
+	
+	
+	<!-- ** Complex Types ** -->
+	
+	
+	<!-- ******************* -->
+	
+	<xsd:complexType name = "aggregationlevelType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "annotationType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "person" minOccurs = "0"/>
+			<xsd:element ref = "date" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "catalogentryType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "catalog"/>
+			<xsd:element ref = "entry"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "centityType">
+		<xsd:sequence>
+			<xsd:element ref = "vcard"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "classificationType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "purpose" minOccurs = "0"/>
+			<xsd:element ref = "taxonpath" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:element ref = "keyword" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "contextType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "contributeType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "role"/>
+			<xsd:element ref = "centity" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "date" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "copyrightandotherrestrictionsType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "costType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "coverageType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "dateType">
+		<xsd:sequence>
+			<xsd:element ref = "datetime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "descriptionType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "difficultyType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "durationType">
+		<xsd:sequence>
+			<xsd:element ref = "datetime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "educationalType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "interactivitytype" minOccurs = "0"/>
+			<xsd:element ref = "learningresourcetype" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "interactivitylevel" minOccurs = "0"/>
+			<xsd:element ref = "semanticdensity" minOccurs = "0"/>
+			<xsd:element ref = "intendedenduserrole" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "context" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "typicalagerange" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "difficulty" minOccurs = "0"/>
+			<xsd:element ref = "typicallearningtime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:element ref = "language" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "entryType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "generalType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "identifier" minOccurs = "0"/>
+			<xsd:element ref = "title" minOccurs = "0"/>
+			<xsd:element ref = "catalogentry" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "language" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "description" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "keyword" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "coverage" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "structure" minOccurs = "0"/>
+			<xsd:element ref = "aggregationlevel" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "installationremarksType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "intendedenduserroleType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "interactivitylevelType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "interactivitytypeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "keywordType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "kindType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "langstringType">
+		<xsd:simpleContent>
+			<xsd:extension base = "xsd:string">
+				<xsd:attribute ref = "xml:lang"/>
+			</xsd:extension>
+		</xsd:simpleContent>
+	</xsd:complexType>
+	<xsd:complexType name = "learningresourcetypeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "lifecycleType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "version" minOccurs = "0"/>
+			<xsd:element ref = "status" minOccurs = "0"/>
+			<xsd:element ref = "contribute" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "locationType">
+		<xsd:simpleContent>
+			<xsd:extension base = "xsd:string">
+				<xsd:attributeGroup ref = "attr.type"/>
+			</xsd:extension>
+		</xsd:simpleContent>
+	</xsd:complexType>
+	<xsd:complexType name = "lomType">
+		<xsd:sequence>
+			<xsd:element ref = "general" minOccurs = "0"/>
+			<xsd:element ref = "lifecycle" minOccurs = "0"/>
+			<xsd:element ref = "metametadata" minOccurs = "0"/>
+			<xsd:element ref = "technical" minOccurs = "0"/>
+			<xsd:element ref = "educational" minOccurs = "0"/>
+			<xsd:element ref = "rights" minOccurs = "0"/>
+			<xsd:element ref = "relation" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "annotation" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "classification" minOccurs = "0" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "metametadataType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "identifier" minOccurs = "0"/>
+			<xsd:element ref = "catalogentry" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "contribute" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "metadatascheme" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "language" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "nameType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "otherplatformrequirementsType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "personType">
+		<xsd:sequence>
+			<xsd:element ref = "vcard"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "purposeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "relationType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "kind" minOccurs = "0"/>
+			<xsd:element ref = "resource" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "requirementType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "type" minOccurs = "0"/>
+			<xsd:element ref = "name" minOccurs = "0"/>
+			<xsd:element ref = "minimumversion" minOccurs = "0"/>
+			<xsd:element ref = "maximumversion" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "resourceType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "identifier" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:element ref = "catalogentry" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "rightsType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "cost" minOccurs = "0"/>
+			<xsd:element ref = "copyrightandotherrestrictions" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "roleType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "semanticdensityType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "sourceType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "statusType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "stringType">
+		<xsd:simpleContent>
+			<xsd:extension base = "xsd:string">
+				<xsd:attribute ref = "xml:lang"/>
+			</xsd:extension>
+		</xsd:simpleContent>
+	</xsd:complexType>
+	<xsd:complexType name = "structureType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "taxonpathType">
+		<xsd:sequence>
+			<xsd:element ref = "source" minOccurs = "0"/>
+			<xsd:element ref = "taxon" minOccurs = "0" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "taxonType">
+		<xsd:sequence>
+			<xsd:element ref = "id" minOccurs = "0"/>
+			<xsd:element ref = "entry" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "technicalType" mixed = "true">
+		<xsd:sequence>
+			<xsd:element ref = "format" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "size" minOccurs = "0"/>
+			<xsd:element ref = "location" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "requirement" minOccurs = "0" maxOccurs = "unbounded"/>
+			<xsd:element ref = "installationremarks" minOccurs = "0"/>
+			<xsd:element ref = "otherplatformrequirements" minOccurs = "0"/>
+			<xsd:element ref = "duration" minOccurs = "0"/>
+			<xsd:group ref = "grp.any"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "titleType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "typeType">
+		<xsd:sequence>
+			<xsd:element ref = "source"/>
+			<xsd:element ref = "value"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "typicalagerangeType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "typicallearningtimeType">
+		<xsd:sequence>
+			<xsd:element ref = "datetime" minOccurs = "0"/>
+			<xsd:element ref = "description" minOccurs = "0"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "valueType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	<xsd:complexType name = "versionType">
+		<xsd:sequence>
+			<xsd:element ref = "langstring" maxOccurs = "unbounded"/>
+		</xsd:sequence>
+	</xsd:complexType>
+	
+	<!-- ****************** -->
+	
+	
+	<!-- ** Simple Types ** -->
+	
+	
+	<!-- ****************** -->
+	
+	<xsd:simpleType name = "formatType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "sizeType">
+		<xsd:restriction base = "xsd:int"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "datetimeType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "idType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "metadataschemeType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "catalogType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "minimumversionType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+	<xsd:simpleType name = "maximumversionType">
+		<xsd:restriction base = "xsd:string"/>
+	</xsd:simpleType>
+</xsd:schema>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS_exceptions.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS_exceptions.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/IMS_exceptions.py	(revision 712)
@@ -0,0 +1,4 @@
+
+
+class ManifestError(Exception):
+    pass
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/INSTALL.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/INSTALL.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/INSTALL.txt	(revision 712)
@@ -0,0 +1,29 @@
+=========================================
+IMSTransport 2.0.0-final Installation
+=========================================
+
+-------------------------
+Installation Instructions
+-------------------------
+
+Installation
+============
+
+This Product can be installed via either an Extension Profile or the QuickInstaller.
+
+Copy this product into the Products directory in your Zope instance. 
+
+Restart your Zope server.
+  
+To add this Product to an existing site:
+  * Click on the site setup link
+  * Click on Add/Remove Products
+  * Click on the IMSTransport check box, and then click  on the install button below.
+
+To add this Product to a new site:
+  * Navigate to the ZMI
+  * Use the drop down list to Add a new Plone Site
+  * Select the IMSTransport Extension Profile
+  * Click Add Plone Site
+
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/Manifest.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/Manifest.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/Manifest.py	(revision 712)
@@ -0,0 +1,600 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+from Acquisition import aq_inner, aq_parent
+from zope.interface import implements
+from zope.event import notify
+from interfaces import IIMSManifestWriter, IIMSManifestReader
+from ManifestEvents import SetNameSpaces, ObjectWriteMetadata, ObjectReadMetadata, \
+                           ObjectWriteOrganizations, ObjectReadOrganizations, \
+                           ObjectCreateObject, ObjectTransformPackage
+from IMS_exceptions import ManifestError
+from zipfile import ZipFile, ZIP_DEFLATED
+from cStringIO import StringIO
+from xml.dom import minidom
+from libxml2 import readFile, parseDoc
+from libxslt import parseStylesheetDoc
+from string import join
+import md5
+import os
+from App import config
+
+
+IMS_schema = 'IMS CONTENT'
+IMS_version = '1.2'
+
+
+class IMSManifestWriter(object):
+    """ Write an IMS content package manifest file. """
+
+    implements(IIMSManifestWriter)
+
+    namespaces = [('xmlns', 'http://www.imsglobal.org/xsd/imscp_v1p1'),
+                  ('xmlns:xsi', 'http://www.w3.org/2001/XMLSchema-instance'),]
+    schema_locations = ['http://www.imsglobal.org/xsd/imscp_v1p1 imscp_v1p2.xsd',]
+    schema_files = [(os.sep.join(['collective.imstransport','collective','imstransport','IMS']), 'imscp_v1p2.xsd')]
+
+
+    def __init__(self, context):
+        self.context = context
+        self.document = None
+        self.destination = None
+        self.ims_path = ''
+        self.manifest_node = None
+       
+        cfg = config.getConfiguration()
+        cfglist = cfg.instancehome.split(os.sep)[:-2]
+        cfglist += ['src']
+        self.ims_path = os.sep.join(cfglist)
+
+    def setWriterType(self, wtype):
+        """ The writer type field acts as a selector for write manifest events.
+            The Manifest writer will send this type when it fires an event.
+            Event handlers written for the event should first check this value
+            before executing any functionality. That way multiple event handlers
+            can be subscribed, but only one event handler will execute the
+            specified functionality. """
+        self.wtype = wtype
+
+
+    def setDestination(self, destination):
+        """ Set the output object for the writer. """
+        self.destination = destination
+
+        
+    def writeManifest(self):
+        """ Write the manifest. """
+
+        # Create an empyt XML document
+        self.document = minidom.Document()
+
+        # Create the Manifest node
+        manifestId = self._createPathId(self.context.virtual_url_path(), 'MAN')
+        manifestVer = self.context.ModificationDate()
+        self.manifest_node = self._createNode(self.document,
+                                              '',
+                                              'manifest',
+                                              attrs=[('identifier', manifestId),
+                                                     ('xmlns:version', manifestVer)])
+        self.addNamespace()
+        notify(SetNameSpaces(self.context, self))
+
+        # Create the top level Metadata node
+        metadata_node = self._createNode(self.manifest_node, '', 'metadata')
+        self._createNode(metadata_node, '', 'schema', IMS_schema)
+        self._createNode(metadata_node, '', 'schemaversion', IMS_version)
+
+        # Create the Organizations node
+        defaultId = self._createPathId(self.context.virtual_url_path(), 'ORG')
+        organizations_node = self._createNode(self.manifest_node,
+                                              '',
+                                              'organizations',
+                                              attrs=[('default', defaultId)])
+
+        # Send a write organizations event, so that anyone can do what they want here
+        notify(ObjectWriteOrganizations(self.context, organizations_node, self))
+        
+        resources_node = self._createNode(self.manifest_node, '', 'resources')
+
+        allObjects = self._getAllObjects()
+        
+        for obj in allObjects:
+            # Handle the case where an object might be folderish, but
+            # also has a text attribute.
+            if not obj.isPrincipiaFolderish or hasattr(obj.aq_explicit,'getText'):
+                path = self._getObjectPath(obj)
+                self._writeResource(obj, resources_node, path)
+                self._writeObjectData(obj, path)
+
+        self._writeObjectData(self.getManifest(), 'imsmanifest.xml')
+
+        for x in self.schema_files:
+            path = x[0].replace('.', os.sep)
+            fn = os.path.join(self.ims_path, x[0], x[1])
+            f = open(fn, 'rb')
+            schema = f.read()
+            f.close()
+            self._writeObjectData(schema, x[1])
+
+        if self.destination:
+            return self.destination.getOutput()
+        else:
+            return None, None
+
+        
+    def _writeObjectData(self, obj, path):
+        """ Write file data to the destination object. """
+        if type(obj) == type(''):
+            data = obj        
+        else:
+            format = ''
+            if hasattr(obj.aq_explicit, 'Format'):
+                format = obj.Format()
+            if 'Link' == obj.Type():
+                doc = minidom.Document()
+                anchor_node = self._createNode(doc, '', 'a', obj.Title())
+                anchor_node.setAttribute('href', obj.getRemoteUrl())
+                data = doc.toxml(encoding='utf-8')
+            elif obj.Type() in ['File', 'Image']:
+                if hasattr(obj.aq_explicit, 'data'):
+                    data = obj.data
+            elif 'text/html' == format:
+                if hasattr(obj.aq_explicit, 'getText'):
+                    data = obj.getText()
+            elif format in ['text/plain', 'text/x-rst', 'text/structured']:
+                if hasattr(obj.aq_explicit, 'getRawText'):
+                    data = obj.getRawText()
+            else:
+                data = ''
+        if self.destination:
+            self.destination.writeFile(path, data)
+
+    def _getAllObjects(self):
+        """ Get all sub objects. """
+        return [obj.getObject() for obj in self.context.portal_catalog.searchResults(path={'query':('/'.join(self.context.getPhysicalPath())+'/'),})]
+
+    
+    def _getObjectPath(self, obj):
+        """ Get the path of an object. """
+
+        path = obj.virtual_url_path().replace(self.context.aq_inner.aq_parent.virtual_url_path(), '')[1:]
+
+        # If object has type text/html, and is also folderish, change the path
+        # so that both a folder and an html file can be created.
+        if hasattr(obj.aq_explicit, 'Format'):
+            if 'text/html' == obj.Format() and obj.isPrincipiaFolderish:
+                path += '.html'
+
+        return path
+        
+    def _writeResource(self, obj, node, path):
+        """ Write out a resource object """
+
+        resourceId = self._createPathId(obj.virtual_url_path(), 'RES')
+        resource_node = self._createNode(node,
+                                         '',
+                                         'resource',
+                                         attrs=[('type', 'webcontent'),
+                                                ('href', obj.renderBase()),
+                                                ('identifier', resourceId)])
+        
+        metadata_node = self._createNode(resource_node, '', 'metadata')
+        
+        # Send a write metadata event, in case anyone wants to include custom metadata
+        notify(ObjectWriteMetadata(aq_inner(obj), metadata_node, self))
+        
+        file_node = self._createNode(resource_node, '', 'file', attrs=[('href', path)])
+
+        
+    def _createPathId(self, path, pre='RES'):
+        """ Create a unique id given a path """
+        return pre + str(md5.md5(path).hexdigest())
+
+
+    def getManifest(self):
+        """ Get the manifest expressed in XML. """
+        return self.document.toprettyxml(encoding='utf-8')
+
+
+    def _createNode(self, parent, nspace, ename, value=None, attrs=None):
+        """ Create a node in the document. """
+        newnode = self.document.createElementNS(nspace, ename)
+        parent.appendChild(newnode)
+        if value and value != '':
+            if not isinstance(value, unicode):
+                newnode.appendChild(self.document.createTextNode(value.decode('utf-8')))
+            else:
+                newnode.appendChild(self.document.createTextNode(value))                
+        if attrs:
+            for x in attrs:
+                newnode.setAttribute(x[0], x[1])
+        return newnode
+
+
+    def addNamespace(self, namespace=None, location=None, file=None):
+        """ Add a namespace to the manifest. """
+        if namespace:
+            self.namespaces.append(namespace)
+        if location and location not in self.schema_locations:
+            self.schema_locations.append(location)
+        if file and file not in self.schema_files:
+            self.schema_files.append(file)
+        for ns in self.namespaces:
+            self.manifest_node.setAttribute(ns[0], ns[1])
+        self.manifest_node.setAttribute('xsi:schemaLocation', join(self.schema_locations, ' '))
+
+
+class FileWriter:
+    """ Write files out to the file system """
+    
+    def __init__(self, package_name):
+        self.fullpath = os.tempnam('var', 'OBJ')
+        self.fullpath = os.path.join(self.fullpath, package_name)
+        self._mkdirs(self.fullpath.split(os.sep))
+
+
+    def _mkdirs(self, path):
+        """ Make directory structure. """
+        curdir = os.getcwd()
+        if not len(path):
+            return
+        elif not os.path.exists(path[0]):
+            os.mkdir(path[0])
+        os.chdir(path[0])
+        self._mkdirs(path[1:])
+        os.chdir(curdir)
+
+    
+    def writeObject(self, obj, path):
+        ''' Writes content object to the file system '''
+        fullpath = self.fullpath
+        for x in path.split('/'):
+            fullpath = os.path.join(fullpath, x)
+        self._mkdirs(fullpath.split(os.sep)[:-1])
+
+        if hasattr(obj.aq_explicit, 'getText'):
+            file = open(fullpath + '.html', 'w')
+            file.write(obj.getText())
+            file.close
+            
+        elif hasattr(obj.aq_explicit, 'data'):
+            file = open(fullpath,'w')
+            file.write(obj.data)
+            file.close()
+
+        
+    def writeManifest(self, manifest):
+        fullpath = os.path.join(self.fullpath, 'imsmanifest.xml')
+        f = open(fullpath, 'wb')
+        f.write(manifest)
+        f.close()
+
+
+class ZipfileWriter:
+    """ Write a zip file which contains all the IMS Content packaging stuff. """
+
+    def __init__(self, archive_name, package_name):
+        self.fullpath = '%s/' %package_name
+        self.archive_name = archive_name
+        self.package_name = package_name
+        self.archive = StringIO()
+        self.zipfile = ZipFile(self.archive, 'w', ZIP_DEFLATED)
+
+
+    def writeFile(self, path, data):
+        """ Write a file to the zip archive. """
+        fpath = '%s%s' %(self.fullpath, path)
+        self.zipfile.writestr(fpath, data)
+
+
+    def getOutput(self):
+        """ Close the zip file and get the binary archive. """
+        self.zipfile.close()
+        self.archive.seek(0)
+        return self.archive.read(), self.archive_name
+        
+
+class IMSManifestReader(object):
+    """ Read an IMS content package manifest file. """
+
+    implements(IIMSManifestReader)
+
+
+    def __init__(self, context):
+        """
+        """
+        self.context = context
+        self.rtype = None
+        self.source = None
+        self.requiredMetadataSections = []
+
+        for path in os.environ['PYTHONPATH'].split(':'):
+            if 'collective.imstransport' in path:
+                self.ims_path = path
+                break
+        else:
+            self.ims_path = ''
+
+
+
+    def setReaderType(self, rtype):
+        """ The reader type field acts as a selector for read manifest events.
+            The manifest reader will send this type when it fires an event.
+            Event handlers written for the event should first check this value
+            before executing any functionality. That way multiple event handlers
+            can be subscribed, but only one event handler will execute the
+            specified functionality. """
+        self.rtype = rtype
+
+
+    def setSource(self, source):
+        """ Set the source of the file data. """
+        self.source = source
+
+
+    def setRequiredMetadataSections(self, sections):
+        """ Set which metadata sections should be required, so that
+            an error can be thrown if a section is missing. """
+        if type(sections) == type([]):
+            for x in sections:
+                self.requiredMetadataSections.append(x)
+        else:
+            self.requiredMetadataSections = [sections]
+
+
+    def readManifest(self, package_type=None):
+        """ Read the manifest """
+
+        if self.source:
+            manifest = self.source.readManifest()
+            if not manifest:
+                return False, \
+                       'Manifest', \
+                       'Could not locate manifest file "imsmanifest.xml" in the zip archive.'
+            
+            xformdata = {} 
+            if package_type:
+                notify(ObjectTransformPackage(self, manifest, package_type, xformdata))
+
+            if xformdata.has_key('manifest'):
+                manifest = xformdata['manifest']
+            if xformdata.has_key('filedata'):
+                filedata = xformdata['filedata']
+            else:
+                filedata = {}
+            
+            self.document = minidom.parseString(manifest)
+
+            try: 
+                org = self.readOrganizations()
+                resources = self.readResources(org)
+            except ManifestError, e:
+                return False, 'Manifest', e
+            else:
+                for res in resources:
+                    for f in res[0]:
+                        data = None
+                        if self.source:
+                            # If we already have data for the file, use it instead
+                            if filedata.has_key(f):
+                                data = filedata[f]
+                            else:
+                                data = self.source.readFile(f)
+                        if data:
+                            notify(ObjectCreateObject(self.context, self.rtype, str(f), data, res[1]))
+            return True, ''
+        else:
+            return False, 'Internal error. No source object specified.'
+
+                
+    def readOrganizations(self):
+        """ Read the organizations section of the manifest. """
+        org = {}
+        organizations = self.document.getElementsByTagName('organizations')
+        if organizations:
+            notify(ObjectReadOrganizations(self.context, organizations[0], self, org))
+        else:
+            raise ManifestError, 'Manifest file has no "organizations" section.'
+        return org
+
+
+    def readResources(self, org):
+        """ Read all resources. """
+        allResources = []
+        resources = self.document.getElementsByTagName('resources')
+        if resources:
+            for res in resources[0].getElementsByTagName('resource'):
+                metadata = {}
+                # Check to see if navigations options should be set
+                id = res.getAttribute('identifier')
+                if id:
+                    if org.has_key(id):
+                        metadata['excludeFromNav'] = False
+                        metadata['navPosition'] = org[id]
+    
+                    else:
+                        metadata['excludeFromNav'] = True
+                # Get metadata for objects
+                files = []
+                file_nodes = res.getElementsByTagName('file')
+                for f in file_nodes:
+                    fn = f.getAttribute('href')  
+                    if fn: 
+                        files.append(fn) 
+                if not files:
+                    raise ManifestError, 'Missing "file" tag in resource %s.' %id
+
+                # Create the objects
+                self.readMetadata(res, metadata, id)
+                allResources.append((files, metadata))
+
+        return allResources
+
+
+    def readMetadata(self, node, metadata, resid):
+        """ Get the metadata, and set it on an object """
+        metadata_node = node.getElementsByTagName('metadata')
+        if metadata_node:
+            mdSections = []
+            for md in metadata_node[0].childNodes:
+                if md.nodeType == md.ELEMENT_NODE:
+                    notify(ObjectReadMetadata(self.context, metadata, md, self, mdSections, resid))
+            for x in self.requiredMetadataSections:
+                if x not in mdSections:
+                    raise ManifestError, \
+                          'Missing required metadata section "%s" for resource "%s".' %(x, resid)
+        else:
+            raise ManifestError, 'Missing required "metadata" section in resource "%s".' %resid
+        return metadata
+
+
+    def getTextValue(self, node):
+        """ Removes the text from the text_node of a node """
+        for x in node.childNodes:
+            if x.nodeType == x.TEXT_NODE:
+                return x.nodeValue.strip()
+        return None
+                                
+    
+    def getVcardValues(self, node, resid):
+        """
+        Looks for the full name and email values in a VCARD
+        value.
+
+        Added some whitespace stripping, and case
+        insensitive tag searching, so that we could parse the
+        default IMS example package.
+    
+        """
+        text = self.getTextValue(node)
+        textlines = text.strip().split('\n')
+                
+        value = self._getVcardValue('BEGIN', [textlines[0]])
+        if 'VCARD' != value.strip().upper():
+            raise ManifestError, 'Missing VCARD BEGIN tag for resource "%s"' %resid
+
+        value = self._getVcardValue('END', [textlines[-1]])
+        if 'VCARD' != value.strip().upper():
+            raise ManifestError, 'Missing VCARD END tag for resource "%s"' %resid
+            
+        name = self._getVcardValue('FN', textlines)
+        email = self._getVcardValue('EMAIL;INTERNET', textlines)
+
+        return name, email
+
+        
+    def _getVcardValue(self, field, text):
+        """ Try to get a value for a VCARD field. """
+        for textline in text:
+            # If the line is not folded
+            #if textline[0] != ' ':
+                # Look for the Colon delimiter
+            textline = textline.strip()
+            if textline.find(':'):
+                tag = textline.split(':')
+                if field == tag[0].upper().strip():
+                    return tag[1].strip()
+        else:
+            return ''
+                
+
+    def _importFile(self, file_node):
+        ''' Get the file '''
+        pass
+
+
+    def performTransform(self, manifest, package_type):
+        """ Transform the manifest if necessary. """
+
+        if package_type:
+            xform = os.path.join(self.ims_path, 'collective', 'imstransport', 'IMS', package_type[1])
+            doc = parseDoc(manifest)
+            styledoc = readFile(xform, None, 0)
+            style = parseStylesheetDoc(styledoc)
+            mn = ''
+            result = style.applyStylesheet(doc, None)
+            if result and result.get_content():
+                mn = style.saveResultToString(result)
+            style.freeStylesheet()
+            doc.freeDoc()
+            result.freeDoc()
+        return mn
+
+
+class FileReader:
+    """ Read files from the var directory. """
+
+    def __init__(self, package_path):
+        self.fullpath = package_path
+
+
+    def readManifest(self):
+        """ Get the manifest file if it exists. """
+        manifest_path = os.path.join(self.fullpath, 'imsmanifest.xml')
+        file = open(manifest_path, 'rb')
+        manifest = file.read()
+        file.close()
+        return manifest
+
+    def readFile(self, path):
+        """ Get file data from the zip file. """
+        fullpath = self.fullpath
+        for x in path.split('/'):
+            fullpath = os.path.join(fullpath, x)
+        file = open(fullpath, 'rb')
+        data = file.read()
+        file.close()
+        return data
+
+
+class ZipfileReader:
+    """ Reads files from an imported zip file. """
+
+    def __init__(self, files):
+        self.files = ZipFile(files)
+        self.fullpath = ''
+
+
+    def readManifest(self):
+        """ Get the maifest file if it exists. """
+        for x in self.files.namelist():
+            index = x.find('imsmanifest.xml')
+            if index != -1:
+                self.fullpath = x[:index]
+                return self.files.read(x)
+        return None
+    
+
+    def readFile(self, path):
+        """ Get file data from the zip file. """
+        fn = '%s%s' %(self.fullpath, str(path))
+        if fn not in self.files.namelist():
+            fn = fn.replace('/', '\\')
+            if fn not in self.files.namelist():
+                return None
+        return self.files.read(fn)
+
+    def listFiles(self):
+        """ List files in the package. """
+        return self.files.namelist()
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/ManifestEvents.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/ManifestEvents.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/ManifestEvents.py	(revision 712)
@@ -0,0 +1,131 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+
+from zope.component.interfaces import ObjectEvent
+from zope.interface import implements
+from interfaces import ISetNameSpaces, IObjectWriteMetadata, IObjectReadMetadata, \
+                       IObjectWriteOrganizations, IObjectReadOrganizations, \
+                       IObjectWriteContributeNode, IObjectReadContributeNode, \
+                       IObjectCreateObject, IObjectTransformPackage
+
+
+class SetNameSpaces(ObjectEvent):
+    """ Set namespace information in manifest. """
+    implements(ISetNameSpaces)
+
+    def __init__(self, object, writer):
+        super(SetNameSpaces, self).__init__(object)
+        self.writer = writer
+
+class ObjectWriteMetadata(ObjectEvent):
+    """ Write metadata to content package. """
+    implements(IObjectWriteMetadata)
+
+    def __init__(self, object, node, writer):
+        super(ObjectWriteMetadata, self).__init__(object)
+        self.node = node
+        self.writer = writer
+
+        
+class ObjectReadMetadata(ObjectEvent):
+    """ Read metadata from content package. """
+    implements(IObjectReadMetadata)
+
+    def __init__(self, object, metadata, node, reader, mdSections, resid):
+        super(ObjectReadMetadata, self).__init__(object)
+        self.metadata = metadata
+        self.node = node
+        self.reader = reader
+        self.mdSections = mdSections
+        self.resid = resid
+
+        
+class ObjectWriteOrganizations(ObjectEvent):
+    """ Write Organizations entries. """
+    implements (IObjectWriteOrganizations)
+    
+    def __init__(self, object, node, writer):
+        super(ObjectWriteOrganizations, self).__init__(object)
+        self.node = node
+        self.writer = writer
+
+        
+class ObjectReadOrganizations(ObjectEvent):
+    """ Read Organization entries. """
+    implements (IObjectReadOrganizations)
+    
+    def __init__(self, object, node, reader, org):
+        super(ObjectReadOrganizations, self).__init__(object)
+        self.node = node
+        self.reader = reader
+        self.org = org
+
+        
+class ObjectWriteContributeNode(ObjectEvent):
+    """ Write a contribute entry. """
+    implements(IObjectWriteContributeNode)
+
+    def __init__(self, object, node, writer, mwriter):
+        super(ObjectWriteContributeNode, self).__init__(object)
+        self.node = node
+        self.writer = writer
+        self.mwriter = mwriter
+
+
+class ObjectReadContributeNode(ObjectEvent):
+    """ Read a contribute entry. """
+    implements(IObjectReadContributeNode)
+
+    def __init__(self, object, metadata, source, value, vlist, date):
+        super(ObjectReadContributeNode, self).__init__(object)
+        self.metadata = metadata
+        self.source = source
+        self.value = value
+        self.vlist = vlist
+        self.date = date
+
+
+class ObjectCreateObject(ObjectEvent):
+    """ Creates an object from manifest data. """
+    implements(IObjectCreateObject)
+
+    def __init__(self, object, rtype, resource, data, metadata):
+        super(ObjectCreateObject, self).__init__(object)
+        self.rtype = rtype
+        self.resource = resource
+        self.data = data
+        self.metadata = metadata
+        
+
+class ObjectTransformPackage(ObjectEvent):
+    """ Transform an IMS package to a format we can consume. """
+    implements(IObjectTransformPackage)
+
+    def __init__(self, context, manifest, package_type, xformdata):
+        super(ObjectTransformPackage, self).__init__(object)
+        self.context = context
+        self.manifest = manifest
+        self.package_type = package_type
+        self.xformdata = xformdata
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/ManifestHandlers.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/ManifestHandlers.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/ManifestHandlers.py	(revision 712)
@@ -0,0 +1,652 @@
+#################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+
+
+from zope.event import notify
+from Products.CMFCore.utils import UniqueObject, getToolByName
+from ManifestEvents import ObjectWriteContributeNode, ObjectReadContributeNode, \
+                           ObjectTransformPackage
+from IMS_exceptions import ManifestError
+import string
+from mimetypes import guess_type
+import re
+from xml.dom import minidom
+import os
+
+
+RE_BODY = re.compile('<body[^>]*?>(.*)</body>', re.DOTALL )
+LOM_version = 'LOMv1.0'
+LOM_namespace = 'http://www.imsglobal.org/xsd/imsmd_v1p2'
+
+def setNameSpaces(event):
+    """ Set name spaces for manifest file. """
+    event.writer.addNamespace(('xmlns:imsmd', LOM_namespace),
+                              'http://www.imsglobal.org/xsd/imsmd_v1p2 imsmd_v1p2p4.xsd',
+                              (os.sep.join(['collective.imstransport','collective','imstransport','IMS']), 'imsmd_v1p2p4.xsd'))
+
+class WriteLOMMetadata:
+    """ Handle a write LOM metadata event, and write the metadata for an object. """
+
+    def __call__(self, event):
+        """ Catch the write metadata event. """
+        self.writeMetadata(event.object, event.node, event.writer)
+
+
+    def writeMetadata(self, object, node, writer):
+        """ Write out the metadata. """
+
+        rights_holder = object.portal_properties.site_properties.getProperty('rights_holder')
+        rights_holder_email = object.portal_properties.site_properties.getProperty('rights_holduer_email')
+        language = self.getLanguage(object)
+        
+        # LOM Node
+        lom_node = writer._createNode(node,
+                                      LOM_namespace,
+                                      'lom',
+                                      attrs=[('xmlns', LOM_namespace)])
+
+        # General Node
+        general_node = writer._createNode(lom_node, LOM_namespace, 'general')
+        writer._createNode(general_node, LOM_namespace, 'identifier', object.getId())
+        title_node = writer._createNode(general_node, LOM_namespace, 'title')
+        writer._createNode(title_node,
+                           LOM_namespace,
+                           'langstring',
+                           object.Title(),
+                           [('xml:lang', language)])
+        if language:
+            writer._createNode(general_node, LOM_namespace, 'language', language)
+        description = object.Description()
+        if description:
+            desc_node = writer._createNode(general_node, LOM_namespace, 'description')
+            writer._createNode(desc_node,
+                               LOM_namespace,
+                               'langstring',
+                               description,
+                               [('xml:lang', language)])
+        keywords = object.Subject()
+        if keywords:
+            keyword_node = writer._createNode(general_node, LOM_namespace, 'keyword')
+            for kw in keywords:
+                writer._createNode(keyword_node,
+                                   LOM_namespace,
+                                   'langstring',
+                                   kw,
+                                   [('xml:lang', language)])
+
+        # Lifecycle Node
+        lifecycle_node = writer._createNode(lom_node, LOM_namespace, 'lifecycle')
+        notify(ObjectWriteContributeNode(object, lifecycle_node, writer, self))
+                                     
+        # Meta-Metadata Node
+        metametadata_node = writer._createNode(lom_node, LOM_namespace, 'metametadata')
+        catalog_node = writer._createNode(metametadata_node, LOM_namespace, 'catalogentry')
+        writer._createNode(catalog_node,
+                           LOM_namespace,
+                           'catalog',
+                           '%s,%s' %(object.portal_url(),
+                                     object.portal_url.getPortalObject().getProperty('email_from_address')))
+        entry_node = writer._createNode(catalog_node, LOM_namespace, 'entry')
+        writer._createNode(entry_node,
+                           LOM_namespace,
+                           'langstring',
+                           object.id,
+                           [('xml:lang', 'x-none')])
+        contributors = object.Contributors()
+        if contributors:
+            self.createContributeElement(writer,
+                                         LOM_namespace,
+                                         metametadata_node,
+                                         LOM_version,
+                                         'creator',
+                                         contributors,
+                                         object.ModificationDate())        
+        writer._createNode(metametadata_node, LOM_namespace, 'metadatascheme', LOM_version)
+        if language:
+            writer._createNode(metametadata_node, LOM_namespace, 'language', language)
+
+        # Technical Node
+        technical_node = writer._createNode(lom_node, LOM_namespace, 'technical')
+        writer._createNode(technical_node, LOM_namespace, 'format', object.Format())
+        writer._createNode(technical_node, LOM_namespace, 'size', self.getObjSize(object))
+        writer._createNode(technical_node, LOM_namespace, 'location', object.renderBase())
+
+        # Rights Node
+        rights_node = writer._createNode(lom_node, LOM_namespace, 'rights')
+        copyright_other_node = writer._createNode(rights_node,
+                                                  LOM_namespace,
+                                                  'copyrightandotherrestrictions')
+        source_node = writer._createNode(copyright_other_node, LOM_namespace, 'source')           
+        writer._createNode(source_node,
+                           LOM_namespace,
+                           'langstring',
+                           LOM_version,
+                           [('xml:lang', 'x-none')])
+        value_node = writer._createNode(copyright_other_node, LOM_namespace, 'value')
+        writer._createNode(value_node,
+                           LOM_namespace,
+                           'langstring',
+                           'yes',
+                           [('xml:lang', 'x-none')])
+        description_node = writer._createNode(rights_node, LOM_namespace, 'description')
+        writer._createNode(description_node,
+                           LOM_namespace,
+                           'langstring',
+                           self.getCopyrightString(object.Rights(), rights_holder, rights_holder_email),
+                           [('xml:lang', 'x-none')])
+
+    def createContributeElement(self, writer, nspace, lc_node, source, value, entities, date, email=None):
+        """
+           Create a LOM contribute node in the form
+
+               <imsmd:contribute>
+                   <imsmd:role>
+                       <imsmd:source>
+                           <imsmd:langstring xml:lang="x-none">
+                               LOMv1.0
+                           </imsmd:langstring>
+                       </imsmd:source>
+                       <imsmd:value>
+                           <imsmd:langstring xml:lang="x-none">
+                               author
+                           </imsmd:langstring>
+                       </imsmd:value>    
+                   </imsmd:role>
+                   <imsmd:centity>
+                       <imsmd:vcard>
+                           BEGIN:
+                               NAME: Me
+                           END:
+                       </imsmd:vcard>
+                   </imsmd:centity>
+                   <imsmd:date>
+                       <imsmd:datetime>
+                           2006-01-01
+                       </imsmd:datetime>
+                   </imsmd:date>
+               </imsmd:contribute>
+        """
+        contribute_node = writer._createNode(lc_node, nspace, 'contribute')
+        role_node = writer._createNode(contribute_node, nspace, 'role')
+        source_node = writer._createNode(role_node, nspace, 'source')
+        writer._createNode(source_node,
+                           nspace,
+                           'langstring',
+                           source,
+                           [('xml:lang', 'x-none')])
+        value_node = writer._createNode(role_node, nspace, 'value')
+        writer._createNode(value_node,
+                           nspace,
+                           'langstring',
+                           value,
+                           [('xml:lang', 'x-none')])
+        if entities:
+            if type(entities) not in [type([]), type(())]:
+                entities = [entities]
+            for e in entities:
+                centity_node = writer._createNode(contribute_node, nspace, 'centity')
+                writer._createNode(centity_node,
+                                   nspace,
+                                   'vcard',
+                                   self.createVCard(e, email))
+        if date:
+            date_node = writer._createNode(contribute_node, nspace, 'date')
+            writer._createNode(date_node, nspace, 'datetime', date)
+
+    def createVCard(self, name, email=None):
+         """
+         Writes out a VCard entry for a contribute element
+
+         Note: Should replace this with the python vcard library.
+
+         """
+         vCard = 'BEGIN:VCARD\n'
+         vCard += 'FN:'+name+'\n'
+         if email:
+             vCard += 'EMAIL;INTERNET:'+email+'\n'
+         vCard += 'END:VCARD'
+         return vCard
+
+    def getObjSize(self, object):
+        """ Retrieves the correct size of the object"""
+        return '%d' %object.get_size()
+
+    def getLanguage(self, object):
+        """ Get Language setting """
+        lang = object.Language()
+        if not lang:
+            lang = object.portal_properties.site_properties.getProperty('default_language')
+        return lang
+
+    def getCopyrightString(self, copyright, rights_holder, rights_holder_email):
+        cp = ''
+        if copyright:
+            cp += copyright
+        if rights_holder:
+            if cp:
+                cp += ', '
+            cp += rights_holder
+        if rights_holder_email:
+            if cp:
+                cp += ', '
+            cp += rights_holder_email
+        return cp
+            
+         
+WriteLOMMetadataHandler = WriteLOMMetadata()
+
+
+class WriteOrganizations:
+    """ Handle a write organizations event, and write the organization information."""
+    
+    def __call__(self, event):
+        """ Catch the write metadata event. """
+        self._writeOrganizations(event.object, event.node, event.writer)
+        
+    def _writeOrganizations(self, object, node, writer):
+        """ Write items that should appear in the navigation within the organizations section """
+        pass
+
+
+        
+WriteOrganizationsHandler = WriteOrganizations()
+
+
+class ReadOrganizations:
+    """ Handle a read organizations event, and read the organization information."""
+    
+    def __call__(self, event):
+        """ Catch the read metadata event. """
+        self._readOrganizations(event.object, event.org, event.node, event.reader)
+
+    def _readOrganizations(self, object, org, node, reader):
+        """ Handle read organizations event. """
+        default = node.getAttribute('default')
+        organization_nodes = 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')
+                    org[idref] = itemnum
+                    itemnum += 1
+
+
+ReadOrganizationsHandler = ReadOrganizations()
+
+
+class ReadLOMMetadata:
+    """ Handle a read LOM metadata event, and read the metadata for an object. """
+
+    def __call__(self, event):
+        self.readMetadata(event.object,
+                          event.metadata,
+                          event.node,
+                          event.reader,
+                          event.mdSections,
+                          event.resid)
+
+    def readMetadata(self, object, metadata, node, reader, mdSections, resid):
+        """ Create an object and set the metadata on it. """
+
+        mdSections.append(LOM_version)
+
+        if node.nodeName in ['lom', 'imsmd:lom']:
+
+            gen_nodes = node.getElementsByTagNameNS(LOM_namespace, 'general')
+            if gen_nodes:
+                self.readGeneral(object, metadata, gen_nodes[0], reader, resid)
+            else:
+                raise ManifestError, 'No "general" tag found in metadata section for resource %s.' %resid
+
+            lifecycle_nodes = node.getElementsByTagNameNS(LOM_namespace, 'lifecycle')
+            if lifecycle_nodes:
+                self.readLifecycle(object, metadata, lifecycle_nodes[0], reader, resid)
+
+            metametadata_nodes = node.getElementsByTagNameNS(LOM_namespace, 'metametadata')
+            if metametadata_nodes:
+                self.readMetametadata(object, metadata, metametadata_nodes[0], reader)
+
+            technical_nodes = node.getElementsByTagNameNS(LOM_namespace, 'technical')
+            if technical_nodes:
+                self.readTechnical(object, metadata, technical_nodes[0], reader, resid)
+
+            rights_nodes = node.getElementsByTagNameNS(LOM_namespace, 'rights')
+            if rights_nodes:
+                self.readRights(object, metadata, rights_nodes[0], reader)
+
+
+    def readGeneral(self, object, metadata, node, reader, resid):
+        """ Read general node """
+
+        title_nodes = node.getElementsByTagNameNS(LOM_namespace, 'title')        
+        if title_nodes:
+            langstring_nodes = title_nodes[0].getElementsByTagNameNS(LOM_namespace,
+                                                                     'langstring')
+            if langstring_nodes:
+                title = reader.getTextValue(langstring_nodes[0])
+                if title:
+                    metadata['title'] = title
+        
+        if not metadata.has_key('title'):
+            raise ManifestError, 'Required tag "title" missing in lom/general metadata section for resource %s.' %resid
+
+        language_nodes = node.getElementsByTagNameNS(LOM_namespace, 'language')
+        if language_nodes:
+            lang = reader.getTextValue(language_nodes[0])
+            if lang:
+                metadata['language'] = lang
+
+        desc_nodes = node.getElementsByTagNameNS(LOM_namespace, 'description')
+        if desc_nodes:
+            langstring_nodes = desc_nodes[0].getElementsByTagNameNS(LOM_namespace,
+                                                                    'langstring')
+            if langstring_nodes:
+                description = reader.getTextValue(langstring_nodes[0])
+                if description:
+                    metadata['description'] = description
+
+        kw_nodes = node.getElementsByTagNameNS(LOM_namespace, 'keyword')
+        if kw_nodes:
+            kw_lang_nodes = kw_nodes[0].getElementsByTagNameNS(LOM_namespace,'langstring')
+            if kw_lang_nodes:
+                kw_list = []
+                for lang_node in kw_lang_nodes:
+                    kw = reader.getTextValue(lang_node)
+                    if kw:
+                        kw_list.append(kw)
+            if kw_list:
+                metadata['subject'] = kw_list
+
+
+    def readLifecycle(self, object, metadata, node, reader, resid):
+        """ Read Lifecycle node """
+        # Lifecycle Node
+        contribute_nodes = node.getElementsByTagNameNS(LOM_namespace, 'contribute')
+        
+        # For each contribute node there is a role node, a centity node, and possibly a date node
+        for contribute_node in contribute_nodes:
+            source = ''
+            value = ''
+            vlist = []
+            date = ''
+            
+            role_nodes = contribute_node.getElementsByTagNameNS(LOM_namespace, 'role')
+            if role_nodes:
+                source_nodes = role_nodes[0].getElementsByTagNameNS(LOM_namespace, 'source')
+                if source_nodes:
+                    langstring_nodes = source_nodes[0].getElementsByTagNameNS(LOM_namespace, 'langstring')
+                    if langstring_nodes:
+                        source = reader.getTextValue(langstring_nodes[0])
+                value_nodes = role_nodes[0].getElementsByTagNameNS(LOM_namespace, 'value')
+                if value_nodes:
+                    langstring_nodes = value_nodes[0].getElementsByTagNameNS(LOM_namespace, 'langstring')
+                    if langstring_nodes:
+                        value = reader.getTextValue(langstring_nodes[0])
+
+            centity_nodes = contribute_node.getElementsByTagNameNS(LOM_namespace, 'centity')
+            for centity_node in centity_nodes:
+                for cnode in centity_node.childNodes:
+                    if cnode.nodeType == cnode.ELEMENT_NODE:
+                        name, email = reader.getVcardValues(cnode, resid)
+                        if value:
+                            vlist.append((name, email))
+                
+            date_nodes = contribute_node.getElementsByTagNameNS(LOM_namespace, 'date')
+            if date_nodes:
+                datetime_nodes = date_nodes[0].getElementsByTagNameNS(LOM_namespace, 'datetime')
+                if datetime_nodes:
+                    datetime = reader.getTextValue(datetime_nodes[0])
+
+            notify(ObjectReadContributeNode(object, metadata, source, value, vlist, date))
+            
+
+    def readMetametadata(self, object, metadata, node, reader):
+        """ Read Meta-metadata node """
+        pass
+
+    def readTechnical(self, object, metadata, node, reader, resid):
+        """ Read Technical node """
+        format_nodes = node.getElementsByTagNameNS(LOM_namespace, 'format')
+        if format_nodes:
+            format = reader.getTextValue(format_nodes[0])
+            if format:
+                metadata['Format'] = format
+        #if not metadata.has_key('Format'):
+        #    raise ManifestError, \
+        #          'Required tag "format" missing in lom/technical metadata section for resource %s.' %resid
+        
+    def readRights(self, object, metadata, node, reader):
+        """ Read Rights node """
+        
+        description_nodes = node.getElementsByTagNameNS(LOM_namespace,'description')
+        if description_nodes:
+            langstring_nodes = description_nodes[0].getElementsByTagNameNS(LOM_namespace,'langstring')
+            if langstring_nodes:
+                description = reader.getTextValue(langstring_nodes[0])
+                if description:
+                    metadata['rights'] = description
+
+
+        
+ReadLOMMetadataHandler = ReadLOMMetadata()
+
+
+def writeContributeNode(event):
+    """ Write a LOM contribute node. """
+    creators = event.object.Creators()
+    if creators:
+        event.mwriter.createContributeElement(event.writer,
+                                              LOM_namespace,
+                                              event.node,
+                                              LOM_version,
+                                              'author',
+                                              creators,
+                                              event.object.ModificationDate())
+    contributors = event.object.Contributors()
+    if contributors:
+        event.mwriter.createContributeElement(event.writer,
+                                              LOM_namespace,
+                                              event.node,
+                                              LOM_version,
+                                              'unknown',
+                                              contributors,
+                                              event.object.ModificationDate())
+    
+
+
+def readContributeNode(event):
+    """ Read a LOM contribute Node. """
+
+    if LOM_version == event.source:
+
+        # Creator
+        if 'author' == event.value.lower() and event.vlist:
+            event.metadata['creators'] = [x[0] for x in event.vlist]
+            if event.date:
+                event.metadata['creation_date'] = event.date
+
+        # Contributors
+        if 'unknown' == event.value.lower() and event.vlist:
+            event.metadata['contributors'] = [x[0] for x in event.vlist]
+
+
+
+class createObjects:
+    """ Create new objects. """
+
+    def __init__(self):
+        pass
+
+    def __call__(self, event):
+        if 'IMSTransport' == 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
+        objtype = self.getObjectType(filepath, metadata)
+        parent = self.createFolders(filepath, objtype, object)
+        newobj = self.getNewObject(filepath, objtype, object, parent)
+        self.setObjectData(filepath, objtype, object, newobj, data, metadata)
+                 
+
+    def getObjectType(self, filepath, metadata):
+        """ Get the type of the object. """
+
+        objtype='File'
+        if metadata.has_key('Type'):
+            # Get type from resource metadata
+            objtype = metadata['Type']
+        elif metadata.has_key('ResType'):
+            # Get type from resource tag
+            objtype = metadata['ResType']
+        else:
+            # Get object type from mimetype
+            if metadata.has_key('Format'):
+                # Get the mimetype out of this field
+                restype = metadata['Format']
+            else:
+                # Get the mimetype from the mimetype library
+                restype = guess_type(filepath)[0]
+            if restype:
+                # Set object type based on mimetype
+                if restype in ['text/html', 'text/htm' 'text/plain' 'text/x-rst', 'text/structured']:
+                    objtype = 'Document'
+                elif re.match('^image', restype):
+                    objtype = 'Image'
+                else:
+                    objtype = 'File'
+
+        return objtype
+                
+            
+    def createFolders(self, filepath, objtype, object):
+        """ Create folders for the object if they do not already exist. """
+        parent = object
+
+        if objtype != 'Folder':
+            # Get the ZODB path, create folders if they do not exist
+            for p in filepath.split('/')[:-1]:
+                newparent = getattr(parent.aq_inner.aq_explicit, p, None)
+                if newparent:
+                    parent = newparent
+                else:
+                    parent = self.createFolder(parent, p)
+                    parent.title = parent.id
+
+        return parent
+
+
+    def getNewObject(self, filepath, objtype, object, parent):
+        """ Get the new object if it exists, otherwise create it. """
+        id = filepath.split('/')[-1]
+        newobj = None
+        if parent == object and object.portal_type == objtype:
+            newobj = object
+        elif getattr(parent.aq_explicit, id, None):
+            # 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 one
+        if not newobj:
+            parent.invokeFactory(objtype, id)
+            newobj = getattr(parent, id)
+            newobj = object.portal_factory.doCreate(newobj, id)
+
+        return newobj
+
+
+    def setObjectData(self, filepath, objtype, object, newobj, data, metadata):
+        """ Set the file data on the object. """
+        if objtype == 'Document':
+            if metadata.has_key('Format'):
+                fmt = metadata['Format']
+            else:
+                fmt = guess_type(filepath)[0]
+            newobj.setText(data, mimetype=fmt, filename=filepath.split('/')[-1])           
+        elif 'File' == objtype:
+            newobj.setFile(data)
+        elif 'Image' == objtype:
+            newobj.setImage(data)
+        elif 'Link' == objtype:
+            newobj.setRemoteUrl(data)
+        
+        # Set the metadata on the object
+        for key in metadata.keys():
+            field = newobj.getField(key)
+            if field:
+                mutator = field.getMutator(newobj)
+                if mutator:
+                    if field.__name__ == 'excludeFromNav':
+                        mutator('False')
+                    else:
+                        mutator(metadata[key])
+                    
+        # Reindex the object so that the new stuff appears
+        object.portal_catalog.reindexObject(newobj, object.portal_catalog.indexes() )
+
+
+    def createFolder(self, parent, id):
+        """ Create a folder """
+
+        parent.invokeFactory('Folder',id)
+        obj = getattr(parent, id)
+        obj.setExcludeFromNav(True)
+        obj.setTitle(id)
+        obj = parent.portal_factory.doCreate(obj, id)
+        
+        parent.portal_catalog.reindexObject(obj, parent.portal_catalog.indexes())
+
+        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
+
+DefaultCreateObjects = createObjects()
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/README.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/README.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/README.txt	(revision 712)
@@ -0,0 +1,49 @@
+IMS Transport Tool 
+------------------ 
+by the `Center for Open Sustainable Learning`_ at Utah State University. 
+
+.. _`Center for Open Sustainable Learning`: http://cosl.usu.edu 
+
+The IMS Transport Tool allows Plone users to upload content in the form of an IMS package.
+Although preliminary support is included for popular proprietary
+learning management system packages, support for extending this product
+to handle the import or export of any IMS package is also included.
+
+What's New
+---------- 
+
+
+Installation 
+------------ 
+
+For full installation instructions see the "INSTALL.txt" file.
+
+
+
+Features 
+-------- 
+
+  * Experimental support for importing MIT CP into Plone.
+
+  * Experimental support for importing Web CT and Blackboard IMS packages into Plone. 
+  
+  * Uses Zope 3 events. 
+  
+  * Uses a two stage processing engine, which allows transforms over existing IMS
+    package manifests to be rewritten into a common format. 
+
+  * Maps LOM metadata to Dublin Core fields used in Plone objects. 
+
+  * Easily extensible. 
+
+Requires 
+-------- 
+
+  * Plone 3.0.0 and greater
+  
+  * Zope 2.10.4 and greater
+
+  * BeautifulSoup 3.0.4
+
+
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/TransformHandlers.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/TransformHandlers.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/TransformHandlers.py	(revision 712)
@@ -0,0 +1,428 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+
+
+from zope.event import notify
+from Products.CMFCore.utils import UniqueObject, getToolByName
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from config import WWW_DIR
+from ManifestEvents import ObjectWriteContributeNode, ObjectReadContributeNode, ObjectTransformPackage
+from IMS_exceptions import ManifestError
+import string
+import mimetypes
+import re
+from xml.dom import minidom
+from xml.xpath import Evaluate
+import os
+from libxslt import parseStylesheetDoc
+from libxml2 import readFile, parseDoc
+import mimetypes
+from zope.component import getUtility
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+
+
+class WebCTTransform:
+    """ Transform WebCT content. """
+    
+    def __call__(self, event):
+        if 'WebCT CE 6.0' == event.package_type[0]:
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        self.getFileData(manifest, xformdata, context)
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+        
+    def evaluateExpressionNs(self,doc,nslist,expression):
+
+        xc = doc.xpathNewContext()
+        
+        for ns in nslist:
+            xc.xpathRegisterNs(ns[0],ns[1])        
+            
+        mods = xc.xpathEval(expression)
+            
+        return mods
+
+    def getFileData(self, manifest, xformdata, context):
+        
+        doc = parseDoc(manifest)
+        xc = doc.xpathNewContext()
+        xc.xpathRegisterNs("imsct","http://www.imsproject.org/content")
+        xc.xpathRegisterNs("lom","http://www.imsproject.org/metadata")
+        
+        modules = xc.xpathEval('/imsct:manifest/imsct:manifest')
+        
+        fdata = {}
+        filename = ''
+
+        
+        for module in modules:
+           
+            xc.setContextNode(module)
+            manifest_type = xc.xpathEval('.//lom:learningresourcetype/lom:value/lom:langstring')[0].getContent()
+            manifest_title = xc.xpathEval('.//lom:general/lom:title/lom:langstring')[0].getContent()
+            manifest_id = xc.xpathEval('.')[0].hasProp('identifier').getContent()
+            
+            if manifest_type == 'Content Module':
+                
+                tabletitle = manifest_title
+                items = []
+
+                xc.setContextNode(module)
+                web_nodes = xc.xpathEval('imsct:resources//imsct:resource[@type=\"webcontent\"]')
+
+                for web_node in web_nodes:
+                    
+                    
+                    id = web_node.hasProp('identifier').getContent()
+                    refname = ''
+                    
+                    xc.setContextNode(web_node)
+                    file_node = xc.xpathEval("imsct:file")
+                    title = xc.xpathEval("//imsct:item[@identifierref=\"" + id + "\"]/imsct:title")[0].getContent()
+                    
+                    if file_node:
+                        refname = file_node[0].hasProp('href').getContent()
+                                              
+                        if not title:
+                            title = refname
+    
+                        items.append((refname, title))
+
+                ims_util = getUtility(IIMSTransportUtility)
+                body = ims_util.tocpage(tabletitle=tabletitle, tocitems=items)
+                fdata[manifest_id + '.html'] = body
+                    
+                
+            elif manifest_type == 'URL':
+                data = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
+                xc.setContextNode(module)
+                url_title = xc.xpathEval("imsct:metadata//lom:title/lom:langstring")[0].getContent()
+                url_filename = xc.xpathEval("imsct:resources/imsct:resource")[0].hasProp('identifier').getContent() + '.html'
+                refname = xc.xpathEval("imsct:resources/imsct:resource/imsct:file")[0].hasProp('href').getContent() 
+                
+                data += "<a href =\"%s\">%s</a>" %(refname,url_title)
+                
+                fdata[url_filename] = data
+                
+                
+            elif manifest_type == 'Glossary':
+                xc.setContextNode(module)
+                res_node = xc.xpathEval('imsct:resources//imsct:resource')[0]
+                xc.setContextNode(res_node)
+                hrefname = xc.xpathEval('imsct:file')[0].hasProp('href').getContent()
+
+                data = context.source.readFile(hrefname)
+                data = context.performTransform(data, ['WebCT Glossary', 'WebCT_glossary_xform.xsl'])
+                filename = string.join(hrefname.split('.')[:-1],'.') + '.html'
+
+                fdata[filename] = data
+                
+                
+            elif manifest_type == 'Image Database':
+
+                xc.setContextNode(module)
+                web_nodes = xc.xpathEval('imsct:resources//imsct:resource')
+
+                for web_node in web_nodes:
+                    db_path = web_node.hasProp('href').getContent()
+                    xc.setContextNode(web_node)
+                    file_nodes = xc.xpathEval('imsct:file')
+                    
+                    for file_node in file_nodes:
+                        hrefname = file_node.hasProp('href').getContent()
+                        
+                        if db_path == hrefname:
+                            
+                            items=[]
+                            data = context.source.readFile(hrefname)
+                            doc = parseDoc(data)
+                            xcim = doc.xpathNewContext()
+                            xcim.xpathRegisterNs("didl","http://www.mpeg.org/mpeg-21/2002/01-DIDL-NS")
+                            tabletitle = xcim.xpathEval('/didl:DIDL/didl:CONTAINER/didl:DESCRIPTOR/didl:STATEMENT')[0].getContent()
+                            containers = xcim.xpathEval('/didl:DIDL/didl:CONTAINER/didl:CONTAINER')
+
+                            
+                            for container in containers:
+                                xcim.setContextNode(container)
+                                title = xcim.xpathEval('didl:DESCRIPTOR/didl:STATEMENT')
+                                if title:
+                                    title = title[0].getContent()
+                                refs = xcim.xpathEval('didl:REFERENCE')
+                                
+                                if refs:
+                                    for ref in refs:
+                                        urifile = string.replace(ref.hasProp('URI').getContent(),'.xml','.html')
+                                        items.append((urifile, title))
+                                    
+                            filename = string.join(hrefname.split('.')[:-1],'.') + '.html'
+                            ims_util = getUtility(IIMSTransportUtility)
+                            body = ims_util.tocpage(tabletitle=tabletitle, tocitems=items)
+                            
+                            fdata[filename] = body
+                            
+                        elif re.compile('\.xml$').search(hrefname,1):
+                            data = context.source.readFile(hrefname)
+                            data = context.performTransform(data, ['WebCT Images', 'WebCT_image_xform.xsl'])
+                            filename = string.join(hrefname.split('.')[:-1],'.') + '.html'
+
+                            fdata[filename] = data
+                    
+        xformdata['filedata'] = fdata
+
+
+WebCTTransformHandler = WebCTTransform()
+
+
+class BlackboardTransform:
+    """ Transfrom Blackboard content. """
+
+    def __call__(self, event):
+        if 'Blackboard 6.1/7.0' == event.package_type[0]:
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        """ Transform the blackboard package into something we can consume. """
+        xformdata['filedata'] = {}
+        self.getFileData(context, manifest, xformdata['filedata'])
+        self.getNavigationData(context, manifest, xformdata['filedata'])
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+
+    def getFileData(self, context, manifest, filedata):
+        """ Blackboard stores all its documents in XML format. Get these
+            documents and transform them into HTML. """
+        files = context.source.listFiles()
+        for fn in files:
+            if 'dat' == fn.split('.')[-1]:
+                data = context.source.readFile(fn)
+                doc = parseDoc(data)
+                root = doc.getRootElement()
+                if 'CONTENT' == root.name:
+                    id = fn.split('.')[0]
+                    docfn = id + '.html'
+                    data = context.performTransform(data, ['Blackboard Content', 'Blackboard_content_import_xform.xsl'])
+                    data = data.replace('@X@EmbeddedFile.location@X@', '%s/embedded/' %id)
+                    filedata[docfn] = data.replace('@X@LOCALFOLDERLOCATION@X@', '%s/' %id)
+
+    def getNavigationData(self, context, manifest, filedata):
+        """ Blackboard embeds its navigation structure in the Organizations section
+            of the manifest. Create documents with links to the resources so that
+            eduCommons can recreate the navigation structure. """
+        doc = parseDoc(manifest)
+        nodes = doc.xpathEval('/manifest/organizations/organization/item')
+        for n in nodes:
+            tabletitle = n.xpathEval('title')[0].get_content()
+            items = []
+            for item in n.xpathEval('.//item'):
+                id = '%s.html' %(item.prop('identifierref'))
+                title = item.xpathEval('title')[0].get_content()
+                if filedata.has_key(id) and filedata[id]:
+                    items.append((id, title))
+            if items:
+                ims_util = getUtility(IIMSTransportUtility)
+                body = ims_util.tocpage(tabletitle=tabletitle, tocitems=items)
+                filedata[n.prop('identifierref') + '.html'] = body
+    
+
+BlackboardTransformHandler = BlackboardTransform()
+
+#Currently not supported
+class eXeTransform:
+    """ Transform eXe content. """
+
+    def __call__(self, event):
+        if 'eXe' == event.package_type[0]:
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+
+eXeTransformHandler = eXeTransform()
+
+#Currently not supported
+class MITTransform:
+    """ Transform MIT content. """
+
+    def __init__(self):
+        self.toc = []
+        self.base = ''
+
+    def __call__(self, event):
+        if 'MIT OCW' == event.package_type[0]:
+            self.toc = []
+            self.base = ''
+            self.doTransform(event.context, event.manifest, event.package_type, event.xformdata)
+
+    def doTransform(self, context, manifest, package_type, xformdata):
+        xformdata['filedata'] = {}
+        manifest = self.parseMITManifest(context, manifest, xformdata['filedata'])
+        self.setMITPageBody(context, xformdata['filedata'])
+        xformdata['manifest'] = context.performTransform(manifest, package_type)
+
+    def setMITPageBody(self, context, fdata):
+        """ Set the body text for a file. Strips out MIT header and navigation bar """
+        fns = context.source.listFiles()
+        for fn in fns:
+            import os
+            mimetype = mimetypes.guess_type(fn)
+            textDoc = ''
+            if mimetype:
+                if mimetype[0]:
+                    textDoc = mimetype[0].split('/')[0]
+
+            if fn[-1] != os.sep and textDoc == 'text':
+                data = context.source.readFile(fn)
+                from BeautifulSoup import BeautifulSoup
+                soup = BeautifulSoup(data)
+                
+                ftext = ''
+                if soup.findAll('div',attrs={'class':'maincontent'}):
+                    bc = soup.findAll('div',attrs={'class':'bread-crumb'})
+                    if bc:
+                        titleTag = bc[0].nextSibling.nextSibling
+                        bc[0].extract()
+                        if titleTag.name == 'h1':
+                            titleTag.extract()
+                        ftext = str(soup.findAll('div',attrs={'class':'maincontent'})[0])
+                
+                if not ftext:
+                    tbls = soup('table')
+                    for tbl in tbls:
+                        if tbl.has_key('summary'):
+                            summary = tbl['summary']
+                            if summary.find('Main Content Header') > 0:
+                                ftext = str(tbl)
+
+                if ftext:
+                    fdata[fn] = ftext
+            
+    def parseMITManifest(self, context, manifest, fdata):
+        """ Parses and modifies MITManifest where necessary """
+        
+        title = ''
+        doc = parseDoc(manifest)
+        xc = doc.xpathNewContext()
+        self.setMITNamespaces(xc)
+        self.parseMITResources(context, xc, fdata)
+
+        return doc.serialize()
+
+    def setMITNamespaces(self,xc):
+        """ Set the MIT specific namespaces """
+        xc.xpathRegisterNs("mitcp","http://www.imsglobal.org/xsd/imscp_v1p1")
+        xc.xpathRegisterNs("adlcp","http://www.adlnet.org/xsd/adlcp_rootv1p2")
+        xc.xpathRegisterNs("ocw","http://ocw.mit.edu/xmlns/ocw_imscp")
+        xc.xpathRegisterNs("lom","http://ocw.mit.edu/xmlns/LOM")
+
+    def parseMITResources(self, context, xc, fdata):
+        """ Parse each of the MIT Resource objects """
+        resources = xc.xpathEval('/mitcp:manifest/mitcp:resources/mitcp:resource')
+        self.base = xc.xpathEval("//@xml:base")[0].getContent()
+        for resource in resources:
+            xc.setContextNode(resource)
+            resid = resource.hasProp('identifier').getContent()
+            self.addMITTocEntry(xc,resid)
+            self.updateMITMetadata(xc,context,resid)
+
+        self.createMITTocPage(context, "Table of Contents", self.toc,  fdata)
+
+    def updateMITMetadata(self,xc,context,resid):
+        """ Updates the MIT Manifest with lom object contained in separate xml files """
+        resources = xc.xpathEval("//mitcp:resource[@identifier='" + resid +"']")
+        if resources:
+            xc.setContextNode(resources[0])
+            locations = xc.xpathEval("./mitcp:metadata/adlcp:location")
+            if locations:
+                location = self.base + locations[0].getContent()
+                zf = context.source.readFile(location)
+
+                if zf:
+                    zfdoc = parseDoc(zf)
+                    zfxc = zfdoc.xpathNewContext()
+                    self.setMITNamespaces(zfxc)
+                    mdQuery = xc.xpathEval('//mitcp:resource[@identifier="'+resid+'"]/mitcp:metadata')
+                    if mdQuery:
+                        mdNode = mdQuery[0]
+                        lomNode = zfxc.xpathEval('//lom:lom')
+                        if lomNode:
+                            mdNode.addChild(lomNode[0])
+                    
+#                    self.setMITKeywords(mdNode,zfxcring"))
+#                    self.setMITTerm(xc,self.getMITMetadata(zfxc,"//lom:lifeCycle/lom:version/lom:string"))
+#                    self.setMITCreators(mdNode,zfxc,"//[contains(text(),'Author')]/parent::node()/parent::node()/lom:entity"))
+#                    self.setMITCreators(mdNode,zfxc)
+#                    self.setMITDescription(xc,self.getMITMetadata(zfxc,"//lom:general/lom:description/lom:string"))
+                             
+    def addMITTocEntry(self,xc,resid):
+        """ Add a table of contents entry """
+        tocref = ''
+        files = xc.xpathEval("./mitcp:file")
+
+        if len(files) == 1:
+            thref = xc.xpathEval("./mitcp:file/@href")
+            if thref:
+                tocref = self.base + thref[0].getContent()
+                    
+        items = xc.xpathEval('/mitcp:manifest/mitcp:organizations//mitcp:item[@identifierref="' + resid + '"]')
+
+        for item in items:
+            xc.setContextNode(item)
+            title = self.getMITItemTitle(xc,item,resid)
+            # All files that have  ocw:sectionTemplateType are visible
+            isvis = xc.xpathEval('@ocw:sectionTemplateType')
+            if isvis and tocref:
+                if isvis[0].getContent() != '':
+                    self.toc.append((tocref,title))
+                
+    def createMITTocPage(self, context, tabletitle, tocitems, fdata):
+        """ Creates the MIT Table of Contents Page """
+        if not tocitems:
+            tocitems.append(('','Home'))
+
+        ims_util = getUtility(IIMSTransportUtility)
+        body = ims_util.tocpage(tabletitle="Table of Contents", tocitems=tocitems)
+        fdata['index.html'] = body
+
+    def getMITItemTitle(self,xc,item,id):
+        """ Get the title of the item, if there is none, then return the id """
+        
+        titles = xc.xpathEval("mitcp:title")
+        title = ''
+        if titles:
+            title = titles[0].getContent()
+        else:
+            title = id
+
+        return title
+        
+    def getMITMetadata(self, xc, xpathQuery):
+        mds = xc.xpathEval(xpathQuery)
+        if mds:
+            return [md.getContent() for md in mds]
+        else:
+            return []
+
+MITTransformHandler = MITTransform()
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/__init__.py	(revision 712)
@@ -0,0 +1,38 @@
+##################################################################################
+#
+#    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
+#
+##################################################################################
+
+__version__ = "$Revision: 2618 $"[11:-2]
+
+
+from Globals import package_home
+from Products.CMFCore import utils, permissions, DirectoryView
+from Products.CMFPlone.utils import ToolInit
+from Products.Archetypes.public import *
+from Products.Archetypes import listTypes
+from Products.Archetypes.utils import capitalize
+from zope.i18nmessageid import MessageFactory
+
+import os, os.path
+
+def initialize(context):
+
+	pass
+
+IMSTransportMessageFactory = MessageFactory('IMSTransport')
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/__init__.py	(revision 712)
@@ -0,0 +1,1 @@
+# Treat folder as product
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/configure.zcml
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/configure.zcml	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/configure.zcml	(revision 712)
@@ -0,0 +1,43 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+	   xmlns:browser="http://namespaces.zope.org/browser"
+           xmlns:five="http://namespaces.zope.org/five"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="IMSTransport">
+
+  <browser:page
+	name="imsimport_form"
+	for="*"
+	class=".imstransportform.ImportForm"
+	permission="zope2.View"
+	/>
+
+  <browser:page
+	name="imsexport_form"
+	for="*"
+	class=".imstransportform.ExportForm"
+	permission="zope2.View"
+	/>
+
+<browser:page
+	name="imschoice_form"
+	for="*"
+	template="imschoice.pt"
+	permission="zope2.View"
+	/>
+
+  <adapter factory=".imstransportform.ImportFormAdapter"
+	   for="Products.ATContentTypes.content.folder.ATFolder"/>
+
+  <adapter factory=".imstransportform.ExportFormAdapter"
+	   for="Products.ATContentTypes.content.folder.ATFolder"/>
+
+  <utility provides="zope.schema.interfaces.IVocabularyFactory"
+           component=".imstransportform.transportVocabulary"
+           name="imsvocab"
+           />
+
+  <five:traversable class="OFS.Application.Application" /> 
+  
+  <five:traversable class="Products.CMFCore.PortalObject.PortalObjectBase" />
+
+</configure>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/imschoice.pt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/imschoice.pt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/imschoice.pt	(revision 712)
@@ -0,0 +1,35 @@
+<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="IMSTransport">
+
+
+<metal:block fill-slot="top_slot" />
+           
+
+<div metal:fill-slot="main">
+
+    <h1 class="documentFirstHeading"
+        i18n:translate="">IMS Import/Export</h1>
+
+    <p><strong i18n:translate="">Import and Export objects using IMS standards.</strong></p>
+
+    <ul><li>
+
+    <a href="@@imsimport_form" i18n:domain="IMSTransport" i18n:translate="">Import IMS Package</a><br />
+            <span class="discreet" i18n:domain="IMSTransport" i18n:translate="">Import an IMS content package.</span></li>
+
+      <li>
+        <a href="@@imsexport_form" i18n:domain="IMSTransport" i18n:translate="">Export IMS Package</a><br />
+            <span class="discreet" i18n:domain="IMSTransport" i18n:translate="">Export an IMS content package.</span></li>
+
+
+</div>
+
+
+</html>
+
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/imstransportform.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/imstransportform.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/browser/imstransportform.py	(revision 712)
@@ -0,0 +1,197 @@
+
+##################################################################################
+#
+#    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.formlib.form import FormFields, action
+from zope.interface import Interface
+from zope import schema
+
+
+from zope.interface import Interface, Attribute
+from zope.component import getUtility
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+from zope.schema.vocabulary import SimpleVocabulary
+from Products.Five.formlib.formbase import EditForm
+from zope.schema._bootstrapinterfaces import WrongType
+from zope.schema.interfaces import IVocabularyFactory
+from zope.schema import TextLine
+
+from Products.CMFDefault.formlib.widgets import ChoiceRadioWidget
+from Products.CMFCore.utils import getToolByName
+from zope.interface import implements
+from zope.app.file.file import File
+from zope.app.file.interfaces import IFile
+from zope.app.form.browser.textwidgets import FileWidget
+from collective.imstransport.Manifest import ZipfileReader, ZipfileWriter
+from zipfile import ZipFile, BadZipfile
+from StringIO import StringIO
+
+from collective.imstransport import IMSTransportMessageFactory as _
+
+
+class ZipFileLine(TextLine):
+
+    def _validate(self, value):
+        try:
+            ZipFile(StringIO(value))
+        except BadZipfile, e:
+            raise WrongType(e)
+
+def transportVocabulary(self):
+
+    defmsg = _(u'Default')
+    if getattr(self,'context',None):
+        ts = getToolByName(self.context,'translation_service')
+        imstransport_prop = self.context.portal_properties.ims_transport_properties
+        import_xforms = imstransport_prop.import_xforms
+
+        items = [(ts.translate(defmsg),u'Default'),]
+        for xform in import_xforms:
+            xform_info = getattr(imstransport_prop,xform)
+            id = xform
+            title = str(xform_info[0])
+            value = (ts.translate(title),id)
+            items.append(value) 
+        
+        return SimpleVocabulary.fromItems(items)
+
+    return []
+
+class IImport(Interface):
+    """ Import Form """
+
+    filename = ZipFileLine(title=_(u"IMS File Import"),
+                           description=_(u"The name of the ims package on your local machine."),
+                           required=True)
+
+
+    packagetype = schema.Choice(title=_(u"Package Type"),
+                                description=_(u"The type of the ims package being uploaded"),
+                                required=True,
+                                default=u'Default',
+                                vocabulary="imsvocab")
+
+class IExport(Interface):
+    """ Export Form """
+
+    filename = TextLine(title=_(u"IMS File Export"),
+                           description=_(u"The name of the zip file where you want to export the ims package."),
+                           required=True)
+
+
+class ImportFormAdapter(object):
+    """ Adapter for the import form """
+
+    implements(IImport)
+
+    def __init__(self,context):
+        self.context = context
+
+    def get_zipfile_name(self):
+        pass
+
+    def set_zipfile_name(self, title):
+        pass
+
+    def get_type(self):
+        return 'Default'
+
+    def set_type(self):
+        pass
+    
+    filename = property(get_zipfile_name, set_zipfile_name)
+    packagetype = property(get_type, set_type)
+
+class ExportFormAdapter(object):
+    """ Adapter for the export form """
+
+    implements(IExport)
+
+    def __init__(self,context):
+        self.context = context
+
+    def get_zipfile_name(self):
+        return self.context.id + '.zip'
+
+    def set_zipfile_name(self, title):
+        pass
+
+    filename = property(get_zipfile_name, set_zipfile_name)
+
+class ImportForm(EditForm):
+    """ Render the import form  """
+    form_fields = FormFields(IImport)
+    form_fields['filename'].custom_widget = FileWidget
+
+    form_fields['packagetype'].custom_widget = ChoiceRadioWidget
+    label = _(u'Import Content')
+    description = _(u'Import IMS content package')
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.ims_util = getUtility(IIMSTransportUtility)
+
+    @action(_(u'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)
+
+        self.request.response.redirect('.')
+
+
+class ExportForm(EditForm):
+    """ Render the export form  """
+    form_fields = FormFields(IExport)
+    label = _(u'Export Content')
+    description = _(u'Export IMS content package')
+
+    def __init__(self, context, request):
+        self.context = context
+        self.request = request
+        self.ims_util = getUtility(IIMSTransportUtility)
+
+    @action(_(u'Export') )
+    def action_export(self, action, data):
+
+        container = self.context
+        filename = self.context.REQUEST['form.filename']
+        content, fn = self.ims_util.exportZipfile(self.context,filename)
+
+        if content:
+            container.REQUEST.RESPONSE.setHeader('content-type', 'application/zip')
+            container.REQUEST.RESPONSE.setHeader('content-length', len(content))
+            container.REQUEST.RESPONSE.setHeader('Content-Disposition',
+                                                 ' attachment; filename=%s' %filename)
+            container.REQUEST.RESPONSE.write(str(content))
+
+
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/config.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/config.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/config.py	(revision 712)
@@ -0,0 +1,52 @@
+##################################################################################
+#
+#    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: 2618 $"[11:-2]
+
+#
+# Product configuration. This contents of this module will be imported into
+# __init__.py and every content type module.
+#
+# If you wish to perform custom configuration, you may put a file AppConfig.py
+# in your product's root directory. This will be included in this file if
+# found.
+#
+from Products.CMFCore.permissions import setDefaultRoles
+import os
+
+PROJECTNAME = "IMSTransport"
+
+OTT_DIR = os.path.abspath(os.path.dirname(__file__))
+WWW_DIR = os.path.join(OTT_DIR, 'www')
+
+DEFAULT_ADD_CONTENT_PERMISSION = "Add portal content"
+setDefaultRoles(DEFAULT_ADD_CONTENT_PERMISSION, ('Manager', 'Owner', 'Member'))
+
+product_globals=globals()
+
+
+try:
+    from collective.imstransport.AppConfig import *
+except ImportError:
+    pass
+
+# End of config.py
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/configure.zcml
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/configure.zcml	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/configure.zcml	(revision 712)
@@ -0,0 +1,83 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:genericsetup="http://namespaces.zope.org/genericsetup"
+           xmlns:five="http://namespaces.zope.org/five"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+	   i18n_domain="IMSTransport">
+
+  <five:registerPackage package="." />
+
+  <include package=".browser" />
+  <include package=".utilities" />
+
+  <adapter
+      for="Products.ATContentTypes.interface.folder.IATFolder"
+      provides=".interfaces.IIMSManifestWriter"
+      factory=".Manifest.IMSManifestWriter" />
+
+  <adapter
+      for="Products.ATContentTypes.interface.folder.IATFolder"
+      provides=".interfaces.IIMSManifestReader"
+      factory=".Manifest.IMSManifestReader" />
+
+
+  <i18n:registerTranslations directory="locales" />
+
+
+  <subscriber
+      for=".interfaces.ISetNameSpaces"
+      handler=".ManifestHandlers.setNameSpaces" />
+
+  <subscriber
+      for=".interfaces.IObjectWriteMetadata"
+      handler=".ManifestHandlers.WriteLOMMetadataHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectReadMetadata"
+      handler=".ManifestHandlers.ReadLOMMetadataHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectWriteOrganizations"
+      handler=".ManifestHandlers.WriteOrganizationsHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectReadOrganizations"
+      handler=".ManifestHandlers.ReadOrganizationsHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectWriteContributeNode"
+      handler=".ManifestHandlers.writeContributeNode" />
+
+  <subscriber
+      for=".interfaces.IObjectReadContributeNode"
+      handler=".ManifestHandlers.readContributeNode" />
+
+  <subscriber
+      for=".interfaces.IObjectCreateObject"
+      handler=".ManifestHandlers.DefaultCreateObjects" />
+      
+  <subscriber
+      for=".interfaces.IObjectTransformPackage"
+      handler=".TransformHandlers.WebCTTransformHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectTransformPackage"
+      handler=".TransformHandlers.BlackboardTransformHandler" />
+
+  <subscriber
+      for=".interfaces.IObjectTransformPackage"
+      handler=".TransformHandlers.MITTransformHandler" />
+
+  <genericsetup:registerProfile
+     name="default"
+     title="IMSTransport"
+     directory="profiles/default"
+     description="Extension Profile for IMS Transport Product."
+     provides="Products.GenericSetup.interfaces.EXTENSION"
+     />
+
+
+  <five:traversable class="OFS.Application.Application" />
+
+  <five:traversable class="Products.CMFCore.PortalObject.PortalObjectBase" />
+
+</configure>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-ca.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-ca.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-ca.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-de.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-de.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-de.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-es.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-es.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-es.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-18 00:00+0000\n"
+"Last-Translator: Oriol BorrÂ·s <oriol.borras@upm.es>\n"
+"Language-Team: Oficina OCW-UPM <ocw-upm@upm.es>\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: es\n"
+"Language-Name: Spanish\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-fr.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-fr.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-fr.po	(revision 712)
@@ -0,0 +1,48 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-03-20 10:11+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"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-ja.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-ja.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-ja.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-06 00:06+0900\n"
+"Last-Translator: Haruo Takemura <h-tak@ga2.so-net.ne.jp>\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: ja\n"
+"Language-Name: Japanese\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-nl.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-nl.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-nl.po	(revision 712)
@@ -0,0 +1,49 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-06 18:36+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"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-tr.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-tr.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-tr.po	(revision 712)
@@ -0,0 +1,48 @@
+# Internationalization Master Template for IMSTransport
+# David Ray <davidray@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport 1.0\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-cn.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-cn.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-cn.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-12 15:02+0800\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\n"
+"Language-Team: Mark <PKUGSE@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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-hk.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-hk.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-hk.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-hk\n"
+"Language-Name: Chinese (Hongkong)\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-tw.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-tw.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone-zh-tw.po	(revision 712)
@@ -0,0 +1,46 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-tw\n"
+"Language-Name: Traditional Chinese\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: plone\n"
+
+#. Default: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone.pot
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone.pot	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/i18n/plone.pot	(revision 712)
@@ -0,0 +1,49 @@
+# --- 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-05 18:02+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: "Blackboard 6.1/7.0"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard 6.1/7.0"
+msgstr ""
+
+#. Default: "Blackboard Content"
+#: ./profiles/default/propertiestool.xml
+msgid "Blackboard Content"
+msgstr ""
+
+#. Default: "MIT OCW"
+#: ./profiles/default/propertiestool.xml
+msgid "MIT OCW"
+msgstr ""
+
+#. Default: "WebCT CE 6.0"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT CE 6.0"
+msgstr ""
+
+#. Default: "WebCT Glossary"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Glossary"
+msgstr ""
+
+#. Default: "WebCT Images"
+#: ./profiles/default/propertiestool.xml
+msgid "WebCT Images"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/interfaces.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/interfaces.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/interfaces.py	(revision 712)
@@ -0,0 +1,88 @@
+##################################################################################
+#
+#    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 0.0 $'[11:-2]
+
+from zope.interface import Interface
+from zope.component.interfaces import IObjectEvent
+
+
+class IIMSManifestWriter(Interface):
+    """ Write an IMS Content Package manifest document. """
+
+    def setWriterType(wtype):
+        """ Set the writer type, which determines how objects are written,
+            and which event handler writes them. """
+
+    def setDestination(dest):
+        """ Set the destination for data written by the manifest writer. """
+
+    def writeManifest():
+        """ Write the manifest. """
+
+    def getManifest():
+        """ Get the manifest expressed in XML. """
+
+class IIMSManifestReader(Interface):
+    """ Read an IMS Content Package manifest document. """
+
+    def setReaderType(rtype):
+        """ Set the reader type, which determines how objects are created,
+            and which event handler creates them. """
+
+    def setSource(source):
+        """ Set the source of the data used by the manifest reader. """
+
+    def setRequiredMetadataSections(sections):
+        """ Set which metadata sections should be required. Useful if you
+            want to define your own metadata section, and have it be required. """
+
+    def readManifest(manifest):
+        """ Read a manifest """
+
+class ISetNameSpaces(IObjectEvent):
+    """ Set namespace information in manifest. """
+    
+class IObjectWriteMetadata(IObjectEvent):
+    """ Write LOM Metadata event """
+    
+class IObjectReadMetadata(IObjectEvent):
+    """ Write LOM Metadata event """
+    
+class IObjectWriteOrganizations(IObjectEvent):
+    """ Write and organization entry """
+    
+class IObjectReadOrganizations(IObjectEvent):
+    """ Write and organization entry """
+
+class IObjectWriteContributeNode(IObjectEvent):
+    """ Write contribute node event """
+
+class IObjectReadContributeNode(IObjectEvent):
+    """ Read contribute node event """
+    
+class IObjectCreateObject(IObjectEvent):
+    """ Create an object from manifest data. """
+    
+class IObjectTransformPackage(IObjectEvent):
+    """ Transform IMS package into a format we can consume. """
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/IMSTransport.pot
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/IMSTransport.pot	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/IMSTransport.pot	(revision 712)
@@ -0,0 +1,106 @@
+# --- 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-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/ca/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,103 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/de/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/en/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,103 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr ""
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/es/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-18 00:00+0000\n"
+"Last-Translator: Oriol BorrÂ·s <oriol.borras@upm.es>\n"
+"Language-Team: Oficina OCW-UPM <ocw-upm@upm.es>\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: es\n"
+"Language-Name: Spanish\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "Exportar"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "Cargar"
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/fr/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,107 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransportTool\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-03-20 10:11+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: IMSTransport\n"
+"X-Poedit-Language: French\n"
+"X-Poedit-Country: FRANCE\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "Exportez"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "Uploadez"
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/ja/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-05-06 00:06+0900\n"
+"Last-Translator: Haruo Takemura <h-tak@ga2.so-net.ne.jp>\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: ja\n"
+"Language-Name: Japanese\n"
+"Preferred-Encodings: utf-8 latin1\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "ãšã¯ã¹ããŒã"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "ã¢ããã­ãŒã"
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/nl/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,108 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMS\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-06 18:36+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: IMSTransport\n"
+"X-Poedit-Language: Dutch\n"
+"X-Poedit-Country: NETHERLANDS\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "Exporteer"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "Upload"
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/tr/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,109 @@
+# Internationalization Master Template for IMSTransport
+# David Ray <davidray@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport 1.0\n"
+"POT-Creation-Date: 2008-11-05 18:02+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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "DosyayÄ± Aktar"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr "Ä°Ã§eriÄi Aktar"
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr "IMSAktarmaFormu_baÅlÄ±k"
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr "IMS Ä°Ã§erik Paketini Aktar"
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+#, fuzzy
+msgid "Export an IMS content package."
+msgstr "IMS Ä°Ã§erik Paketini Aktarma"
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr "Bilgi YÃ¶netim Sistemi"
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr "IMS DosyasÄ± Aktar"
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr "IMS DosyasÄ± Al"
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr "BaÅlÄ±k_IMS"
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr "IMSalmaformu_baÅlÄ±k"
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+#, fuzzy
+msgid "Import an IMS content package."
+msgstr "IMS Ä°Ã§erik Paketini Alma"
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr "AÃ§Ä±klama_IMS"
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr "Paket Tipi"
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr "Yerel Makinenizdeki IMS Paketinin adÄ±"
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr "IMS paketini aktarmak istediÄiniz zip dosyasÄ±nÄ±n adÄ±"
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr "YÃŒklenen IMS paketinin tipi"
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "YÃŒkle"
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-cn/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-04-12 15:02+0800\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\n"
+"Language-Team: Mark <PKUGSE@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: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "å¯Œåº"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "äžäŒ "
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-hk/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-hk\n"
+"Language-Name: Chinese (Hongkong)\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "å°åº"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "äžå³"
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/locales/zh-tw/LC_MESSAGES/IMSTransport.po	(revision 712)
@@ -0,0 +1,105 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: IMSTransport\n"
+"POT-Creation-Date: 2008-11-05 18:02+0000\n"
+"PO-Revision-Date: 2007-09-15 00:37-0700\n"
+"Last-Translator: Chenyong(Jessie) Zhu <jessie0587@hotmail.com>\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: zh-tw\n"
+"Language-Name: Traditional Chinese\n"
+"Preferred-Encodings: utf-8\n"
+"Domain: IMSTransport\n"
+
+#: ./browser/imstransportform.py:63
+msgid "Default"
+msgstr ""
+
+#. Default: "Export"
+#: ./browser/imstransportform.py:182
+msgid "Export"
+msgstr "å°åº"
+
+#: ./browser/imstransportform.py:174
+msgid "Export Content"
+msgstr ""
+
+#. Default: "Export IMS Package"
+#: ./browser/imschoice.pt:26
+msgid "Export IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:175
+msgid "Export IMS content package"
+msgstr ""
+
+#. Default: "Export an IMS content package."
+#: ./browser/imschoice.pt:27
+msgid "Export an IMS content package."
+msgstr ""
+
+#. Default: "IMS"
+#: ./profiles/default/actions.xml
+msgid "IMS"
+msgstr ""
+
+#: ./browser/imstransportform.py:98
+msgid "IMS File Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:84
+msgid "IMS File Import"
+msgstr ""
+
+#. Default: "IMS Import/Export"
+#: ./browser/imschoice.pt:15
+msgid "IMS Import/Export"
+msgstr ""
+
+#: ./browser/imstransportform.py:148
+msgid "Import Content"
+msgstr ""
+
+#. Default: "Import IMS Package"
+#: ./browser/imschoice.pt:22
+msgid "Import IMS Package"
+msgstr ""
+
+#: ./browser/imstransportform.py:149
+msgid "Import IMS content package"
+msgstr ""
+
+#. Default: "Import an IMS content package."
+#: ./browser/imschoice.pt:23
+msgid "Import an IMS content package."
+msgstr ""
+
+#. Default: "Import and Export objects using IMS standards."
+#: ./browser/imschoice.pt:18
+msgid "Import and Export objects using IMS standards."
+msgstr ""
+
+#: ./browser/imstransportform.py:89
+msgid "Package Type"
+msgstr ""
+
+#: ./browser/imstransportform.py:85
+msgid "The name of the ims package on your local machine."
+msgstr ""
+
+#: ./browser/imstransportform.py:99
+msgid "The name of the zip file where you want to export the ims package."
+msgstr ""
+
+#: ./browser/imstransportform.py:90
+msgid "The type of the ims package being uploaded"
+msgstr ""
+
+#. Default: "Upload"
+#: ./browser/imstransportform.py:156
+msgid "Upload"
+msgstr "äžå³"
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/actions.xml
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/actions.xml	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/actions.xml	(revision 712)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<object name="portal_actions" meta_type="Plone Actions Tool"
+   xmlns:i18n="http://xml.zope.org/namespaces/i18n">
+ <object name="object" meta_type="CMF Action Category">
+  <property name="title"></property>
+  <object name="import" meta_type="CMF Action" i18n:domain="IMSTransport">
+   <property name="title" i18n:translate="">IMS</property>
+   <property name="description" i18n:translate=""></property>
+   <property name="url_expr">string:@@imschoice_form</property>
+   <property name="icon_expr"></property>
+   <property name="available_expr">python: object.restrictedTraverse('plone_context_state').is_structural_folder() and not object.restrictedTraverse('plone_context_state').is_portal_root()</property>
+   <property name="permissions">
+    <element value="Modify portal content"/>
+   </property>
+   <property name="visible">True</property>
+  </object>
+ </object>
+</object>
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/import_steps.xml
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/import_steps.xml	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/import_steps.xml	(revision 712)
@@ -0,0 +1,8 @@
+<?xml version="1.0"?>
+<import-steps>
+  <import-step id="imstransport-final" version="20070514-01"
+	       handler="collective.imstransport.setupHandlers.importFinalSteps"
+	       title="IMSTransport Final Steps Setup">
+    <dependency step="plone-final"/>
+  </import-step>
+</import-steps>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/propertiestool.xml
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/propertiestool.xml	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/profiles/default/propertiestool.xml	(revision 712)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<object name="portal_properties" meta_type="Plone Properties Tool"
+	xmlns:i18n="http://xml.zope.org/namespaces/i18n" i18n:domain="plone">
+  <object name="ims_transport_properties" meta_type="Plone Property Sheet">
+    <property name="title">IMS Licensing properties</property>
+    <property name="import_xforms" type="lines" >
+      <element value="mitdspace_import_xform" />
+      <element value="WebCT_import_xform" />
+      <element value="Blackboard_import_xform" />
+    </property>
+    <property name="mitdspace_import_xform" type="lines">
+      <element value="MIT OCW" i18n:attributes="value" />
+      <element value="MITDspace_import_xform.xsl" />
+    </property>
+    <property name="WebCT_import_xform" type="lines">
+      <element value="WebCT CE 6.0" i18n:attributes="value" />
+      <element value="WebCT_import_xform.xsl" />
+    </property>
+    <property name="Blackboard_import_xform" type="lines">
+      <element value="Blackboard 6.1/7.0" i18n:attributes="value" />
+      <element value="Blackboard_import_xform.xsl" />
+    </property>
+    <property name="Blackboard_content_import_transform" type="lines">
+      <element value="Blackboard Content" i18n:attributes="value" />
+      <element value="Blackboard_content_import_xform.xsl" />
+    </property>
+    <property name="WebCT_image_xform" type="lines">
+      <element value="WebCT Images" i18n:attributes="value" />
+      <element value="WebCT_image_xform.xsl" />
+    </property>
+    <property name="WebCT_glossary_xform" type="lines">
+      <element value="WebCT Glossary" i18n:attributes="value" />
+      <element value="WebCT_glossary_xform.xsl" />
+    </property>
+  </object>
+</object>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/setupHandlers.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/setupHandlers.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/setupHandlers.py	(revision 712)
@@ -0,0 +1,47 @@
+##################################################################################
+#    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.app.component.interfaces import ISite
+from Products.Five.site.localsite import enableLocalSiteHook
+from zope.app.component.hooks import setSite
+from utilities.interfaces import IIMSTransportUtility
+from utilities.utils import IMSTransportUtility
+from zope.component import getSiteManager
+
+
+def importFinalSteps(context):
+    site = context.getSite()
+    setupUtilities(site)
+
+def setupUtilities(site):
+    """ Register a local utility """
+
+    if not ISite.providedBy(site):
+        enableLocalSiteHook(site)
+
+    setSite(site)
+
+    sm = getSiteManager()
+    if not sm.queryUtility(IIMSTransportUtility):
+        sm.registerUtility(IMSTransportUtility('transportutility'),
+                        IIMSTransportUtility)
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/base.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/base.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/base.py	(revision 712)
@@ -0,0 +1,45 @@
+
+from zope.testing import doctest
+from Products.PloneTestCase.PloneTestCase import setupPloneSite, installProduct
+from Products.PloneTestCase.PloneTestCase import PloneTestCase, FunctionalTestCase
+from setuptools import find_packages
+
+from Products.Five import fiveconfigure
+from Products.Five import zcml
+from Testing import ZopeTestCase as ztc
+from Products.PloneTestCase.layer import onsetup
+
+
+packages=find_packages('src', exclude=['enpraxis.educommons']),
+package_dir = {'':'src'},
+
+
+@onsetup
+def setup_imstransport_project():
+    """
+    Load and install packages required for the collective.imstransport tests
+    """
+
+    fiveconfigure.debug_mode = True
+    
+    import collective.imstransport
+    zcml.load_config('configure.zcml',collective.imstransport)
+    
+    fiveconfigure.debug_mode = False
+
+    ztc.installPackage('collective.imstransport')
+
+
+setup_imstransport_project()
+setupPloneSite(with_default_memberarea=0,extension_profiles=['collective.imstransport:default'])
+
+oflags = (doctest.ELLIPSIS |
+          doctest.NORMALIZE_WHITESPACE)
+
+prod = "collective.imstransport"
+
+class IMSTransportTestCase(PloneTestCase):
+    """ Test Class """
+
+class IMSTransportFunctionalTestCase(FunctionalTestCase, IMSTransportTestCase):
+    """ Functional test class """
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/framework.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/framework.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/framework.py	(revision 712)
@@ -0,0 +1,106 @@
+##############################################################################
+#
+# ZopeTestCase
+#
+# COPY THIS FILE TO YOUR 'tests' DIRECTORY.
+#
+# This version of framework.py will use the SOFTWARE_HOME
+# environment variable to locate Zope and the Testing package.
+#
+# If the tests are run in an INSTANCE_HOME installation of Zope,
+# Products.__path__ and sys.path with be adjusted to include the
+# instance's Products and lib/python directories respectively.
+#
+# If you explicitly set INSTANCE_HOME prior to running the tests,
+# auto-detection is disabled and the specified path will be used
+# instead.
+#
+# If the 'tests' directory contains a custom_zodb.py file, INSTANCE_HOME
+# will be adjusted to use it.
+#
+# If you set the ZEO_INSTANCE_HOME environment variable a ZEO setup
+# is assumed, and you can attach to a running ZEO server (via the
+# instance's custom_zodb.py).
+#
+##############################################################################
+#
+# The following code should be at the top of every test module:
+#
+# import os, sys
+# if __name__ == '__main__':
+#     execfile(os.path.join(sys.path[0], 'framework.py'))
+#
+# ...and the following at the bottom:
+#
+# if __name__ == '__main__':
+#     framework()
+#
+##############################################################################
+
+__version__ = '0.2.3'
+
+# Save start state
+#
+__SOFTWARE_HOME = os.environ.get('SOFTWARE_HOME', '')
+__INSTANCE_HOME = os.environ.get('INSTANCE_HOME', '')
+
+if __SOFTWARE_HOME.endswith(os.sep):
+    __SOFTWARE_HOME = os.path.dirname(__SOFTWARE_HOME)
+
+if __INSTANCE_HOME.endswith(os.sep):
+    __INSTANCE_HOME = os.path.dirname(__INSTANCE_HOME)
+
+# Find and import the Testing package
+#
+if not sys.modules.has_key('Testing'):
+    p0 = sys.path[0]
+    if p0 and __name__ == '__main__':
+        os.chdir(p0)
+        p0 = ''
+    s = __SOFTWARE_HOME
+    p = d = s and s or os.getcwd()
+    while d:
+        if os.path.isdir(os.path.join(p, 'Testing')):
+            zope_home = os.path.dirname(os.path.dirname(p))
+            sys.path[:1] = [p0, p, zope_home]
+            break
+        p, d = s and ('','') or os.path.split(p)
+    else:
+        print 'Unable to locate Testing package.',
+        print 'You might need to set SOFTWARE_HOME.'
+        sys.exit(1)
+
+import Testing, unittest
+execfile(os.path.join(os.path.dirname(Testing.__file__), 'common.py'))
+
+# Include ZopeTestCase support
+#
+if 1:   # Create a new scope
+
+    p = os.path.join(os.path.dirname(Testing.__file__), 'ZopeTestCase')
+
+    if not os.path.isdir(p):
+        print 'Unable to locate ZopeTestCase package.',
+        print 'You might need to install ZopeTestCase.'
+        sys.exit(1)
+
+    ztc_common = 'ztc_common.py'
+    ztc_common_global = os.path.join(p, ztc_common)
+
+    f = 0
+    if os.path.exists(ztc_common_global):
+        execfile(ztc_common_global)
+        f = 1
+    if os.path.exists(ztc_common):
+        execfile(ztc_common)
+        f = 1
+
+    if not f:
+        print 'Unable to locate %s.' % ztc_common
+        sys.exit(1)
+
+# Debug
+#
+print 'SOFTWARE_HOME: %s' % os.environ.get('SOFTWARE_HOME', 'Not set')
+print 'INSTANCE_HOME: %s' % os.environ.get('INSTANCE_HOME', 'Not set')
+sys.stdout.flush()
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/testIMSImport.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/testIMSImport.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/testIMSImport.py	(revision 712)
@@ -0,0 +1,308 @@
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Products.CMFPlone.tests import PloneTestCase
+from unittest import TestSuite, makeSuite
+from Testing import ZopeTestCase
+from Testing.ZopeTestCase import user_name
+from AccessControl import Unauthorized
+from base import IMSTransportTestCase
+from collective.imstransport.utilities.interfaces import IIMSTransportUtility
+from zope.component import getUtility
+
+class testIMSTransport(IMSTransportTestCase):
+    """
+    
+    """
+
+
+    def testImport(self):
+        """ Test that IMS import works for a default package. """
+        self.setRoles(['Manager'])
+        itt = getUtility(IIMSTransportUtility)
+
+#        from collective.imstransport.ManifestEvents import SetNameSpaces
+#        from collective.imstransport.interfaces import ISetNameSpaces
+#        from enpraxis.educommons.eventHandlers import setNameSpaces
+#        from zope import component
+
+#        sm = component.getSiteManager()
+
+#        sm.unregisterHandler(setNameSpaces, (SetNameSpaces,ISetNameSpaces))
+
+        self.portal.invokeFactory('Folder', 'testfolder')
+        testfolder = getattr(self.portal, 'testfolder')
+        results = itt.importZipfile(testfolder, 
+                                    'src/collective.imstransport/collective/imstransport/tests/IMS_Sample_Course.zip', 
+                                    'Default',
+                                    'LOMv1.0')
+        assert results[0], results[2]
+
+        # Test sample folder
+        assert getattr(testfolder, 'course')
+        assert getattr(testfolder, 'course.html')
+
+        # Test the sample page
+        assert getattr(testfolder.course, 'sample-page')
+        samplepage = getattr(testfolder.course, 'sample-page')
+
+        assert 'Sample Page' == samplepage.Title()
+        assert 'This is a sample page for IMS Packaging' == samplepage.Description()
+        assert 'Ray, David' in samplepage.Creators()
+        assert 'text/html' == samplepage.Format()
+        assert 'Page' == samplepage.Type()
+        assert '<h2>Sample Text</h2>' in samplepage.getText()
+        
+        # Test example subfolder
+        assert getattr(testfolder.course, 'sample-folder')
+        samplefolder = getattr(testfolder.course, 'sample-folder')
+        assert 'sample-page-in-folder' in samplefolder.objectIds()
+        sfolderpage = getattr(samplefolder, 'sample-page-in-folder')
+        assert 'Page' == sfolderpage.Type()
+        assert '<h2>My parent folder is Sample Folder</h2>' in sfolderpage.getText()
+
+        # Test Sample file
+        assert getattr(testfolder.course, 'samplefile.txt')
+        samplefile = getattr(testfolder.course, 'samplefile.txt')
+        assert 'Sample File' == samplefile.Title()
+        assert 'This is a sample file for IMS Packaging.' == samplefile.Description()
+        assert 'Ray, David' in samplefile.Creators()
+        assert 'text/plain' == samplefile.Format()
+        assert 'File' == samplefile.Type()
+        assert samplefile.size() > 0
+
+        # Test Sample image
+        assert getattr(testfolder.course, 'sampleimage.gif')
+        sampleimage = getattr(testfolder.course, 'sampleimage.gif')
+        assert 'Sample Image' == sampleimage.Title()
+        assert 'This is a sample image for IMS Packaging.' == sampleimage.Description()
+        assert 'Ray, David' in sampleimage.Creators()
+        assert 'image/gif' == sampleimage.Format()
+        assert 'Image' == sampleimage.Type()
+        assert sampleimage.size() > 0
+
+    def testWebCTImport(self):
+        """
+        """
+        self.setRoles(['Manager'])
+        itt = getUtility(IIMSTransportUtility)
+        self.portal.invokeFactory('Folder', 'testwctfolder')
+        testwctfolder = getattr(self.portal, 'testwctfolder')
+        results = itt.importZipfile(testwctfolder, 
+                                    'src/collective.imstransport/collective/imstransport/tests/WebCTTest.zip', 
+                                    'WebCT_import_xform',
+                                    'LOMv1.0')
+        assert results[0], results[2]
+
+        assert getattr(testwctfolder, 'URL_8805229_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805229_R.html')
+        assert 'assignments-external web' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://cnn.com">assignments-external web</a>' in testpage.getText()
+        
+        assert getattr(testwctfolder, 'URL_8805232_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805232_R.html')
+        assert 'syllabus-external web' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://slashdot.org">syllabus-external web</a>' in testpage.getText()
+        
+        assert getattr(testwctfolder, 'URL_8805235_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805235_R.html')
+        assert 'exams-external web' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://slashdot.org">exams-external web</a>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'URL_8805241_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805241_R.html')
+        assert 'External Website' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://digg.com">External Website</a>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'CMD_8805178_R.html')
+        testpage = getattr(testwctfolder, 'CMD_8805178_R.html')
+        assert 'assignment worksheets' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<td><a href="COURSE_8805174_M/my_files/untitled.html">Put your title here</a></td>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'COURSE_8805174_M')
+        testfolder = getattr(testwctfolder, 'COURSE_8805174_M')
+        assert getattr(testfolder, 'my_files')
+        my_files = getattr(testfolder, 'my_files')
+        assert getattr(my_files, 'untitled.html')
+        assert getattr(my_files, 'samplefile.txt')
+        assert getattr(my_files, 'sampleimage.gif')
+        assert getattr(my_files, 'untitled2.html')
+
+        assert getattr(testwctfolder, 'CMD_8805179_R.html')
+        testpage = getattr(testwctfolder, 'CMD_8805179_R.html')
+        assert 'readings' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<td><a href="COURSE_8805174_M/my_files/untitled2.html">Put your title here</a></td>' in testpage.getText()
+
+        assert getattr(testwctfolder, 'URL_8805290_R.html')
+        testpage = getattr(testwctfolder, 'URL_8805290_R.html')
+        assert 'Google' == testpage.Title()
+        assert 'test_user_1_' in testpage.Creators()
+        assert 'text/html' == testpage.Format()
+        assert 'Page' == testpage.Type()
+        assert '<a href="http://www.google.com">Google</a>' in testpage.getText()
+
+    def testBBImport(self):
+        """
+        """
+        self.setRoles(['Manager'])
+        itt = getUtility(IIMSTransportUtility)
+        self.portal.invokeFactory('Folder', 'testbbfolder')
+        testbbfolder = getattr(self.portal, 'testbbfolder')
+        results = itt.importZipfile(testbbfolder, 
+                                    'src/collective.imstransport/collective/imstransport/tests/BBTest.zip', 
+                                    'Blackboard_import_xform',
+                                    'LOMv1.0')
+        assert results[0], results[2]
+
+        assert getattr(testbbfolder, 'res00001.html')
+        testdocument = getattr(testbbfolder, 'res00001.html')
+        assert 'COURSE_DEFAULT.CourseInformation.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00007.html">Test Image</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00005.html')
+        testdocument = getattr(testbbfolder, 'res00005.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'Hello World<p></p>\n' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00006.html')
+        testdocument = getattr(testbbfolder, 'res00006.html')
+        assert 'Test File' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'samplefile.txt' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00006')
+        testfolder = getattr(testbbfolder, 'res00006')
+        assert 'Folder' == testfolder.Type()
+        assert getattr(testfolder, 'samplefile.txt')
+        testfile = getattr(testfolder, 'samplefile.txt')
+        assert 'Test File' == testfile.Title()
+        assert 'test_user_1_' in testfile.Creators()
+        assert 'text/plain' == testfile.Format()
+        assert 'File' == testfile.Type()
+        assert testfile.size() > 0
+
+        assert getattr(testbbfolder, 'res00007.html')
+        testdocument = getattr(testbbfolder, 'res00007.html')
+        assert 'Test Image' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'sampleimage.gif' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00007')
+        testfolder = getattr(testbbfolder, 'res00007')
+        assert 'Folder' == testfolder.Type()
+        assert getattr(testfolder, 'sampleimage.gif')
+        testimage = getattr(testfolder, 'sampleimage.gif')
+        assert 'Test Image' == testimage.Title()
+        assert 'test_user_1_' in testimage.Creators()
+        assert 'image/gif' == testimage.Format()
+        assert 'Image' == testimage.Type()
+        assert testimage.size() > 0
+
+        assert getattr(testbbfolder, 'res00009.html')
+        testdocument = getattr(testbbfolder, 'res00009.html')
+        assert 'Test Document 2' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'Another test<p></p>\n' == testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00002.html')
+        testdocument = getattr(testbbfolder, 'res00002.html')
+        assert 'COURSE_DEFAULT.CourseDocuments.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00010.html">Test Document</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00010.html')
+        testdocument = getattr(testbbfolder, 'res00010.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00010//course.html" title="course.html">' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00010')
+        testfolder = getattr(testbbfolder, 'res00010')
+        assert 'Folder' == testfolder.Type()
+        assert getattr(testfolder, 'course.html')
+        testdocument = getattr(testfolder, 'course.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<h3>COURSE TITLE</h3>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00003.html')
+        testdocument = getattr(testbbfolder, 'res00003.html')
+        assert 'COURSE_DEFAULT.Assignments.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00011.html">Test Document</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00011.html')
+        testdocument = getattr(testbbfolder, 'res00011.html')
+        assert 'Test Document' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert 'Hello World<p></p>\n' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00002.html')
+        testdocument = getattr(testbbfolder, 'res00002.html')
+        assert 'COURSE_DEFAULT.CourseDocuments.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00010.html">Test Document</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00004.html')
+        testdocument = getattr(testbbfolder, 'res00004.html')
+        assert 'COURSE_DEFAULT.ExternalLinks.CONTENT_LINK.label' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="res00012.html">Slashdot</a>' in testdocument.getText()
+
+        assert getattr(testbbfolder, 'res00012.html')
+        testdocument = getattr(testbbfolder, 'res00012.html')
+        assert 'Slashdot' == testdocument.Title()
+        assert 'test_user_1_' in testdocument.Creators()
+        assert 'text/html' == testdocument.Format()
+        assert 'Page' == testdocument.Type()
+        assert '<a href="http://slashdot.org">Slashdot</a><p></p>\n' in testdocument.getText()
+
+def test_suite():
+    suite = TestSuite()
+    suite.addTest(makeSuite(testIMSTransport))
+    return suite
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/testIMSexport.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/testIMSexport.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/tests/testIMSexport.py	(revision 712)
@@ -0,0 +1,105 @@
+import os, sys
+if __name__ == '__main__':
+    execfile(os.path.join(sys.path[0], 'framework.py'))
+
+from Products.CMFPlone.tests import PloneTestCase
+from unittest import TestSuite, makeSuite
+from Testing import ZopeTestCase
+from Testing.ZopeTestCase import user_name
+from AccessControl import Unauthorized
+from base import IMSTransportTestCase
+
+
+class testIMSTransport(IMSTransportTestCase):
+    
+    def testExportImportPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        it_tool = self.portal.portal_IMSTransportTool
+
+        self.testExportPackage()
+        
+        po.invokeFactory('Folder','testFolder2')
+        test_folder2 = getattr(po, 'testFolder2')       
+        it_tool.importZipfile(test_folder2,'var/mydoc.zip','Default')
+   
+        assert test_folder2.testFolder.Title() == 'MyFolder'
+        assert test_folder2.testFolder.testDoc.Title() == 'MyDoc'
+        assert test_folder2.testFolder.testDoc.Creators()[0] == 'Test User1'
+        assert test_folder2.testFolder.testDoc.Creators()[1] == 'New User2'
+        assert test_folder2.testFolder.testDoc.Description() == 'Test Description'
+        
+
+    def testExportPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        
+        if hasattr(po, 'testFolder'):
+            test_folder = getattr(po, 'testFolder')
+        else:
+            po.invokeFactory('Folder','testFolder')
+            test_folder = getattr(po, 'testFolder')
+            
+        test_folder.setTitle('MyFolder')    
+        test_folder.invokeFactory('Document', 'testDoc')
+        test_doc = getattr(test_folder, 'testDoc')
+        test_doc.setTitle('MyDoc')
+        test_doc.setCreators('Test User1\nNew User2')
+        test_doc.setExcludeFromNav(1)
+        test_doc.setDescription('Test Description')
+        
+        it_tool = self.portal.portal_IMSTransportTool
+        manifest = it_tool.exportZipfile(test_folder,'var/mydoc.zip')
+        
+        zf = file(manifest[1],'w')
+        zf.write(manifest[0])
+        zf.close()
+        
+    def testExportImportNonAsciiPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        it_tool = self.portal.portal_IMSTransportTool
+
+        self.testExportNonAsciiPackage()
+        
+        po.invokeFactory('Folder','testFolder2')
+        test_folder2 = getattr(po, 'testFolder2')       
+        it_tool.importZipfile(test_folder2,'var/mydoc.zip','Default')
+   
+        assert test_folder2.testFolder.Title() == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Title() == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Creators()[0] == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Creators()[1] == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        assert test_folder2.testFolder.testDoc.Description() == 'Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž'
+        
+
+    def testExportNonAsciiPackage(self):
+        self.setRoles(['Manager'])
+        po = self.portal
+        
+        if hasattr(po, 'testFolder'):
+            test_folder = getattr(po, 'testFolder')
+        else:
+            po.invokeFactory('Folder','testFolder')
+            test_folder = getattr(po, 'testFolder')
+            
+        test_folder.setTitle('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')    
+        test_folder.invokeFactory('Document', 'testDoc')
+        test_doc = getattr(test_folder, 'testDoc')
+        test_doc.setTitle('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')
+        test_doc.setCreators('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž\nÃ±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')
+        test_doc.setExcludeFromNav(1)
+        test_doc.setDescription('Ã±Ã Ð±ÑÐ»Ð³Ð°ÑÑÐºÐž')
+        
+        it_tool = self.portal.portal_IMSTransportTool
+        manifest = it_tool.exportZipfile(test_folder,'var/mydoc.zip')
+        
+        zf = file(manifest[1],'w')
+        zf.write(manifest[0])
+        zf.close()
+
+def test_suite():
+    suite = TestSuite()
+    suite.addTest(makeSuite(testIMSTransport))
+    return suite
+
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/__init__.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/__init__.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/__init__.py	(revision 712)
@@ -0,0 +1,1 @@
+# Make this directory a product.
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/configure.zcml
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/configure.zcml	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/configure.zcml	(revision 712)
@@ -0,0 +1,6 @@
+<configure xmlns="http://namespaces.zope.org/zope"
+           xmlns:i18n="http://namespaces.zope.org/i18n"
+           i18n_domain="IMSTransport">
+
+
+</configure>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/interfaces.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/interfaces.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/interfaces.py	(revision 712)
@@ -0,0 +1,34 @@
+##################################################################################
+#    Copyright (C) 2006-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
+
+class IIMSTransportUtility(Interface):
+    """ IMS Transport Utility """
+
+    def importZipfile(request):
+        """ Import a zip file. """
+
+    def exportZipfile(request):
+        """ Export a zip file. """
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/utils.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/utils.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/utilities/utils.py	(revision 712)
@@ -0,0 +1,65 @@
+##################################################################################
+#    Copyright (C) 2006-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 interfaces import IIMSTransportUtility
+from OFS.SimpleItem import SimpleItem
+from zope.interface import implements
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+from collective.imstransport.config import *
+from collective.imstransport.interfaces import IIMSManifestWriter, IIMSManifestReader
+from collective.imstransport.Manifest import ZipfileReader, ZipfileWriter
+from zipfile import BadZipfile
+from zope.component import getUtility
+from zope.schema.interfaces import IVocabularyFactory
+from Products.PageTemplates.PageTemplateFile import PageTemplateFile
+
+class IMSTransportUtility(SimpleItem):
+    """ IMS Transport Utility """
+
+    tocpage = PageTemplateFile('tableofcontents', WWW_DIR)
+
+    implements(IIMSTransportUtility)
+    
+    def importZipfile(self, object, file, package_type, mdVersions=None, rtype='IMSTransport'):
+        """ Import a zip file. """
+
+        reader = IIMSManifestReader(object)
+        reader.setReaderType(rtype)
+        try:
+            zfr = ZipfileReader(file)
+        except BadZipfile, e:
+            return False, 'Zip', e
+        reader.setSource(zfr)
+        if mdVersions:
+            reader.setRequiredMetadataSections(mdVersions)
+
+	imstransport = object.portal_properties.ims_transport_properties
+        pt = getattr(imstransport, package_type, None)
+        return reader.readManifest(pt)
+
+    def exportZipfile(self, object, filename, wtype='IMSTransport'):
+        """ Export a zip file. """
+        writer = IIMSManifestWriter(object)
+        writer.setWriterType(wtype)
+        writer.setDestination(ZipfileWriter(filename, object.getId()))
+        return writer.writeManifest()
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/version.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/version.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/version.txt	(revision 712)
@@ -0,0 +1,1 @@
+2.1.0
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/IMS_transport_form.zpt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/IMS_transport_form.zpt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/IMS_transport_form.zpt	(revision 712)
@@ -0,0 +1,10 @@
+<tal:header tal:replace="structure here/manage_page_header|nothing">Header</tal:header>
+<tal:message tal:define="manage_tabs_message options/manage_tabs_message | request/manage_tabs_message | nothing"
+    tal:replace="structure here/manage_tabs">Tabs</tal:message>
+<tal:body>
+
+  <h3>IMS Transport</h3>
+
+
+</tal:body>
+<tal:footer tal:replace="structure here/manage_page_footer|nothing">footer</tal:footer>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/overview.zpt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/overview.zpt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/overview.zpt	(revision 712)
@@ -0,0 +1,10 @@
+<tal:header tal:replace="structure here/manage_page_header|nothing">Header</tal:header>
+<tal:message tal:define="manage_tabs_message options/manage_tabs_message | request/manage_tabs_message | nothing"
+    tal:replace="structure here/manage_tabs">Tabs</tal:message>
+<tal:body>
+
+  <h3>Overview</h3>
+
+
+</tal:body>
+<tal:footer tal:replace="structure here/manage_page_footer|nothing">footer</tal:footer>
Index: /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/tableofcontents.zpt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/tableofcontents.zpt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/collective/imstransport/www/tableofcontents.zpt	(revision 712)
@@ -0,0 +1,17 @@
+<table class="documentTable" style="width: 499px;" border="0" cellpadding="0" cellspacing="0">
+  <thead>
+    <tr>
+      <td tal:content="options/tabletitle">Title</td>
+    </tr>
+  </thead>
+  <tbody>
+    <tal:items tal:repeat="item options/tocitems">
+      <tr tal:define="oddrow repeat/item/odd;" 
+          tal:attributes="class python:test(oddrow, 'odd', 'even')">
+        <td ><a href=""
+                tal:attributes="href python:item[0]"
+                tal:content="python:item[1]">Item</a></td>
+      </tr>
+    </tal:items>
+  </tbody>
+</table>
Index: /3.2/collective.imstransport.orig/trunk/docs/HISTORY.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/docs/HISTORY.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/docs/HISTORY.txt	(revision 712)
@@ -0,0 +1,8 @@
+Changelog
+=========
+
+2.1.0 - Unreleased
+----------------
+
+* Initial release
+
Index: /3.2/collective.imstransport.orig/trunk/docs/INSTALL.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/docs/INSTALL.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/docs/INSTALL.txt	(revision 712)
@@ -0,0 +1,43 @@
+collective.imstransport Installation
+==========================
+
+To install collective.imstransport 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 collective.imstransport``. Find out how to install setuptools
+   (and EasyInstall) here:
+   http://peak.telecommunity.com/DevCenter/EasyInstall
+
+ * Create a file called ``collective.imstransport-configure.zcml`` in the
+   ``/path/to/instance/etc/package-includes`` directory.  The file
+   should only contain this::
+
+       <include package="collective.imstransport" />
+
+
+Alternatively, if you are using zc.buildout and the plone.recipe.zope2instance
+recipe to manage your project, you can do this:
+
+ * Add ``collective.imstransport`` to the list of eggs to install, e.g.:
+ 
+    [buildout]
+    ...
+    eggs =
+        ...
+        collective.imstransport
+        
+  * Tell the plone.recipe.zope2instance recipe to install a ZCML slug:
+  
+    [instance]
+    recipe = plone.recipe.zope2instance
+    ...
+    zcml =
+        collective.imstransport
+        
+  * 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: /3.2/collective.imstransport.orig/trunk/docs/LICENSE.GPL
===================================================================
--- /3.2/collective.imstransport.orig/trunk/docs/LICENSE.GPL	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/docs/LICENSE.GPL	(revision 712)
@@ -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: /3.2/collective.imstransport.orig/trunk/docs/LICENSE.txt
===================================================================
--- /3.2/collective.imstransport.orig/trunk/docs/LICENSE.txt	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/docs/LICENSE.txt	(revision 712)
@@ -0,0 +1,16 @@
+  collective.imstransport 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: /3.2/collective.imstransport.orig/trunk/setup.cfg
===================================================================
--- /3.2/collective.imstransport.orig/trunk/setup.cfg	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/setup.cfg	(revision 712)
@@ -0,0 +1,3 @@
+[egg_info]
+tag_build = dev
+tag_svn_revision = true
Index: /3.2/collective.imstransport.orig/trunk/setup.py
===================================================================
--- /3.2/collective.imstransport.orig/trunk/setup.py	(revision 712)
+++ /3.2/collective.imstransport.orig/trunk/setup.py	(revision 712)
@@ -0,0 +1,33 @@
+from setuptools import setup, find_packages
+import os
+
+version = '2.1.0'
+
+setup(name='collective.imstransport',
+      version=version,
+      description="An AddOn that supports importing and exporting of IMS content packages.",
+      long_description=open("README.txt").read() + "\n" +
+                       open(os.path.join("docs", "HISTORY.txt")).read(),
+      # Get more strings from http://www.python.org/pypi?%3Aaction=list_classifiers
+      classifiers=[
+        "Framework :: Plone",
+        "Programming Language :: Python",
+        "Topic :: Software Development :: Libraries :: Python Modules",
+        ],
+      keywords='IMS Package import export',
+      author='enPraxis',
+      author_email='info@enpraxis.net',
+      url='http://plone.org/products/ims-transport/t',
+      license='GPL',
+      packages=find_packages(exclude=['ez_setup']),
+      namespace_packages=['collective'],
+      include_package_data=True,
+      zip_safe=False,
+      install_requires=[
+          'setuptools',
+          # -*- Extra requirements: -*-
+      ],
+      entry_points="""
+      # -*- Entry points: -*-
+      """,
+      )
