Convert drivers to Horde 4 package format.
authorMichael M Slusarz <slusarz@curecanti.org>
Tue, 10 Mar 2009 21:58:05 +0000 (15:58 -0600)
committerMichael M Slusarz <slusarz@curecanti.org>
Tue, 10 Mar 2009 21:58:05 +0000 (15:58 -0600)
Remove some unneeded require/include and remove unrequired packages from
package.xml.

91 files changed:
framework/Mime/lib/Horde/Mime/Mail.php
framework/Mime/lib/Horde/Mime/Mdn.php
framework/Mime/lib/Horde/Mime/Part.php
framework/Mime/lib/Horde/Mime/Viewer.php
framework/Mime/lib/Horde/Mime/Viewer/Audio.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Css.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Deb.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Default.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Enriched.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Enscript.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Html.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Images.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Msexcel.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Mspowerpoint.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Msword.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/common.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/global_document.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/main_html.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/palm.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_header.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_inlined.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_mapping.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/table.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_cells.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_columns.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_rows.xsl [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Pdf.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Php.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Plain.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Rar.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Report.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Rfc822.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Richtext.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Rpm.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Rtf.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Security.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Simple.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Smil.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Source.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Srchighlite.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Tgz.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Tnef.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Vcard.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Webcpp.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Wordperfect.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/Zip.php [new file with mode: 0644]
framework/Mime/lib/Horde/Mime/Viewer/audio.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/css.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/deb.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/default.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/enriched.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/enscript.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/html.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/images.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/msexcel.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/mspowerpoint.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/msword.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/common.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/global_document.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/main_html.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/palm.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/style_header.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/style_inlined.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/style_mapping.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/table.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/table_cells.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/table_columns.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/ooo/table_rows.xsl [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/pdf.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/php.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/plain.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/rar.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/report.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/rfc822.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/richtext.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/rpm.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/rtf.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/security.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/simple.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/smil.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/source.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/srchighlite.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/tgz.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/tnef.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/vcard.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/webcpp.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/wordperfect.php [deleted file]
framework/Mime/lib/Horde/Mime/Viewer/zip.php [deleted file]
framework/Mime/package.xml

index 9fa7f79..129dda9 100644 (file)
@@ -286,7 +286,6 @@ class Horde_Mime_Mail
         }
 
         if (empty($type)) {
-            require_once dirname(__FILE__) . '/Magic.php';
             $type = Horde_Mime_Magic::filenameToMime($file, false);
         }
 
index 54ecc9a..fe8abc8 100644 (file)
@@ -69,8 +69,6 @@ class Horde_Mime_Mdn
             return true;
         }
 
-        require_once dirname(__FILE__) . '/Address.php';
-
         /* RFC 3798 [2.1]: Explicit confirmation is needed if there is more
          * than one distinct address in the Disposition-Notification-To
          * header. */
@@ -145,8 +143,6 @@ class Horde_Mime_Mdn
                              $mailparams = array(), $mod = array(),
                              $err = array())
     {
-        require_once dirname(__FILE__) . '/Headers.php';
-        require_once dirname(__FILE__) . '/Part.php';
         require_once 'Horde/Identity.php';
         require_once 'Horde/Text.php';
 
index dc9c56a..707cdac 100644 (file)
@@ -1,7 +1,6 @@
 <?php
 
 require_once 'Horde/String.php';
-require_once dirname(__FILE__) . '/../Mime.php';
 
 /**
  * The Horde_Mime_Part:: class provides a wrapper around MIME parts and
index 997b5a6..d395902 100644 (file)
@@ -127,7 +127,6 @@ class Horde_Mime_Viewer
         if (($app != 'horde') && empty(self::$_config['mime_drivers'][$app])) {
             $res = Horde::loadConfiguration('mime_drivers.php', array('mime_drivers', 'mime_drivers_map'), $app);
             if (!is_a($res, 'PEAR_Error')) {
-                require_once 'Horde/Array.php';
                 self::$_config = Horde_Array::array_merge_recursive_overwrite(self::$_config, $res);
             }
         }
@@ -215,12 +214,12 @@ class Horde_Mime_Viewer
     static final protected function _resolveDriver($driver = 'default',
                                                    $app = 'horde')
     {
+        $driver = ucfirst($driver);
+
         $file = ($app == 'horde')
             ? dirname(__FILE__) . '/Viewer/' . $driver . '.php'
             : $GLOBALS['registry']->applications[$app]['fileroot'] . '/lib/Mime/Viewer/' . $driver . '.php';
 
-        require_once dirname(__FILE__) . '/Viewer/Driver.php';
-
         return require_once $file;
     }
 
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Audio.php b/framework/Mime/lib/Horde/Mime/Viewer/Audio.php
new file mode 100644 (file)
index 0000000..21ea21e
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Audio class sends audio parts to the browser for
+ * handling by the browser, a plugin, or a helper application.
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Audio extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_mimepart->getContents(),
+                'status' => array(),
+                'type' => $this->_mimepart->getType()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Css.php b/framework/Mime/lib/Horde/Mime/Viewer/Css.php
new file mode 100644 (file)
index 0000000..782a429
--- /dev/null
@@ -0,0 +1,127 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Css class renders CSS source as HTML with an effort
+ * to remove potentially malicious code.
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Css extends Horde_Mime_Viewer_Source
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Attribute preg patterns.
+     *
+     * @var array
+     */
+    protected $_attrPatterns = array(
+        // Attributes
+        '!([-\w]+\s*):!s' => '<span class="attr"">\\1</span>:',
+        // Values
+        '!:(\s*)(.+?)(\s*;)!s' => ':\\1<span class="value">\\2</span><span class="eol">\\3</span>',
+        // URLs
+        '!(url\([\'"]?)(.*?)([\'"]?\))!s' => '<span class="url">\\1<span class="file">\\2</span>\\3</span>',
+        // Colors
+        '!(#[[:xdigit:]]{3,6})!s' => '<span class="color">\\1</span>',
+        // Parentheses
+        '!({|})!s' => '<span class="parentheses">\\1</span>',
+        // Unity
+        '!(em|px|%)\b!s' => '<em>\\1</em>'
+    );
+
+    /**
+     * Handles preg patterns.
+     *
+     * @var array
+     */
+    protected $_handlesPatterns = array(
+        // HTML Tags
+        '!\b(body|h\d|a|span|div|acronym|small|strong|em|pre|ul|ol|li|p)\b!s' => '<span class="htag">\\1</span>\\2',
+        // IDs
+        '!(#[-\w]+)!s' => '<span class="id">\\1</span>',
+        // Class
+        '!(\.[-\w]+)\b!s' => '<span class="class">\\1</span>',
+        // METAs
+        '!(:link|:visited|:hover|:active|:first-letter)!s' => '<span class="metac">\\1</span>'
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_renderInline();
+
+        // Need Horde headers for CSS tags.
+        reset($ret);
+        $ret[key($ret)]['data'] =  Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+            $ret[key($ret)]['data'] .
+            Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        $css = preg_replace_callback('!(}|\*/).*?({|/\*)!s', array($this, '_handles'), htmlspecialchars($this->_mimepart->getContents(), ENT_NOQUOTES));
+        $css = preg_replace_callback('!{[^}]*}!s', array($this, '_attributes'), $css);
+        $css = preg_replace_callback('!/\*.*?\*/!s', array($this, '_comments'), $css);
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_lineNumber(trim($css)),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * TODO
+     */
+    protected function _comments($matches)
+    {
+        return '<span class="comment">' .
+            preg_replace('!(http://[/\w-.]+)!s', '<a href="\\1">\\1</a>', $matches[0]) .
+            '</span>';
+    }
+
+    /**
+     * TODO
+     */
+    protected function _attributes($matches)
+    {
+        return preg_replace(array_keys($this->_attrPatterns), array_values($this->_attrPatterns), $matches[0]);
+    }
+
+    /**
+     * TODO
+     */
+    protected function _handles($matches)
+    {
+        return preg_replace(array_keys($this->_handlesPatterns), array_values($this->_handlesPatterns), $matches[0]);
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Deb.php b/framework/Mime/lib/Horde/Mime/Viewer/Deb.php
new file mode 100644 (file)
index 0000000..59b61d7
--- /dev/null
@@ -0,0 +1,75 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Deb class renders out lists of files in Debian
+ * packages by using the dpkg tool to query the package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Deb extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => true,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_renderInline();
+        if (!empty($ret)) {
+            reset($ret);
+            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+        }
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        $tmp_deb = Horde::getTempFile('horde_deb');
+
+        file_put_contents($tmp_deb, $this->_mimepart->getContents());
+
+        $fh = popen($this->_conf['location'] . " -f $tmp_deb 2>&1", 'r');
+        while (($rc = fgets($fh, 8192))) {
+            $data .= $rc;
+        }
+        pclose($fh);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => '<pre>' . htmlspecialchars($data) . '</pre>',
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Default.php b/framework/Mime/lib/Horde/Mime/Viewer/Default.php
new file mode 100644 (file)
index 0000000..64b7421
--- /dev/null
@@ -0,0 +1,15 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Default class simply prints out the encapsulated
+ * content.  It exists as a fallback if no other intelligent rendering
+ * mechanism could be used.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Default extends Horde_Mime_Viewer_Driver {}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Enriched.php b/framework/Mime/lib/Horde/Mime/Viewer/Enriched.php
new file mode 100644 (file)
index 0000000..aadc370
--- /dev/null
@@ -0,0 +1,198 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Enriched class renders out plain text from enriched
+ * content tags, ala RFC 1896.
+ *
+ * By RFC, we must do the minimal conformance measures of: A minimal
+ * text/enriched implementation is one that converts "<<" to "<",
+ * removes everything between a <param> command and the next balancing
+ * </param> removes all other formatting commands (all text enclosed
+ * in angle brackets), and outside of <nofill> environments converts
+ * any series of n CRLFs to n-1 CRLFs, and converts any lone CRLF
+ * pairs to SPACE.
+ *
+ * We don't qualify as we don't currently track the <nofill>
+ * environment, that is we do CRLF conversion even if <nofill> is
+ * specified in the text, but we're close at least.
+ *
+ * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Eric Rostetter <eric.rostetter@physics.utexas.edu>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Enriched extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * This driver's capabilities.
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => '<html><body>' . $this->_toHTML() . '</body></html>',
+                'status' => array(),
+                'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
+            )
+        );
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Convert the enriched text to HTML.
+     *
+     * @return string  The HTML-ified version of the MIME part contents.
+     */
+    protected function _toHTML()
+    {
+        $text = trim($this->_mimepart->getContents());
+        if (!strlen($text)) {
+            return array();
+        }
+
+        // We add space at the beginning and end of the string as it will
+        // make some regular expression checks later much easier (so we
+        // don't have to worry about start/end of line characters)
+        $text = ' ' . $text . ' ';
+
+        // We need to preserve << tags, so map them to ascii 1 or ascii 255
+        // We make the assumption here that there would never be an ascii
+        // 1 in an email, which may not be valid, but seems reasonable...
+        // ascii 255 would work if for some reason you don't like ascii 1
+        // ascii 0 does NOT seem to work for this, though I'm not sure why
+        $text = str_replace('<<', chr(1), $text);
+
+        // Remove any unrecognized tags in the text (via RFC minimal specs)
+        // any tags we just don't want to implement can also be removed here
+        // Note that this will remove any html links, but this is intended
+        $implementedTags = '<param><bold><italic><underline><fixed><excerpt>' .
+                           '<smaller><bigger><center><color><fontfamily>' .
+                           '<flushleft><flushright><flushboth><paraindent>';
+        // $unImplementedTags = '<nofill><lang>';
+        $text = strip_tags($text, $implementedTags);
+
+        // restore the << tags as < tags now...
+        $text = str_replace(chr(1), '<<', $text);
+        // $text = str_replace(chr(255), '<', $text);
+
+        $replace = array(
+            // Get color parameters into a more useable format.
+            '/<color><param>([\da-fA-F]+),([\da-fA-F]+),([\da-fA-F]+)<\/param>/Uis' => '<color r=\1 g=\2 b=\3>',
+            '/<color><param>(red|blue|green|yellow|cyan|magenta|black|white)<\/param>/Uis' => '<color n=\1>',
+
+            // Get font family parameters into a more useable format.
+            '/<fontfamily><param>(\w+)<\/param>/Uis' => '<fontfamily f=\1>',
+
+            /* Just remove any remaining parameters -- we won't use them.
+             * Any tags with parameters that we want to implement will have
+             * come before this. Someday we hope to use these tags (e.g. for
+             * <color><param> tags). */
+            '/<param>.*<\/param>/Uis' => '',
+
+            /* Single line breaks become spaces, double line breaks are a
+             * real break. This needs to do <nofill> tracking to be compliant
+             * but we don't want to deal with state at this time, so we fake
+             * it some day we should rewrite this to handle <nofill>
+             * correctly. */
+            '/([^\n])\r\n([^\r])/' => '\1 \2',
+            '/(\r\n)\r\n/' => '\1'
+        );
+        $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+        // We try to protect against bad stuff here.
+        $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
+
+        // Now convert the known tags to html. Try to remove any tag
+        // parameters to stop people from trying to pull a fast one
+        $replace = array(
+            '/(?<!&lt;)&lt;bold.*&gt;(.*)&lt;\/bold&gt;/Uis' => '<span style="font-weight: bold">\1</span>',
+            '/(?<!&lt;)&lt;italic.*&gt;(.*)&lt;\/italic&gt;/Uis' => '<span style="font-style: italic">\1</span>',
+            '/(?<!&lt;)&lt;underline.*&gt;(.*)&lt;\/underline&gt;/Uis' => '<span style="text-decoration: underline">\1</span>'
+        );
+        $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+        $text = preg_replace_callback('/(?<!&lt;)&lt;color r=([\da-fA-F]+) g=([\da-fA-F]+) b=([\da-fA-F]+)&gt;(.*)&lt;\/color&gt;/Uis', array($this, 'colorize'), $text);
+
+        $replace = array(
+            '/(?<!&lt;)&lt;color n=(red|blue|green|yellow|cyan|magenta|black|white)&gt;(.*)&lt;\/color&gt;/Uis' => '<span style="color: \1">\2</span>',
+            '/(?<!&lt;)&lt;fontfamily&gt;(.*)&lt;\/fontfamily&gt;/Uis' => '\1',
+            '/(?<!&lt;)&lt;fontfamily f=(\w+)&gt;(.*)&lt;\/fontfamily&gt;/Uis' => '<span style="font-family: \1">\2</span>',
+            '/(?<!&lt;)&lt;smaller.*&gt;/Uis' => '<span style="font-size: smaller">',
+            '/(?<!&lt;)&lt;\/smaller&gt;/Uis' => '</span>',
+            '/(?<!&lt;)&lt;bigger.*&gt;/Uis' => '<span style="font-size: larger">',
+            '/(?<!&lt;)&lt;\/bigger&gt;/Uis' => '</span>',
+            '/(?<!&lt;)&lt;fixed.*&gt;(.*)&lt;\/fixed&gt;/Uis' => '<font face="fixed">\1</font>',
+            '/(?<!&lt;)&lt;center.*&gt;(.*)&lt;\/center&gt;/Uis' => '<div align="center">\1</div>',
+            '/(?<!&lt;)&lt;flushleft.*&gt;(.*)&lt;\/flushleft&gt;/Uis' => '<div align="left">\1</div>',
+            '/(?<!&lt;)&lt;flushright.*&gt;(.*)&lt;\/flushright&gt;/Uis' => '<div align="right">\1</div>',
+            '/(?<!&lt;)&lt;flushboth.*&gt;(.*)&lt;\/flushboth&gt;/Uis' => '<div align="justify">\1</div>',
+            '/(?<!&lt;)&lt;paraindent.*&gt;(.*)&lt;\/paraindent&gt;/Uis' => '<blockquote>\1</blockquote>',
+            '/(?<!&lt;)&lt;excerpt.*&gt;(.*)&lt;\/excerpt&gt;/Uis' => '<blockquote>\1</blockquote>'
+        );
+        $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+        // Replace << with < now (from translated HTML form).
+        $text = str_replace('&lt;&lt;', '&lt;', $text);
+
+        // Now we remove the leading/trailing space we added at the
+        // start.
+        $text = preg_replace('/^ (.*) $/s', '\1', $text);
+
+        // Make URLs clickable.
+        require_once 'Horde/Text/Filter.php';
+        $text = Text_Filter::filter($text, 'linkurls', array('callback' => 'Horde::externalUrl'));
+
+        /* Wordwrap -- note this could impact on our above RFC compliance *IF*
+         * we honored nofill tags (which we don't yet). */
+        $text = str_replace(array("\t", '  ', "\n "), array('        ', ' &nbsp;', "\n&nbsp;"), $text);
+
+        if ($text[0] == ' ') {
+            $text = '&nbsp;' . substr($text, 1);
+        }
+
+        return '<p class="fixed">' . nl2br($text) . '</p>';
+    }
+
+    /**
+     * TODO
+     */
+    public function colorize($colors)
+    {
+        for ($i = 1; $i < 4; $i++) {
+            $colors[$i] = sprintf('%02X', round(hexdec($colors[$i]) / 255));
+        }
+        return '<span style="color: #' . $colors[1] . $colors[2] . $colors[3] . '">' . $colors[4] . '</span>';
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Enscript.php b/framework/Mime/lib/Horde/Mime/Viewer/Enscript.php
new file mode 100644 (file)
index 0000000..e8df9e2
--- /dev/null
@@ -0,0 +1,164 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Enscript class renders out various content in HTML
+ * format by using GNU Enscript.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Enscript extends Horde_Mime_Viewer_Source
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_toHTML(false),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_toHTML(true),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Converts the code to HTML.
+     *
+     * @param boolean $inline  Is this an inline display?
+     *
+     * @return string  The HTML-ified version of the MIME part contents.
+     */
+    protected function _toHTML($inline)
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        /* Create temporary files for input to Enscript. Note that we can't
+         * use a pipe, since enscript must have access to the whole file to
+         * determine its type for coloured syntax highlighting. */
+        $tmpin = Horde::getTempFile('enscriptin');
+
+        /* Write the contents of our buffer to the temporary input file. */
+        file_put_contents($tmpin, $this->_mimepart->getContents());
+
+        /* Execute the enscript command. */
+        $lang = escapeshellarg($this->_typeToLang($this->_mimepart->getType()));
+        $results = shell_exec($this->_conf['location'] . " -E$lang --language=html --color --output=- < $tmpin");
+
+        /* Strip out the extraneous HTML from enscript. */
+        if ($inline) {
+            $res_arr = preg_split('/\<\/?pre\>/i', $results);
+            if (count($res_arr) == 3) {
+                $results = trim($res_arr[1]);
+            }
+        }
+
+        return $this->_lineNumber($results);
+    }
+
+    /**
+     * Attempts to determine what language to use for the enscript program
+     * from a MIME type.
+     *
+     * @param string $type  The MIME type.
+     *
+     * @return string  The enscript 'language' parameter string.
+     */
+    protected function _typeToLang($type)
+    {
+        $ext = Horde_Mime_Magic::MIMEToExt($type);
+
+        switch ($ext) {
+        case 'cs':
+            return 'java';
+
+        case 'el':
+            return 'elisp';
+
+        case 'h':
+            return 'c';
+
+        case 'C':
+        case 'H':
+        case 'cc':
+        case 'hh':
+        case 'c++':
+        case 'cxx':
+        case 'cpp':
+            return 'cpp';
+
+        case 'htm':
+        case 'shtml':
+        case 'xml':
+            return 'html';
+
+        case 'js':
+            return 'javascript';
+
+        case 'pas':
+            return 'pascal';
+
+        case 'al':
+        case 'cgi':
+        case 'pl':
+        case 'pm':
+            return 'perl';
+
+        case 'ps':
+            return 'postscript';
+
+        case 'vb':
+            return 'vba';
+
+        case 'vhd':
+            return 'vhdl';
+
+        case 'patch':
+        case 'diff':
+            return 'diffu';
+
+        default:
+            return $ext;
+        }
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Html.php b/framework/Mime/lib/Horde/Mime/Viewer/Html.php
new file mode 100644 (file)
index 0000000..acc3127
--- /dev/null
@@ -0,0 +1,197 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Html class renders out HTML text with an effort to
+ * remove potentially malicious code.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @author  Jon Parise <jon@horde.org>
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_html extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $html = $this->_cleanHTML($this->_mimepart->getContents(), false);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $html['html'],
+                'status' => array(),
+                'type' => $this->_mimepart->getType(true)
+            )
+        );
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        $html = $this->_cleanHTML($this->_mimepart->getContents(), true);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => String::convertCharset($html['data'], $this->_mimepart->getCharset()),
+                'status' => $html['status'],
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Filters active content, dereferences external links, detects phishing,
+     * etc.
+     *
+     * @todo Use IP checks from
+     * http://lxr.mozilla.org/mailnews/source/mail/base/content/phishingDetector.js.
+     *
+     * @param string $data     The HTML data.
+     * @param boolean $inline  Are we viewing inline?
+     *
+     * @return array  Two elements: 'html' and 'status'.
+     */
+    protected function _cleanHTML($data, $inline)
+    {
+        global $browser;
+
+        $phish_warn = false;
+
+        /* Deal with <base> tags in the HTML, since they will screw up our own
+         * relative paths. */
+        if (preg_match('/<base href="?([^"> ]*)"? ?\/?>/i', $data, $matches)) {
+            $base = $matches[1];
+            if (substr($base, -1) != '/') {
+                $base .= '/';
+            }
+
+            /* Recursively call _cleanHTML() to prevent clever fiends from
+             * sneaking nasty things into the page via $base. */
+            $base = $this->_cleanHTML($base, $inline);
+
+            /* Attempt to fix paths that were relying on a <base> tag. */
+            if (!empty($base)) {
+                $pattern = array('|src=(["\'])([^:"\']+)\1|i',
+                                 '|src=([^: >"\']+)|i',
+                                 '|href= *(["\'])([^:"\']+)\1|i',
+                                 '|href=([^: >"\']+)|i');
+                $replace = array('src=\1' . $base . '\2\1',
+                                 'src=' . $base . '\1',
+                                 'href=\1' . $base . '\2\1',
+                                 'href=' . $base . '\1');
+                $data = preg_replace($pattern, $replace, $data);
+            }
+        }
+
+        require_once 'Horde/Text/Filter.php';
+        $strip_style_attributes = (($browser->isBrowser('mozilla') &&
+                                    $browser->getMajor() == 4) ||
+                                   $browser->isBrowser('msie'));
+        $strip_styles = $inline || $strip_style_attributes;
+        $data = Text_Filter::filter($data, 'xss',
+                                    array('body_only' => $inline,
+                                          'strip_styles' => $strip_styles,
+                                          'strip_style_attributes' => $strip_style_attributes));
+
+        /* Check for phishing exploits. */
+        if ($this->getConfigParam('phishing_check')) {
+            if (preg_match('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:[^>]*>\s*(?:\\1:\/\/)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[^<]*<\/a)?/i', $data, $m)) {
+                /* Check 1: Check for IP address links, but ignore if the link
+                 * text has the same IP address. */
+                if (!isset($m[3]) || ($m[2] != $m[3])) {
+                    if (isset($m[3])) {
+                        $data = preg_replace('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/' . preg_quote($m[2], '/') . '(?:[^>]*>\s*(?:$1:\/\/)?' . preg_quote($m[3], '/') . '[^<]*<\/a)?/i', 'class="mimeStatusWarning" $0', $data);
+                    }
+                    $phish_warn = true;
+                }
+            } elseif (preg_match_all('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/([^\s"\'>]+)["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?(.*?)<\/a/is', $data, $m)) {
+                /* $m[1] = Link; $m[2] = Target
+                 * Check 2: Check for links that point to a different host than
+                 * the target url; if target looks like a domain name, check it
+                 * against the link. */
+                for ($i = 0, $links = count($m[0]); $i < $links; ++$i) {
+                    $link = strtolower(urldecode($m[1][$i]));
+                    $target = strtolower(preg_replace('/^(http|https|ftp):\/\//', '', strip_tags($m[2][$i])));
+                    if (preg_match('/^[-._\da-z]+\.[a-z]{2,}/i', $target) &&
+                        (strpos($link, $target) !== 0) &&
+                        (strpos($target, $link) !== 0)) {
+                        /* Don't consider the link a phishing link if the
+                         * domain is the same on both links (e.g.
+                         * adtracking.example.com & www.example.com). */
+                        preg_match('/\.?([^\.\/]+\.[^\.\/]+)[\/?]/', $link, $host1);
+                        preg_match('/\.?([^\.\/]+\.[^\.\/ ]+)([\/ ].*)?$/', $target, $host2);
+                        if (!(count($host1) && count($host2)) ||
+                            (strcasecmp($host1[1], $host2[1]) !== 0)) {
+                            $data = preg_replace('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/' . preg_quote($m[1][$i], '/') . '["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?' . preg_quote($m[2][$i], '/') . '<\/a/is', 'class="mimeStatusWarning" $0', $data);
+                            $phish_warn = true;
+                        }
+                    }
+                }
+            }
+        }
+
+        /* Try to derefer all external references. */
+        $data = preg_replace_callback('/href\s*=\s*(["\'])?((?(1)[^\1]*?|[^\s>]+))(?(1)\1|)/i', array($this, '_dereferCallback'), $data);
+
+        /* Get phishing warning. */
+        $status = array();
+        if ($inline && $phish_warn) {
+            $warning = array(
+                sprintf(_("%s: This message may not be from whom it claims to be. Beware of following any links in it or of providing the sender with any personal information."), _("Warning")),
+                _("The links that caused this warning have this background color:") . ' <span class="mimeStatusWarning">' . _("EXAMPLE") . '.</span>'
+            );
+
+            if (!$inline) {
+                $temp = array();
+                foreach ($phish_warning as $val) {
+                    $temp[] = String::convertCharset($val, NLS::getCharset(), $this->_mimepart->getCharset());
+                }
+                $warning = $temp;
+            }
+
+            $status[] = array(
+                'class' => 'mimestatuswarning',
+                'text' => $warning
+            );
+        }
+
+        return array('html' => $data, 'status' => $status);
+    }
+
+    /**
+     * TODO
+     *
+     * @param string $m  TODO
+     *
+     * @return string  TODO
+     */
+    protected function _dereferCallback($m)
+    {
+        return 'href="' . Horde::externalUrl($m[2]) . '"';
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Images.php b/framework/Mime/lib/Horde/Mime/Viewer/Images.php
new file mode 100644 (file)
index 0000000..085c2d4
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Images class allows images to be displayed.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Images extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_mimepart->getContents(),
+                'status' => array(),
+                'type' => $this->_getType()
+            )
+        );
+    }
+
+    /**
+     * Return the content-type to use for the image.
+     *
+     * @return string  The content-type of the image.
+     */
+    protected function _getType()
+    {
+        $type = $this->_mimepart->getType();
+
+        switch ($type) {
+        case 'image/pjpeg':
+            /* image/jpeg and image/pjpeg *appear* to be the same entity, but
+             * Mozilla (for one) don't seem to want to accept the latter. */
+            return 'image/jpeg';
+
+        case 'image/x-png':
+            /* image/x-png == image/png. */
+            return 'image/png';
+
+        default:
+            return $type;
+        }
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Msexcel.php b/framework/Mime/lib/Horde/Mime/Viewer/Msexcel.php
new file mode 100644 (file)
index 0000000..6aab1e7
--- /dev/null
@@ -0,0 +1,58 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Msexcel class renders out Microsoft Excel
+ * documents in HTML format by using the Gnumeric package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Msexcel extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        $tmp_xls = Horde::getTempFile('horde_msexcel');
+        $tmp_out = Horde::getTempFile('horde_msexcel');
+
+        file_put_contents($tmp_xls, $this->_mimepart->getContents());
+        $args = ' -E Gnumeric_Excel:excel_dsf -T Gnumeric_html:html40 ' . $tmp_xls . ' ' . $tmp_out;
+
+        exec($this->_conf['location'] . $args);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => file_get_contents($tmp_out),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Mspowerpoint.php b/framework/Mime/lib/Horde/Mime/Viewer/Mspowerpoint.php
new file mode 100644 (file)
index 0000000..31144b6
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Mspowerpoint class renders out Microsoft Powerpoint
+ * documents in HTML format by using the xlHtml package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Mspowerpoint extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        $data = '';
+        $tmp_ppt = Horde::getTempFile('horde_mspowerpoint');
+
+        file_put_contents($tmp_ppt, $this->_mimepart->getContents());
+
+        $fh = popen($this->_conf['location'] . " $tmp_ppt 2>&1", 'r');
+        while (($rc = fgets($fh, 8192))) {
+            $data .= $rc;
+        }
+        pclose($fh);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $data,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Msword.php b/framework/Mime/lib/Horde/Mime/Viewer/Msword.php
new file mode 100644 (file)
index 0000000..5a17a71
--- /dev/null
@@ -0,0 +1,67 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Msword class renders out Microsoft Word documents
+ * in HTML format by using the AbiWord package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Msword extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        $tmp_word = Horde::getTempFile('msword');
+        $tmp_output = Horde::getTempFile('msword');
+        $tmp_file = str_replace(Horde::getTempDir() . '/', '', $tmp_output);
+
+        file_put_contents($tmp_word, $this->_mimepart->getContents());
+        $args = ' --to=html --to-name=' . $tmp_output . ' ' . $tmp_word;
+
+        exec($this->_conf['location'] . $args);
+
+        if (file_exists($tmp_output)) {
+            $data = file_get_contents($tmp_output);
+            $type = 'text/html';
+        } else {
+            $data = _("Unable to translate this Word document");
+            $type = 'text/plain';
+        }
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $data,
+                'status' => array(),
+                'type' => $type . '; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo.php b/framework/Mime/lib/Horde/Mime/Viewer/Ooo.php
new file mode 100644 (file)
index 0000000..bd14885
--- /dev/null
@@ -0,0 +1,115 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Ooo class renders out OpenOffice.org documents in
+ * HTML format.
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Marko Djukic <marko@oblo.com>
+ * @author  Jan Schneider <jan@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Ooo extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $has_xslt = Util::extensionExists('xslt');
+        $has_ssfile = function_exists('domxml_xslt_stylesheet_file');
+        if (($use_xslt = $has_xslt || $has_ssfile)) {
+            $tmpdir = Util::createTempDir(true);
+        }
+
+        $fnames = array('content.xml', 'styles.xml', 'meta.xml');
+        $tags = array(
+            'text:p' => 'p',
+            'table:table' => 'table border="0" cellspacing="1" cellpadding="0" ',
+            'table:table-row' => 'tr bgcolor="#cccccc"',
+            'table:table-cell' => 'td',
+            'table:number-columns-spanned=' => 'colspan='
+        );
+
+        $zip = &Horde_Compress::singleton('zip');
+        $list = $zip->decompress($this->_mimepart->getContents(), array('action' => HORDE_COMPRESS_ZIP_LIST));
+
+        foreach ($list as $key => $file) {
+            if (in_array($file['name'], $fnames)) {
+                $content = $zip->decompress($this->_mimepart->getContents(), array(
+                    'action' => HORDE_COMPRESS_ZIP_DATA,
+                    'info' => $list,
+                    'key' => $key
+                ));
+
+                if ($use_xslt) {
+                    file_put_contents($tmpdir . $file['name'], $content);
+                } elseif ($file['name'] == 'content.xml') {
+                    return array(
+                        $this->_mimepart->getMimeId() => array(
+                            'data' => str_replace(array_keys($tags), array_values($tags), $content),
+                            'status' => array(),
+                            'type' => 'text/html; charset=UTF-8'
+                        )
+                    );
+                }
+            }
+        }
+
+        if (!Util::extensionExists('xslt')) {
+            return array();
+        }
+
+        $xsl_file = dirname(__FILE__) . '/Ooo/main_html.xsl';
+
+        if ($has_ssfile) {
+            /* Use DOMXML */
+            $xslt = domxml_xslt_stylesheet_file($xsl_file);
+            $dom  = domxml_open_file($tmpdir . 'content.xml');
+            $result = @$xslt->process($dom, array(
+                'metaFileURL' => $tmpdir . 'meta.xml',
+                'stylesFileURL' => $tmpdir . 'styles.xml',
+                'disableJava' => true)
+            );
+            $result = $xslt->result_dump_mem($result);
+        } else {
+            // Use XSLT
+            $xslt = xslt_create();
+            $result = @xslt_process($xslt, $tmpdir . 'content.xml', $xsl_file, null, null, array(
+                'metaFileURL' => $tmpdir . 'meta.xml',
+                'stylesFileURL' => $tmpdir . 'styles.xml',
+                'disableJava' => true)
+            );
+            if (!$result) {
+                $result = xslt_error($xslt);
+            }
+            xslt_free($xslt);
+        }
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $result,
+                'status' => array(),
+                'type' => 'text/html; charset=UTF-8'
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/common.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/common.xsl
new file mode 100644 (file)
index 0000000..943a5b9
--- /dev/null
@@ -0,0 +1,1165 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                extension-element-prefixes="xt"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+
+    <!-- ************ -->
+    <!-- *** body *** -->
+    <!-- ************ -->
+
+
+    <xsl:template match="/*/office:body">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!-- isDebugMode-START: only isDebugMode purpose: shows the inlined style attributes of the temporary variable -->
+        <xsl:if test="$isDebugMode and not($outputType = 'CSS_HEADER')">
+            <xsl:element name="debug_tree_of_styles"><xsl:text>
+            </xsl:text><xsl:for-each select="$collectedGlobalData/allstyles/*">
+<xsl:text>                      </xsl:text><xsl:value-of select="name()"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
+            </xsl:text>
+                    </xsl:for-each>
+            </xsl:element>
+        </xsl:if>
+    <!-- isDebugMode-END -->
+
+
+               <!-- not using of 'apply-styles-and-content' as the content table information migth have been added to 'collectedGlobalData' variable -->
+        <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+
+
+        <!-- Usability feature, a link to the Content talbe above all level 1 header -->
+        <xsl:if test="$contentTableHeadings">
+            <xsl:call-template name="add-child-document-usability-links"/>
+        </xsl:if>
+
+
+               <xsl:choose>
+               <xsl:when test="not($outputType = 'WML') and not($outputType = 'PALM')">
+                       <xsl:choose>
+                               <!--If the input document is a global document and embed child documents (links) the transformation of the children will be started as well.
+                                   This is necessary as child documents do not know anything about their embedding into a global document. Chapters of childs
+                                   always start to count by zero instead of continously numbering.
+                                   For this, the chapter numbers of the current document (as a sequence of a global document) is dependent
+                                   of the number of chapter of the same level in preceding documents.
+                                   In case of multiple children, for usability reasons some linking is gonna be offered and the URLs of the content-table,
+                                   preceding and following file have to be given for the transformation.
+                                   -->
+                           <xsl:when test="/*/@office:class='text-global' and /*/office:body/text:section/text:section-source/@xlink:href">
+                                               <!-- the children will be called later with a modified 'collectedGlobalData' variable -->
+                               <xsl:call-template name="transform-global-document-and-children">
+                                   <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                               </xsl:call-template>
+                           </xsl:when>
+                                       <xsl:otherwise>
+                                       <xsl:apply-templates>
+                                           <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                       </xsl:apply-templates>
+                                       </xsl:otherwise>
+                               </xsl:choose>
+               </xsl:when>
+                       <xsl:otherwise>
+                       <xsl:apply-templates>
+                           <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                       </xsl:apply-templates>
+                       </xsl:otherwise>
+               </xsl:choose>
+
+
+
+        <!-- Usability feature, a link to the Content talbe above all level 1 header -->
+        <xsl:if test="$contentTableHeadings">
+            <xsl:call-template name="add-child-document-usability-links"/>
+        </xsl:if>
+
+
+    </xsl:template>
+
+
+
+
+    <!-- deactivating default template -->
+    <xsl:template match="*"/>
+
+
+    <!-- allowing all matched text nodes -->
+    <xsl:template match="text()">
+<!-- WML         <xsl:value-of select="normalize-space(.)"/> -->
+        <xsl:value-of select="."/>
+    </xsl:template>
+
+
+
+    <!-- ################### -->
+    <!-- ### INLINE-TEXT ### -->
+    <!-- ################### -->
+
+
+    <!-- ****************** -->
+    <!-- *** Whitespace *** -->
+    <!-- ****************** -->
+
+
+    <xsl:template match="text:s">
+        <xsl:call-template name="write-breakable-whitespace">
+            <xsl:with-param name="whitespaces" select="@text:c"/>
+        </xsl:call-template>
+    </xsl:template>
+
+
+    <!--write the number of 'whitespaces' -->
+    <xsl:template name="write-breakable-whitespace">
+        <xsl:param name="whitespaces"/>
+
+        <!--write two space chars as the normal white space character will be stripped
+            and the other is able to break -->
+        <xsl:text>&#160;</xsl:text>
+        <xsl:if test="$whitespaces >= 2">
+            <xsl:call-template name="write-breakable-whitespace-2">
+                <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>
+
+
+    <!--write the number of 'whitespaces' -->
+    <xsl:template name="write-breakable-whitespace-2">
+        <xsl:param name="whitespaces"/>
+        <!--write two space chars as the normal white space character will be stripped
+            and the other is able to break -->
+        <xsl:text> </xsl:text>
+        <xsl:if test="$whitespaces >= 2">
+            <xsl:call-template name="write-breakable-whitespace">
+                <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>
+
+
+
+
+    <!-- *************** -->
+    <!-- *** Textbox *** -->
+    <!-- *************** -->
+
+    <xsl:template match="draw:text-box">
+        <xsl:param name="collectedGlobalData"/>
+
+            <xsl:choose>
+                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+                <!--                or                  -->
+                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
+                    <xsl:element name="span">
+                        <xsl:if test="@fo:min-height | @svg:width">
+                            <xsl:attribute name="style">
+                                <xsl:choose>
+                                    <xsl:when test="not(@svg:width)">
+                                        <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
+                                    </xsl:when>
+                                    <xsl:when test="not(@fo:min-height)">
+                                        <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
+                                        <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:attribute>
+                        </xsl:if>
+                        <xsl:apply-templates select="@draw:name"/>
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!-- 2DO prove best usage for PALM -->
+                <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'PALM'">
+                    <xsl:element name="span">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!-- 2DO prove best usage for WML -->
+                <!--+++++ WML / WAP  +++++-->
+                <xsl:otherwise>
+                    <!-- no nested p tags in wml1.1 allowed -->
+                    <xsl:choose>
+                        <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                            <xsl:call-template name="apply-styles-and-content">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:call-template>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:element name="p">
+                                <xsl:call-template name="apply-styles-and-content">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                             </xsl:element>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:otherwise>
+            </xsl:choose>
+    </xsl:template>
+
+    <!-- ID / NAME of text-box -->
+    <xsl:template match="@draw:name">
+
+        <xsl:attribute name="id">
+            <xsl:value-of select="."/>
+        </xsl:attribute>
+    </xsl:template>
+
+
+
+    <!-- ****************** -->
+    <!-- *** Paragraphs *** -->
+    <!-- ****************** -->
+
+    <xsl:template match="text:p | draw:page">
+        <xsl:param name="collectedGlobalData"/>
+
+            <xsl:choose>
+                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+                <xsl:when test="$outputType = 'CSS_HEADER'">
+                    <xsl:element name="p">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+
+                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'CSS_INLINED'">
+                    <xsl:element name="p">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'PALM'">
+                    <xsl:choose>
+                        <!-- in palm paragraphs children of text:list-items are better shown without 'p' tag-->
+                        <xsl:when test="name(parent::*) = 'text:list-item'">
+                            <xsl:call-template name="apply-styles-and-content">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:call-template>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:element name="p">
+                                <xsl:call-template name="apply-styles-and-content">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:element>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:when>
+                <!--+++++ WML / WAP  +++++-->
+                <xsl:otherwise>
+                    <!-- no nested p tags in wml1.1 allowed -->
+                    <xsl:choose>
+                        <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                            <xsl:call-template name="apply-styles-and-content">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:call-template>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:element name="p">
+                                <xsl:call-template name="apply-styles-and-content">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                             </xsl:element>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:otherwise>
+            </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- ***************** -->
+    <!-- *** Text Span *** -->
+    <!-- ***************** -->
+
+    <xsl:template match="text:span">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER'">
+                <xsl:element name="span">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'CSS_INLINED'">
+                <xsl:element name="span">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+            <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'PALM'">
+                <xsl:call-template name="apply-styles-and-content">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+            <!--+++++ WML / WAP  +++++-->
+            <xsl:otherwise>
+                <!-- no nested p tags in wml1.1 allowed -->
+                <xsl:choose>
+                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:element name="p">
+                            <xsl:call-template name="apply-styles-and-content">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:call-template>
+                        </xsl:element>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- **************** -->
+    <!-- *** Headings *** -->
+    <!-- **************** -->
+
+    <xsl:template match="text:h">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!-- Every heading element will get an unique anchor for its file, from its hiearchy level and name:
+            For example:  The heading title 'My favorite heading' might get <a name="1+2+2+My+favorite+heading"/> -->
+        <xsl:choose>
+            <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
+            <!-- The URL linking of an table-of-content is due to a bug (cmp. bug id# 102311) not mapped as URL in the XML.
+                 Linking of the table-of-content can therefore only be archieved by a work-around in HTML -->
+                <xsl:call-template name="create-heading">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+           </xsl:when>
+           <xsl:otherwise>
+                <!-- necessary as anchor for the content table -->
+                <xsl:call-template name="create-heading-anchor">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+
+                <!-- no embedding the orginal header, as an explicit anchor might be already set -->
+                <xsl:call-template name="create-heading">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- default matching for header elements -->
+    <xsl:template name="create-heading">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER'">
+
+                <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
+                <xsl:element name="{$headertyp}">
+
+                    <!-- outline style 'text:min-label-width' is interpreted as a CSS 'margin-left' attribute -->
+                    <xsl:variable name="min-label" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/style:properties/@text:min-label-width"/>
+                    <xsl:if test="$min-label">
+                        <xsl:attribute name="style"><xsl:text>margin-left:</xsl:text><xsl:value-of select="$min-label"/><xsl:text>;</xsl:text></xsl:attribute>
+                    </xsl:if>
+
+
+                    <xsl:attribute name="class"><xsl:value-of select="translate(@text:style-name, '. %()/\', '')"/></xsl:attribute>
+
+                    <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
+                    <xsl:if test="string-length($office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@style:num-format) != 0">
+
+                        <xsl:choose>
+                            <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
+                                <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level',
+                                     furthermore when the current document is referenced by a global document - as part of a whole sequence of documents -,
+                                     the chapter no. is dependent of the amount of started headers in preceding documents.
+                                     If the 'text:start-value is not set the default value of '1' has to be taken. -->
+                                <xsl:variable name="startValue" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
+                                <xsl:choose>
+                                    <xsl:when test="$startValue">
+                                        <xsl:choose>
+                                            <xsl:when test="@text:level='1'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel1
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='2'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel2
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='3'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel3
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='4'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel4
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='5'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel5
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='6'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel6
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='7'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel7
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='8'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel8
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='9'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel9
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='10'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel10
+                                                            + $startValue"/>
+                                            </xsl:when>
+                                        </xsl:choose>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:choose>
+                                            <xsl:when test="@text:level='1'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel1
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='2'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel2
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='3'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel3
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='4'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel4
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='5'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel5
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='6'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel6
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='7'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel7
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='8'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel8
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='9'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel9
+                                                            + 1"/>
+                                            </xsl:when>
+                                            <xsl:when test="@text:level='10'">
+                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                            + $precedingChapterLevel10
+                                                            + 1"/>
+                                            </xsl:when>
+                                        </xsl:choose>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:call-template name="get-absolute-chapter-no">
+                                    <xsl:with-param name="precedingChapterLevel1"    select="$precedingChapterLevel1"/>
+                                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                        <xsl:text> &#160; &#160;</xsl:text>
+                    </xsl:if>
+                    <xsl:apply-templates>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:apply-templates>
+
+                </xsl:element>
+            </xsl:when>
+
+
+            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'CSS_INLINED'">
+                <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
+                <xsl:element name="{$headertyp}">
+
+                    <xsl:apply-templates select="@text:style-name">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:apply-templates>
+
+                    <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
+                    <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
+
+                        <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
+                        <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                            + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
+                        <xsl:text> &#160; &#160;</xsl:text>
+                    </xsl:if>
+
+                </xsl:element>
+            </xsl:when>
+
+            <!-- 2DO: add Chapter No. for PALM and WML <-> problem nested apply-templates -->
+
+            <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'PALM'">
+                <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
+                <xsl:element name="{$headertyp}">
+
+
+                    <!-- All children content have to be nested in the styles (e.g. <i><b>ANY CONTENT</b></i>)
+                         for this xsl:apply-templates will be called later / implicit -->
+                    <xsl:call-template name="create-attribute-ALIGN">
+                        <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
+                        <xsl:with-param name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/@text:style-name]"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ WML / WAP  +++++-->
+            <xsl:otherwise>
+                <!-- no nested p tags in wml1.1 allowed -->
+                <xsl:choose>
+                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                        <!-- since no header styles exist, an emphasis is used -->
+                        <xsl:element name="em">
+
+                            <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
+                            <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
+
+                                <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
+                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
+                                                    + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
+                                <xsl:text> &#160; &#160;</xsl:text>
+                            </xsl:if>
+
+                            <xsl:apply-templates select="@text:style-name">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:apply-templates>
+
+                        </xsl:element>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:element name="p">
+                            <!-- since no header styles exist, an emphasis is used -->
+                            <xsl:element name="em">
+                                <xsl:call-template name="apply-styles-and-content">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:element>
+                        </xsl:element>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- ************* -->
+    <!-- *** Link  *** -->
+    <!-- ************* -->
+
+    <xsl:template match="text:a | draw:a">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:call-template name="create-common-link">
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:call-template>
+    </xsl:template>
+
+
+    <xsl:template name="create-common-link">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <xsl:when test="not($outputType = 'WML')">
+                <xsl:element name="a">
+                    <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                    <!--<xsl:attribute name="class">ContentLink</xsl:attribute>-->
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+            <xsl:otherwise>
+                <!-- no nested p tags in wml1.1 allowed -->
+                <xsl:choose>
+                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                        <xsl:element name="a">
+                            <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                            <xsl:apply-templates select="descendant::text()"/>
+                        </xsl:element>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:element name="p">
+                            <xsl:element name="a">
+                                <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                                <xsl:apply-templates select="descendant::text()"/>
+                            </xsl:element>
+                        </xsl:element>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+
+
+    <!-- ******************* -->
+    <!-- *** Image Link  *** -->
+    <!-- ******************* -->
+
+    <xsl:template match="draw:image">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!-- NO IMAGES SUPPLIED FOR WAP OR PALM -->
+        <xsl:if test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
+
+            <xsl:element name="img">
+                <xsl:if test="@svg:width">
+                    <xsl:attribute name="width">
+                        <xsl:call-template name="convert2pixel">
+                            <xsl:with-param name="value" select="@svg:width"/>
+                        </xsl:call-template>
+                    </xsl:attribute>
+                </xsl:if>
+                <xsl:if test="@svg:height">
+                    <xsl:attribute name="height">
+                        <xsl:call-template name="convert2pixel">
+                            <xsl:with-param name="value" select="@svg:height"/>
+                        </xsl:call-template>
+                    </xsl:attribute>
+                </xsl:if>
+                <xsl:if test="svg:desc">
+                    <xsl:attribute name="alt">
+                        <xsl:value-of select="svg:desc"/>
+                    </xsl:attribute>
+                </xsl:if>
+                <xsl:choose>
+                     <!-- for images jared in open office document -->
+                    <xsl:when test="contains(@xlink:href, '#Pictures/')">
+                        <!-- creating an absolute http URL to the packed image file -->
+                        <xsl:attribute name="src"><xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after(@xlink:href, '#Pictures/'), $optionalURLSuffix)"/></xsl:attribute>
+                    </xsl:when>
+<!--                    Due to a XT bug no DOS ':' before DRIVE letter is allowed, it would result in a unkown protoco exception, but a file URL for a DOS
+                                               path needs the DRIVE letter, therefore all relative URLs remain relativ
+
+                                       <xsl:when test="contains(@xlink:href,'//') or (substring(@xlink:href,2,1) = ':') or starts-with(@xlink:href, '/')">
+                        <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <!~~ creating a absolute path/URL for the referenced resource ~~>
+                        <xsl:attribute name="src"><xsl:value-of select="concat($absoluteSourceDirRef, @xlink:href, $optionalURLSuffix)"/></xsl:attribute>
+                    </xsl:otherwise>
+-->
+                                       <xsl:otherwise>
+                        <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                    </xsl:otherwise>
+                </xsl:choose>
+
+                <xsl:call-template name="apply-styles-and-content">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:element>
+            <!-- adding a line break to make the presentation more even with the OOo view -->
+            <xsl:element name="br"/>
+        </xsl:if>
+    </xsl:template>
+
+
+
+    <!-- ******************** -->
+    <!-- *** ordered list *** -->
+    <!-- ******************** -->
+
+    <xsl:template match="text:ordered-list">
+        <xsl:param name="collectedGlobalData"/>
+
+            <xsl:choose>
+                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+                <xsl:when test="$outputType = 'CSS_HEADER'">
+                    <xsl:element name="ol">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'CSS_INLINED'">
+                    <xsl:element name="ol">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'PALM'">
+                    <xsl:element name="ol">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!--+++++ WML / WAP  +++++-->
+                <xsl:otherwise>
+                    <xsl:choose>
+                        <!-- simulating content break of capsulated list elements -->
+                        <xsl:when test="ancestor::text:list-item">
+                            <xsl:choose>
+                                <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                                    <!-- simulating content break of capsulated list elements -->
+                                    <xsl:element name="br"></xsl:element>
+                                    <xsl:call-template name="apply-styles-and-content">
+                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    </xsl:call-template>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:element name="p">
+                                        <!-- simulating content break of capsulated list elements -->
+                                        <xsl:element name="br"></xsl:element>
+                                        <xsl:call-template name="apply-styles-and-content">
+                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                        </xsl:call-template>
+                                    </xsl:element>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:call-template name="apply-styles-and-content">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:call-template>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:otherwise>
+            </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- ********************** -->
+    <!-- *** unordered list *** -->
+    <!-- ********************** -->
+
+    <xsl:template match="text:unordered-list">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER'">
+                <xsl:element name="ul">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'CSS_INLINED'">
+                <xsl:element name="ul">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'PALM'">
+                <xsl:element name="ul">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ WML / WAP  +++++-->
+            <xsl:otherwise>
+                <xsl:choose>
+                    <!-- simulating content break of capsulated list elements -->
+                    <xsl:when test="ancestor::text:list-item">
+                        <xsl:choose>
+                            <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                                <!-- simulating content break of capsulated list elements -->
+                                <xsl:element name="br"></xsl:element>
+                                <xsl:call-template name="apply-styles-and-content">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:element name="p">
+                                    <!-- simulating content break of capsulated list elements -->
+                                    <xsl:element name="br"></xsl:element>
+                                    <xsl:call-template name="apply-styles-and-content">
+                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    </xsl:call-template>
+                                </xsl:element>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- ****************** -->
+    <!-- *** list item  *** -->
+    <!-- ****************** -->
+
+    <xsl:template match="text:list-item">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER'">
+                <xsl:element name="li">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'CSS_INLINED'">
+                <xsl:element name="li">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'PALM'">
+                <xsl:element name="li">
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ WML / WAP  +++++-->
+            <xsl:otherwise>
+                <xsl:choose>
+                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                        <!-- simulating list elements -->
+                        <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
+                        <xsl:text>* </xsl:text>
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                        <!-- list item break simulation (not in a table)-->
+                        <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
+                            <xsl:element name="br"/>
+                        </xsl:if>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:element name="p">
+                            <!-- simulating list elements -->
+                            <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
+                            <xsl:text>* </xsl:text>
+                            <xsl:call-template name="apply-styles-and-content">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:call-template>
+                            <!-- list item break simulation (not in a table)-->
+                            <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
+                                <xsl:element name="br"/>
+                            </xsl:if>
+                        </xsl:element>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- ********************************************** -->
+    <!-- *** Text Section (contains: draw:text-box) *** -->
+    <!-- ********************************************** -->
+
+        <xsl:template match="text:section">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:if test="not(contains(@text:display, 'none'))">
+            <xsl:choose>
+                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+                <xsl:when test="$outputType = 'CSS_HEADER'">
+                    <xsl:element name="span">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'CSS_INLINED'">
+                    <xsl:element name="span">
+                        <xsl:call-template name="apply-styles-and-content">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:element>
+                </xsl:when>
+                <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
+                <xsl:when test="$outputType = 'PALM'">
+                    <xsl:choose>
+                        <xsl:when test="name(parent::*) = 'text:list-item'">
+                                        <xsl:call-template name="apply-styles-and-content">
+                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                        </xsl:call-template>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:element name="p">
+                                <xsl:call-template name="apply-styles-and-content">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:element>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:when>
+                <!--+++++ WML / WAP  +++++-->
+                <xsl:otherwise>
+                    <xsl:choose>
+                        <xsl:when test="not($outputType = 'WML')">
+                            <xsl:element name="a">
+                                <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                                <xsl:call-template name="apply-styles-and-content">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:element>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <!-- no nested p tags in wml1.1 allowed -->
+                            <xsl:choose>
+                                <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                                    <xsl:call-template name="apply-styles-and-content">
+                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    </xsl:call-template>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:element name="p">
+                                        <xsl:call-template name="apply-styles-and-content">
+                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                        </xsl:call-template>
+                                    </xsl:element>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:if>
+    </xsl:template>
+
+
+
+    <xsl:template match="text:line-break">
+        <xsl:element name="br"/>
+    </xsl:template>
+
+
+<!--
+    TABHANDLING PROBLEM: Tabs are possible to be shown in the HTML text file, but will be later stripped as whitespaces.
+        To prevent this one way would be the PRE tag which unfortunately ALWAYS result into a line-break. No surrounding NOBR tags help.
+
+    <xsl:template match="text:tab-stop">
+        <xsl:if test="not(preceding-sibling::text:tab-stop)">
+            <xsl:element name="pre"><xsl:text>&#9;</xsl:text><xsl:for-each select="following-sibling::text:tab-stop"><xsl:text>&#9;</xsl:text></xsl:for-each></xsl:element>
+        </xsl:if>
+     </xsl:template>
+
+    <xsl:template match="text:tab-stop"><xsl:text>&#9;</xsl:text></xsl:template>
+-->
+    <!-- HOTFIX: 8 non-breakable-spaces instead of a TAB is a hack sometimes less Tabs are needed and the code more difficult to read -->
+    <xsl:template match="text:tab-stop">
+        <xsl:call-template name="write-breakable-whitespace">
+            <xsl:with-param name="whitespaces" select="8"/>
+        </xsl:call-template>
+    </xsl:template>
+
+    <!-- currently there have to be an explicit call of the style attribute nodes, maybe the attributes nodes have no priority only order relevant-->
+    <!-- STRANGE: checked with biorythm.sxc a simple xsl:apply-templates did not recognice the styles. Maybe caused by the template match order?  -->
+    <xsl:template name="apply-styles-and-content">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+
+        <xsl:apply-templates>
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+
+    <xsl:template match="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name-->
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER'">
+                <xsl:attribute name="class"><xsl:value-of select="translate(., '. %()/\', '')"/></xsl:attribute>
+            </xsl:when>
+
+            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'CSS_INLINED'">
+                <xsl:attribute name="style"><xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/.]"/></xsl:attribute>
+            </xsl:when>
+
+            <!--+++++ PALM 3.2 SUBSET INLINED WAY  and  WML / WAP   +++++-->
+            <xsl:when test="$outputType = 'PALM' or $outputType = 'WML'">
+                <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
+                <xsl:variable name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/.]"/>
+                <!-- changing the context node -->
+                <xsl:for-each select="parent::*">
+                    <xsl:call-template name="create-nested-format-tags">
+                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:for-each>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <xsl:template match="text:sequence">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:apply-templates>
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/global_document.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/global_document.xsl
new file mode 100644 (file)
index 0000000..fc4579e
--- /dev/null
@@ -0,0 +1,1674 @@
+ <!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                extension-element-prefixes="xt"
+                xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
+                xmlns:sxghelper="http://www.jclark.com/xt/java/com.sun.star.xslt.helper.SxgChildTransformer"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+
+
+    <!-- ********************************************** -->
+    <!-- *** Global Document -  Table of Content    *** -->
+    <!-- ********************************************** -->
+
+
+
+    <xsl:template match="text:table-of-content">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:apply-templates>
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+
+
+    <xsl:template match="text:index-body">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:apply-templates mode="content-table">
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+
+
+    <xsl:template match="text:index-title" mode="content-table">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:apply-templates>
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+    </xsl:template>
+
+    <xsl:template match="text:reference-ref">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+        <xsl:if test="not($isJavaDisabled)">
+            <xsl:element name="a">
+                <xsl:attribute name="href">
+                    <xsl:text>#</xsl:text>
+                    <xsl:call-template name="encode-string">
+                        <!-- the space has to be normalized,
+                            otherwise an illegal argument exception will be thrown for XT-->
+                         <xsl:with-param name="textToBeEncoded" select="@text:ref-name"/>
+                    </xsl:call-template>
+                </xsl:attribute>
+
+                <xsl:apply-templates>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:apply-templates>
+
+            </xsl:element>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template match="text:reference-mark">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+        <xsl:if test="not($isJavaDisabled)">
+            <xsl:element name="a">
+                <xsl:attribute name="name">
+                    <xsl:call-template name="encode-string">
+                        <!-- the space has to be normalized,
+                            otherwise an illegal argument exception will be thrown for XT-->
+                        <xsl:with-param name="textToBeEncoded" select="@text:name"/>
+                    </xsl:call-template>
+                </xsl:attribute>
+
+                <xsl:apply-templates>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:apply-templates>
+
+            </xsl:element>
+        </xsl:if>
+    </xsl:template>
+
+
+
+    <xsl:template match="text:reference-mark-start">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!-- Java is needed as we have to encode the relative links (bug#102311) -->
+        <xsl:if test="not($isJavaDisabled)">
+            <xsl:element name="a">
+                <xsl:attribute name="name">
+                    <xsl:call-template name="encode-string">
+                        <!-- the space has to be normalized,
+                            otherwise an illegal argument exception will be thrown for XT-->
+                        <xsl:with-param name="textToBeEncoded" select="@text:name"/>
+                    </xsl:call-template>
+                </xsl:attribute>
+
+                <xsl:variable name="endOfReference">
+                    <xsl:for-each select="text:reference-mark-end[@name=current()/@text:name]">
+                        <xsl:value-of select="position()"/>
+                    </xsl:for-each>
+                </xsl:variable>
+
+                <xsl:for-each select="following-sibling::*[position() &lt; $endOfReference]">
+                    <xsl:apply-templates>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:apply-templates>
+                </xsl:for-each>
+            </xsl:element>
+       </xsl:if>
+    </xsl:template>
+
+
+
+
+     <!-- content table link  -->
+    <xsl:template match="text:a" mode="content-table">
+        <xsl:param name="collectedGlobalData"/>
+
+
+        <!-- For anchors in content-headers a bug exists (cp. bug id# 102311) and they have to be worked out separately.
+            Currently the link used in the content-table of an Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+            is not a valid URL (cp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+            links in the Office XML, nor is the chapter no. known in the linked files.
+            A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
+            can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
+            All header titles gonna be encoding to be usable in a relative URL. -->
+        <xsl:choose>
+            <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled">
+                <xsl:call-template name="create-common-link">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="create-content-table-link">
+                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <xsl:template name="get-absolute-chapter-no">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="precedingChapterLevel1"/>
+
+        <xsl:choose>
+            <xsl:when test="$globalDocumentRefToCurrentFile">
+
+                <xsl:variable name="currentFileHeadingNo">
+                    <xsl:call-template name="get-current-file-heading-no"/>
+                </xsl:variable>
+                <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
+
+                <xsl:call-template name="get-global-heading-no">
+                    <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
+                    <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
+                </xsl:call-template>
+
+           </xsl:when>
+           <xsl:otherwise>
+                <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
+                    work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
+                <xsl:variable name="currentFileHeadingNo">
+                    <xsl:call-template name="get-current-file-heading-no"/>
+                </xsl:variable>
+                <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
+
+                <xsl:call-template name="get-global-heading-no">
+                    <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
+                    <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <xsl:template name="get-current-file-heading-no">
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:get-current-child-heading-no')">
+                <xsl:value-of select="sxghelper:get-current-child-heading-no()"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo')">
+                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo()"/>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <xsl:template name="get-next-current-file-heading-no">
+        <xsl:param name="file"/>
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:get-next-current-child-heading-no')">
+                <xsl:value-of select="sxghelper:get-next-current-child-heading-no($file)"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo')">
+                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo($file)"/>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <xsl:template name="get-global-heading-no">
+        <xsl:param name="currentFileHeadingNo"/>
+        <xsl:param name="precedingChapterLevel1"/>
+
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:get-global-heading-no')">
+                <xsl:value-of select="sxghelper:get-global-heading-no(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo')">
+                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+
+    <!-- necessary as anchor for the content table -->
+    <xsl:template name="create-heading-anchor">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!--
+        Currently the link used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+        is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+        links in the Office XML.
+        Here we are creating an anchor with the space normalized text of this header as potential jump address of the content table -->
+
+        <xsl:choose>
+            <xsl:when test="$globalDocumentRefToCurrentFile">
+
+                <xsl:variable name="currentFileHeadingNo">
+                    <xsl:call-template name="get-next-current-file-heading-no">
+                         <xsl:with-param name="file" select="$globalDocumentRefToCurrentFile"/>
+                    </xsl:call-template>
+                </xsl:variable>
+
+
+                <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
+                <xsl:if test="$isDebugMode">
+                    <xsl:message>Matching child document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
+                    <xsl:message>absolute-chapter-level:         <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
+                    <xsl:message>encodedTitle:                   <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
+                    <xsl:message>globalDocumentRefToCurrentFile: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
+                    <xsl:message>*** </xsl:message>
+                </xsl:if>
+
+                <xsl:element name="a">
+                    <xsl:attribute name="name">
+                        <xsl:value-of select="$testResult/@absolute-chapter-level"/>
+                        <xsl:text>+</xsl:text>
+                        <xsl:value-of select="$testResult/@encoded-title"/>
+                    </xsl:attribute>
+                </xsl:element>
+           </xsl:when>
+
+           <xsl:otherwise>
+                <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
+                    work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
+                <xsl:variable name="currentFileHeadingNo">
+                    <xsl:call-template name="get-next-current-file-heading-no">
+                         <xsl:with-param name="file" select="$contentTableURL"/>
+                    </xsl:call-template>
+                </xsl:variable>
+
+
+                <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
+
+                <xsl:if test="$isDebugMode">
+                    <xsl:message>Matching global document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
+                    <xsl:message>absolute-chapter-level:  <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
+                    <xsl:message>encodedTitle:            <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
+                    <xsl:message>contentTableURL:         <xsl:value-of select="$contentTableURL"/></xsl:message>
+                    <xsl:message>*** </xsl:message>
+                </xsl:if>
+
+                <xsl:element name="a">
+                    <xsl:attribute name="name">
+                        <xsl:value-of select="$testResult/@absolute-chapter-level"/>
+                        <xsl:text>+</xsl:text>
+                        <xsl:value-of select="$testResult/@encoded-title"/>
+                    </xsl:attribute>
+                </xsl:element>
+
+            </xsl:otherwise>
+        </xsl:choose>
+
+
+
+<!--
+
+        <xsl:variable name="title" select="normalize-space(.)"/>
+        <!~~DON'T WORK    <xsl:variable name="title" select="normalize-space(descendant::text())"/>        ~~>
+         <xsl:choose>
+            <xsl:when test="$globalDocumentRefToCurrentFile">
+                <xsl:variable name="testResults" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][$title = @title][current()/@text:level = @level]"/>
+                <xsl:if test="1 &lt; count($testResults)">
+                    <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
+                    <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
+                </xsl:if>
+
+                 <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
+                 <xsl:choose>
+                     <xsl:when test="$encodedTitle">
+                         <xsl:element name="a">
+                            <xsl:attribute name="name">
+                                <xsl:value-of select="$encodedTitle"/>
+                            </xsl:attribute>
+                         </xsl:element>
+                     </xsl:when>
+                     <xsl:otherwise>
+                        <!~~ even when it is not ~~>
+                        <xsl:variable name="newEncodedTitle">
+                            <xsl:call-template name="encode-string">
+                                <!~~ the space has to be normalized,
+                                    otherwise an illegal argument exception will be thrown for XT~~>
+                                 <xsl:with-param name="textToBeEncoded" select="$title"/>
+                            </xsl:call-template>
+                        </xsl:variable>
+                         <xsl:element name="a">
+                            <xsl:attribute name="name">
+                                <xsl:value-of select="$newEncodedTitle"/>
+                            </xsl:attribute>
+                         </xsl:element>
+                     </xsl:otherwise>
+                 </xsl:choose>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:variable name="testResults" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][$title = @title][current()/@text:level = @level]"/>
+                <xsl:if test="1 &lt; count($testResults)">
+                    <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
+                    <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
+                    <xsl:message> *** </xsl:message>
+                </xsl:if>
+
+                <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
+                <xsl:choose>
+                     <xsl:when test="$encodedTitle">
+                         <xsl:element name="a">
+                            <xsl:attribute name="name">
+                                <xsl:value-of select="$encodedTitle"/>
+                            </xsl:attribute>
+                         </xsl:element>
+                     </xsl:when>
+                     <xsl:otherwise>
+                        <!~~ even when it is not ~~>
+                        <xsl:variable name="newEncodedTitle">
+                            <xsl:call-template name="encode-string">
+                                <!~~ the space has to be normalized,
+                                    otherwise an illegal argument exception will be thrown for XT~~>
+                                 <xsl:with-param name="textToBeEncoded" select="$title"/>
+                            </xsl:call-template>
+                        </xsl:variable>
+                         <xsl:element name="a">
+                            <xsl:attribute name="name">
+                                <xsl:value-of select="$newEncodedTitle"/>
+                            </xsl:attribute>
+                         </xsl:element>
+                     </xsl:otherwise>
+                 </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+
+-->
+
+    </xsl:template>
+
+
+
+
+    <!-- ************************************** -->
+    <!--    CREATION OF A CONTENT TABLE LINK    -->
+    <!-- ************************************** -->
+
+
+    <!-- a special behavior of text:a
+        (called from the 'text:a' template) -->
+
+    <xsl:template name="create-content-table-link">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <xsl:when test="not($outputType = 'WML')">
+                <xsl:element name="a">
+                    <xsl:attribute name="href">
+                        <xsl:choose>
+                            <xsl:when test="starts-with(@xlink:href, '#')">
+                                <xsl:variable name="correctHeading" select="$collectedGlobalData/content-table-headings/heading[current()/@xlink:href = @content-table-id]"/>
+
+                                <xsl:value-of select="$correctHeading/@out-file-url"/>
+                                <xsl:text>#</xsl:text>
+                                <xsl:value-of select="$correctHeading/@absolute-chapter-level"/>
+                                <xsl:text>+</xsl:text>
+                                <xsl:value-of select="$correctHeading/@encoded-title"/>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:call-template name="create-common-link">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:attribute>
+
+                    <xsl:call-template name="apply-styles-and-content">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+            <xsl:otherwise>
+                <!-- 2DO: currently no WML support
+
+                <!~~ no nested p tags in wml1.1 allowed ~~>
+                <xsl:choose>
+                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
+                        <xsl:element name="a">
+                            <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                            <xsl:apply-templates select="."/>
+                        </xsl:element>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:element name="p">
+                            <xsl:element name="a">
+                                <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
+                                <xsl:apply-templates select="."/>
+                            </xsl:element>
+                        </xsl:element>
+                    </xsl:otherwise>
+                </xsl:choose>  -->
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+       <!--
+           CREATION OF A HELPER VARIABLE AS WORKAROUND FOR THE CONTENT TABLE ULR BUG
+
+
+        As no valid URL from the content table to the child documents exist in the content table,
+        a work-around is done:
+
+        First two helper variables are being created.
+
+        One containing the list of all references of the global document:
+        containg all their title,
+        for example:
+
+               <chapter-ref title="aTitle 1"/>
+               <chapter-ref title="aTitle 2"/>
+               <chapter-ref title="aTitle 2/>
+               <chapter-ref title="aTitle 3/>
+
+        The other containing all heading from the child documents linked from the global document.
+        The variable 'childrenHeadings' contains their title and the number of preceding similar titles,
+        for example:
+
+
+               <child file-url="aURL">
+                       <heading title="aTitle1" level="1">
+                       <heading title="aTitle2" level="2">
+                       <heading title="aTitle3" level="1">
+            </child>
+
+        For each chapter reference from the content table the
+
+         by encoding the chapter names of the child document with the java URLEncoder and
+        use this as a part of a link. Furthermore for all heading elements a encoded anchor will be created from the heading.
+        Last the workaround parses all children documents for this anhor, as there is no distinction of files from the content table entries.
+
+        The new added node set to the collectedGlobalData variable concering the content table is written as
+
+
+               <content-table-headings content-table-url="aURL_ToTheGeneratedContentTable">
+               <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
+               <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
+               <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
+               <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
+               </content-table-headings>
+
+
+        Preconditions:
+               The correct sequence of child documents according to the Content Table is necessary, granted by the office.
+       -->
+       <xsl:template name="Create-helper-variables-for-Content-Table">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the content table....</xsl:message></xsl:if>
+
+        <!-- Here a helper variable of the content table is created, of all chapter-references which point to a child document.
+             an 'chapter-ref' element will be created, containg their title and the number of preceding similar titles,
+             for example:
+
+               <chapter-ref title="aTitle 1"/>
+               <chapter-ref title="aTitle 2"/>
+               <chapter-ref title="aTitle 2"/>
+               <chapter-ref title="aTitle 3"/>
+            -->
+        <xsl:variable name="chapterRefs-RTF">
+            <!-- '/*/' as the flat and the zipped XML file format have different root elements -->
+            <xsl:for-each select="/*/office:body/text:table-of-content/text:index-body/text:p/text:a">
+                <xsl:variable name="currentTitle" select="normalize-space(string(.))"/>
+                <xsl:element name="chapter-ref">
+                    <xsl:attribute name="title">
+                        <xsl:value-of select="$currentTitle"/>
+                    </xsl:attribute>
+                    <xsl:attribute name="content-table-id">
+                        <xsl:value-of select="@xlink:href"/>
+                    </xsl:attribute>
+               </xsl:element>
+            </xsl:for-each>
+        </xsl:variable>
+        <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the content table!</xsl:message></xsl:if>
+
+
+
+
+        <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the child documents....</xsl:message></xsl:if>
+        <!-- Here a helper variable of created from the children documents.
+             Containg all heading elements from the child documents. Some or all of them are
+             chapters referenced by the Global Document.
+             The variable contains their title, the level of the heading and the file URL of the child,
+             for example:
+
+                       <heading title="aTitle1" level="1" file-url="aURL1">
+                       <heading title="aTitle2" level="2" file-url="aURL1">
+                       <heading title="aTitle3" level="1" file-url="aURL1">
+                       <heading title="aTitle4" level="1" file-url="aURL2">
+                       <heading title="aTitle5" level="2" file-url="aURL2">
+                       <heading title="aTitle2" level="3" file-url="aURL2">
+                       <heading title="aTitle6" level="3" file-url="aURL2">
+                <heading-count>7</heading-count>
+            -->
+        <xsl:variable name="childrenHeadings-RTF">
+            <!-- all headers from children documents will be added -->
+            <xsl:apply-templates select="/*/office:body/text:section" mode="creation-of-variable"/>
+        </xsl:variable>
+        <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the child documents!</xsl:message></xsl:if>
+
+
+        <xsl:choose>
+            <xsl:when test="function-available('xt:node-set')">
+                <xsl:call-template name="Create-global-variable-for-Content-Table">
+                    <xsl:with-param name="chapterRefs"     select="xt:node-set($chapterRefs-RTF)"/>
+                    <xsl:with-param name="childrenHeadings"     select="xt:node-set($childrenHeadings-RTF)"/>
+                    <xsl:with-param name="collectedGlobalData"  select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="function-available('xalan:nodeset')">
+                <xsl:call-template name="Create-global-variable-for-Content-Table">
+                    <xsl:with-param name="chapterRefs"     select="xalan:nodeset($chapterRefs-RTF)"/>
+                    <xsl:with-param name="childrenHeadings"     select="xalan:nodeset($childrenHeadings-RTF)"/>
+                    <xsl:with-param name="collectedGlobalData"  select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+
+    <xsl:template name="Create-global-variable-for-Content-Table">
+        <xsl:param name="chapterRefs"/>
+        <xsl:param name="childrenHeadings"/>
+        <xsl:param name="collectedGlobalData"/>
+
+
+        <xsl:if test="$isDebugMode">
+            <!-- helper variable collecting all headings from the global document file children-->
+            <xsl:for-each select="$childrenHeadings/heading">
+                <xsl:message>#              <xsl:value-of select="position()"/></xsl:message>
+                <xsl:message>level:         <xsl:value-of select="@level"/></xsl:message>
+                <xsl:message>title:         <xsl:value-of select="@title"/></xsl:message>
+                <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
+                <xsl:message>file-url:      <xsl:value-of select="@file-url"/></xsl:message>
+                <xsl:message>header-no:     <xsl:value-of select="@header-no"/></xsl:message>
+                <xsl:message>**</xsl:message>
+            </xsl:for-each>
+            <xsl:message>**</xsl:message>
+            <xsl:message>**</xsl:message>
+
+            <!-- helper variable collecting all heading references from the content table of the the global document -->
+            <xsl:message>childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
+            <xsl:for-each select="$chapterRefs/chapter-ref">
+                <xsl:message># <xsl:value-of select="position()"/></xsl:message>
+                <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
+                <xsl:message>**</xsl:message>
+            </xsl:for-each>
+        </xsl:if>
+
+
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:set-heading-no')">
+                    <xsl:value-of select="sxghelper:set-heading-no(1)"/>
+                    <xsl:value-of select="sxghelper:set-current-child-no(1)"/>
+                    <xsl:value-of select="sxghelper:set-current-child-url(string($childrenHeadings/heading/@file-url))"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
+                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo(1)"/>
+                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo(1)"/>
+                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl(string($childrenHeadings/heading/@file-ur))"/>
+            </xsl:when>
+        </xsl:choose>
+
+        <xsl:if test="$isDebugMode"><xsl:message>Creating global document variable for chapter relations....</xsl:message></xsl:if>
+        <xsl:variable name="contentTableHeadingsGlobalData-RTF">
+            <xsl:element name="content-table-headings">
+                <!-- all headings are linked from the current global document input file -->
+                <xsl:attribute name="content-table-url">
+                    <xsl:value-of select="$contentTableURL"/>
+                </xsl:attribute>
+
+                <!-- had to use a for loop, as a recursion ends with an stackoverflow exception after about 600 recursive calls -->
+                <xsl:choose>
+                    <xsl:when test="function-available('sxghelper:get-heading-no')">
+                         <xsl:for-each select="$chapterRefs/chapter-ref">
+                            <xsl:call-template name="searchHeadingInChildDocument">
+                                <xsl:with-param name="chapterRefs"         select="$chapterRefs"/>
+                                <xsl:with-param name="childrenHeadings"    select="$childrenHeadings"/>
+                                <xsl:with-param name="currentChapterRefNo" select="position()"/>
+                                <xsl:with-param name="currentHeadingNo"    select="sxghelper:get-heading-no()"/>
+                                <xsl:with-param name="currentChildURL"     select="sxghelper:get-current-child-url()"/>
+                                <xsl:with-param name="currentChildNo"      select="sxghelper:get-current-child-no()"/>
+                            </xsl:call-template>
+                        </xsl:for-each>
+                     </xsl:when>
+                    <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo')">
+                         <xsl:for-each select="$chapterRefs/chapter-ref">
+                            <xsl:call-template name="searchHeadingInChildDocument">
+                                <xsl:with-param name="chapterRefs"         select="$chapterRefs"/>
+                                <xsl:with-param name="childrenHeadings"    select="$childrenHeadings"/>
+                                <xsl:with-param name="currentChapterRefNo" select="position()"/>
+                                <xsl:with-param name="currentHeadingNo"    select="java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo()"/>
+                                <xsl:with-param name="currentChildURL"     select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildUrl()"/>
+                                <xsl:with-param name="currentChildNo"      select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildNo()"/>
+                            </xsl:call-template>
+                        </xsl:for-each>
+                    </xsl:when>
+                </xsl:choose>
+            </xsl:element>
+
+            <!-- adding the already exisiting global data environment -->
+            <xsl:copy-of select="$collectedGlobalData"/>
+        </xsl:variable>
+        <xsl:if test="$isDebugMode"><xsl:message>Finished global document variable for chapter relations!</xsl:message></xsl:if>
+
+        <xsl:choose>
+            <xsl:when test="function-available('xt:node-set')">
+                <xsl:call-template name="start-self-and-children-transformation">
+                    <xsl:with-param name="collectedGlobalData"       select="xt:node-set($contentTableHeadingsGlobalData-RTF)"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="function-available('xalan:nodeset')">
+                <xsl:call-template name="start-self-and-children-transformation">
+                    <xsl:with-param name="collectedGlobalData"       select="xalan:nodeset($contentTableHeadingsGlobalData-RTF)"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <xsl:template name="searchHeadingInChildDocument">
+        <xsl:param name="chapterRefs"/>
+        <xsl:param name="childrenHeadings"/>
+        <xsl:param name="currentChapterRefNo"/>
+        <xsl:param name="currentHeadingNo"/>
+        <xsl:param name="currentChildURL"/>
+        <xsl:param name="currentChildNo"/>
+
+
+        <xsl:variable name="currentChapterRef"      select="$chapterRefs/chapter-ref[$currentChapterRefNo]"/>
+        <xsl:variable name="currentChapterID"       select="$currentChapterRef/@content-table-id"/>
+        <xsl:variable name="currentChapterTitle"    select="$currentChapterRef/@title"/>
+
+        <xsl:variable name="currentChildHeading"    select="$childrenHeadings/heading[$currentHeadingNo]"/>
+        <xsl:variable name="headingTitle"           select="$currentChildHeading/@title"/>
+        <xsl:variable name="headingLevel"           select="$currentChildHeading/@level"/>
+        <xsl:variable name="headingNo"              select="$currentChildHeading/@header-no"/>
+        <xsl:variable name="newChildURL"            select="$currentChildHeading/@file-url"/>
+
+        <xsl:if test="$isDebugMode">
+            <xsl:message>*** new heading </xsl:message>
+            <xsl:message>currentChapterID:    <xsl:value-of select="$currentChapterID"/></xsl:message>
+            <xsl:message>currentChapterTitle: <xsl:value-of select="$currentChapterTitle"/></xsl:message>
+            <xsl:message>currentChapterID:    <xsl:value-of select="$currentChapterID"/></xsl:message>
+            <xsl:message>currentHeadingNo:    <xsl:value-of select="$currentHeadingNo"/></xsl:message>
+            <xsl:message>headingTitle:        <xsl:value-of select="$headingTitle"/></xsl:message>
+            <xsl:message>headingLevel:        <xsl:value-of select="$headingLevel"/></xsl:message>
+            <xsl:message>headingNo:           <xsl:value-of select="$headingNo"/></xsl:message>
+            <xsl:message>newChildURL:         <xsl:value-of select="$newChildURL"/></xsl:message>
+        </xsl:if>
+
+        <xsl:variable name="outFileURL">
+            <xsl:choose>
+                 <xsl:when test="substring-before($newChildURL,'.xml')">
+                    <xsl:value-of select="concat(substring-before($newChildURL,'.xml'),'.htm')"/>
+                 </xsl:when>
+                 <xsl:when test="substring-before($newChildURL,'.sx')">
+                    <xsl:value-of select="concat(substring-before($newChildURL,'.sx'),'.htm')"/>
+                 </xsl:when>
+            </xsl:choose>
+        </xsl:variable>
+        <xsl:variable name="isChapterHeading" select="$headingTitle = $currentChapterTitle"/>
+        <xsl:variable name="isNewFile" select="string($newChildURL) != string($currentChildURL)"/>
+
+
+
+
+        <xsl:if test="$isNewFile">
+            <!-- reset of the already collected child headers -->
+            <xsl:call-template name="calc-chapter-numbers">
+                 <xsl:with-param name="level" select="0"/>
+            </xsl:call-template>
+        </xsl:if>
+        <xsl:variable name="absoluteChapterLevel">
+            <xsl:call-template name="calc-chapter-numbers">
+                 <xsl:with-param name="level" select="number($headingLevel)"/>
+            </xsl:call-template>
+        </xsl:variable>
+
+
+        <xsl:element name="heading">
+            <!-- necessary to as ID from the content table to get the correct heading element (the buggy URL used as ID)-->
+            <xsl:attribute name="content-table-id">
+                <xsl:choose>
+                    <xsl:when test="$isChapterHeading">
+                        <xsl:value-of select="$currentChapterID"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text>only a heading, but not a chapter</xsl:text>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:attribute>
+            <!-- no of the used child, necessary for quick finding of chapters of next file  -->
+            <xsl:attribute name="child-document-no">
+                <xsl:choose>
+                    <xsl:when test="$isNewFile">
+                        <xsl:value-of select="$currentChildNo + 1"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:value-of select="$currentChildNo"/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:attribute>
+            <!-- the URL of the child document source, containing the heading -->
+            <xsl:attribute name="file-url">
+                <xsl:value-of select="$newChildURL"/>
+            </xsl:attribute>
+            <xsl:attribute name="out-file-url">
+                <xsl:value-of select="$outFileURL"/>
+            </xsl:attribute>
+            <xsl:attribute name="level">
+                <xsl:value-of select="$headingLevel"/>
+            </xsl:attribute>
+            <xsl:attribute name="title">
+                <xsl:value-of select="$headingTitle"/>
+            </xsl:attribute>
+            <xsl:attribute name="encoded-title">
+                <xsl:value-of select="$currentChildHeading/@encoded-title"/>
+            </xsl:attribute>
+            <xsl:attribute name="absolute-chapter-level">
+                <xsl:value-of select="$absoluteChapterLevel"/>
+            </xsl:attribute>
+        </xsl:element>
+
+
+        <xsl:choose>
+            <xsl:when test="$childrenHeadings/heading-count != $currentHeadingNo">
+                <!-- procede as long the list of children isn'nt worked through -->
+                <xsl:choose>
+                    <xsl:when test="$isChapterHeading">
+                        <!-- global variables have to be set, so the for-each loop can access them -->
+                        <xsl:choose>
+                            <xsl:when test="function-available('sxghelper:set-heading-no')">
+                                <xsl:value-of select="sxghelper:set-heading-no($currentHeadingNo + 1)"/>
+                                <xsl:if test="$isNewFile">
+                                    <xsl:value-of select="sxghelper:set-current-child-no($currentChildNo + 1)"/>
+                                    <xsl:value-of select="sxghelper:set-current-child-url(string($newChildURL))"/>
+                                </xsl:if>
+                             </xsl:when>
+                            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
+                                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo($currentHeadingNo + 1)"/>
+                                <xsl:if test="$isNewFile">
+                                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo($currentChildNo + 1)"/>
+                                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl($newChildURL)"/>
+                                </xsl:if>
+                            </xsl:when>
+                        </xsl:choose>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <!-- not a chapter heading, call itself until a chapter ref is found or the end of headings is reached -->
+                        <xsl:call-template name="searchHeadingInChildDocument">
+                            <xsl:with-param name="chapterRefs"         select="$chapterRefs"/>
+                            <xsl:with-param name="childrenHeadings"    select="$childrenHeadings"/>
+                            <xsl:with-param name="currentChapterRefNo" select="$currentChapterRefNo"/>
+                            <xsl:with-param name="currentHeadingNo"    select="$currentHeadingNo + 1"/>
+                            <xsl:with-param name="currentChildURL"     select="$currentChildURL"/>
+                            <xsl:with-param name="currentChildNo"      select="$currentChildNo"/>
+                        </xsl:call-template>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:if test="$isDebugMode">
+                    <xsl:message>All child documents have been walked through without finding the chapter name!</xsl:message>
+                    <xsl:message>       childrenHeadings/heading-count:    <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
+                    <xsl:message>       currentHeadingNo:                  <xsl:value-of select="$currentHeadingNo"/></xsl:message>
+                </xsl:if>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+
+
+       <!-- Chapters from the Content Table have currently no anchor to child documents in OOo XML.
+                As solution, whenever a a global document  every header of the HTML output gets get's an anchor in the Therefore-->
+    <xsl:template name="encode-string">
+        <xsl:param name="encoding" select="'UTF-8'"/>
+        <xsl:param name="textToBeEncoded"/>
+
+        <xsl:choose>
+            <xsl:when test="function-available('urlencoder:encode')">
+                <xsl:value-of select="urlencoder:encode(normalize-space($textToBeEncoded),$encoding)"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:java.net.URLEncoder.encode')">
+                <xsl:value-of select="java:java.net.URLEncoder.encode(string(normalize-space($textToBeEncoded)),string($encoding))"/>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+
+
+    <!-- ******************************************************************************************************** -->
+    <!-- ***  TRANSFORMATION OF ALL CHILD DOCUMENTS OF THE GLOBAL DOCUMENTS BY USING A EXTERNAL HELPER CLASS  *** -->
+    <!-- ******************************************************************************************************** -->
+
+
+       <!-- a new element 'contentTableHeadings' will be added to the helper variable the first time a child will be transformed -->
+    <xsl:template name="transform-global-document-and-children">
+        <xsl:param name="collectedGlobalData"/>
+
+
+        <xsl:choose>
+            <xsl:when test="$collectedGlobalData/content-table-headings">
+                <xsl:call-template name="start-child-transformation">
+                    <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                   <!-- The necessary auxiliary variable hasn't build yet.
+                   This variable gonna store all headers (with chapter numbers) and the URL of their files -->
+
+                <xsl:call-template name="Create-helper-variables-for-Content-Table">
+                    <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
+                </xsl:call-template>
+
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+       <xsl:template name="start-self-and-children-transformation">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:if test="$isDebugMode">
+            <xsl:call-template name="debug-content-table-headings-variable">
+                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+            </xsl:call-template>
+
+            <xsl:message>Parsing the global document...</xsl:message>
+        </xsl:if>
+
+        <xsl:apply-templates>
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:apply-templates>
+
+
+        <xsl:if test="$isDebugMode"><xsl:message>Parsing the child documents...</xsl:message></xsl:if>
+        <xsl:call-template name="start-child-transformation">
+            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+        </xsl:call-template>
+
+       </xsl:template>
+
+
+
+
+    <xsl:template name="start-child-transformation">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:if test="$isDebugMode"><xsl:message>Starting the child transformations...</xsl:message></xsl:if>
+
+        <!-- As the childs of a global document (with suffix .sxg) do not know anything about their global parent,
+            the transformation of global documents children have to be done implizit.
+            Otherwise the chapter number of the children will always start with zero, as they do not know anything about the
+            proceding chapters.
+            Furthermore, they don't have any links about preceeding and following documents and no linking for usability reasons
+            could be done. Therefore the children have to be transformed during the transformation of a global (sxg) document -->
+               <xsl:if test="$isDebugMode">
+            <xsl:choose>
+                <xsl:when test="$collectedGlobalData/content-table-headings">
+                    <xsl:message>Contentable data exists as global data!</xsl:message>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:message>No Contentable global data exists!</xsl:message>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:if>
+
+        <!-- currently this function only works with node-sets from XT -->
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:transform-children')">
+                <xsl:message>
+                    <xsl:value-of select="sxghelper:transform-children( $collectedGlobalData/content-table-headings,
+                                                                        string($jaredRootURL),
+                                                                        string($absoluteSourceDirRef),
+                                                                        string($optionalURLSuffix),
+                                                                        string($dpi),
+                                                                        string($outputType),
+                                                                        $isDebugMode)"/>
+                </xsl:message>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:message>Java method transformChildren to transform all children of a global document could not be found. Be sure to use the XT processor.</xsl:message>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+
+
+    <!-- ******************************************************************************* -->
+    <!-- ***  Creation of helper variable of the headings of all children documents  *** -->
+    <!-- ******************************************************************************* -->
+
+
+    <xsl:template match="/*/office:body/text:section" mode="creation-of-variable">
+        <xsl:call-template name="getChildRootNode"/>
+
+        <!-- after the last child document the global document will be parsed -->
+        <xsl:if test="position() = last()">
+            <!-- search the global document after all child documents have been searched
+
+ODK PATCH NO INDEX ELEMENT WANTED !! - null pointer exception
+            <xsl:call-template name="getPreviousHeaderNo">
+                <xsl:with-param name="fileURL"                  select="$contentTableURL"/>
+                <xsl:with-param name="amountOfCurrentHeading"   select="count(following-sibling::text:h)"/>
+                <xsl:with-param name="nodeToSearchForHeading"   select="following-sibling::text:h"/>
+            </xsl:call-template>
+-->
+           <!-- get the overall No of Headers -->
+           <xsl:call-template name="getAllHeaderNo"/>
+        </xsl:if>
+    </xsl:template>
+
+
+    <xsl:template name="getChildRootNode">
+        <xsl:variable name="fileURL"    select="text:section-source/@xlink:href"/>
+
+        <xsl:choose>
+               <!-- if absolute URL or absolute DOS PATH or absolute Unix path -->
+                       <xsl:when test="contains($fileURL,'//') or (substring($fileURL,2,1) = ':') or starts-with($fileURL, '/')">
+                       <xsl:variable name="childRootNode" select="document($fileURL)"/>
+                <xsl:call-template name="getPreviousHeaderNo">
+                    <xsl:with-param name="fileURL"                select="$fileURL"/>
+                       <!-- NO absolute source path will be added as prefix -->
+                    <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
+                    <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                       <xsl:variable name="childRootNode" select="document(concat($absoluteSourceDirRef,'/',$fileURL))"/>
+                <xsl:call-template name="getPreviousHeaderNo">
+                    <xsl:with-param name="fileURL"                select="$fileURL"/>
+                       <!-- the absolute source path will be added as prefix -->
+                    <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
+                    <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <xsl:template name="getPreviousHeaderNo">
+        <xsl:param name="fileURL"/>
+        <xsl:param name="nodeToSearchForHeading"/>
+        <xsl:param name="amountOfCurrentHeading"/>
+
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:get-previous-child-documents-heading-count')">
+                <xsl:call-template name="addHeadingInfo">
+                    <xsl:with-param name="nodeToSearchForHeading"   select="$nodeToSearchForHeading"/>
+                    <xsl:with-param name="fileURL"                  select="$fileURL"/>
+                    <xsl:with-param name="previousHeader"           select="sxghelper:get-previous-child-documents-heading-count($amountOfCurrentHeading)"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount')">
+                <xsl:call-template name="addHeadingInfo">
+                    <xsl:with-param name="nodeToSearchForHeading"   select="$nodeToSearchForHeading"/>
+                    <xsl:with-param name="fileURL"                  select="$fileURL"/>
+                    <xsl:with-param name="previousHeader"           select="java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount($amountOfCurrentHeading)"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose>
+
+    </xsl:template>
+
+
+    <xsl:template name="addHeadingInfo">
+        <xsl:param name="fileURL"/>
+        <xsl:param name="previousHeader"/>
+        <xsl:param name="nodeToSearchForHeading"/>
+
+        <xsl:variable name="previousHeader2" select="number($previousHeader)"/>
+        <xsl:for-each select="$nodeToSearchForHeading">
+
+            <xsl:variable name="title" select="normalize-space(.)"/>
+
+            <xsl:variable name="encodedTitle">
+                <xsl:call-template name="encode-string">
+                    <!-- the space has to be normalized,
+                        otherwise an illegal argument exception will be thrown for XT-->
+                     <xsl:with-param name="textToBeEncoded" select="$title"/>
+                </xsl:call-template>
+            </xsl:variable>
+
+            <xsl:element name="heading">
+                <!-- odd but 'descendant:text()' didn't work, but '.', to get all text nodes of the header -->
+                <xsl:attribute name="title"><xsl:value-of select="$title"/></xsl:attribute>
+                <xsl:attribute name="encoded-title"><xsl:value-of select="$encodedTitle"/></xsl:attribute>
+                <xsl:attribute name="level"><xsl:value-of select="@text:level"/></xsl:attribute>
+                <xsl:attribute name="file-url"><xsl:value-of select="$fileURL"/></xsl:attribute>
+                <xsl:attribute name="header-no"><xsl:value-of select="position() + $previousHeader2"/></xsl:attribute>
+            </xsl:element>
+        </xsl:for-each>
+
+    </xsl:template>
+
+
+    <xsl:template name="getAllHeaderNo">
+
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:get-all-child-documents-heading-count')">
+                <xsl:call-template name="addAllHeaderNoElement">
+                    <xsl:with-param name="allHeader"   select="sxghelper:get-all-child-documents-heading-count()"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount')">
+                <xsl:call-template name="addAllHeaderNoElement">
+                    <xsl:with-param name="allHeader"   select="java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount()"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template name="addAllHeaderNoElement">
+        <xsl:param name="allHeader"/>
+
+        <xsl:element name="heading-count">
+            <xsl:value-of select="$allHeader"/>
+        </xsl:element>
+
+    </xsl:template>
+
+
+    <!-- ******************************************************************************************************* -->
+    <!-- ***  Creation of a line of links at the beginning and end of a child document to enhance usability  *** -->
+    <!-- ******************************************************************************************************* -->
+
+    <xsl:template name="add-child-document-usability-links">
+        <xsl:element name="center">
+            <xsl:element name="small">
+                <xsl:text>[ </xsl:text>
+
+
+                <xsl:variable name="globalDocumentDir" select="sxghelper:get-global-document-dir()"/>
+                <xsl:variable name="currentChildNo" select="number($contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url]/@child-document-no)"/>
+                <xsl:variable name="earlierDocURL" select="$contentTableHeadings/heading[($currentChildNo - 1) = @child-document-no]/@out-file-url"/>
+<!--
+<xsl:message>from: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
+<xsl:message>to: <xsl:value-of select="$earlierDocURL"/></xsl:message>
+<xsl:message>Is: <xsl:call-template name="get-relative-file-ref">
+                    <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+                    <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
+                 </xsl:call-template>
+</xsl:message>-->
+
+
+                <xsl:if test="$earlierDocURL">
+                    <xsl:element name="a">
+                        <xsl:attribute name="href">
+                            <!-- when the links starts with a '#' it's a link to the Content Table-->
+                            <xsl:choose>
+                                <xsl:when test="starts-with($earlierDocURL, '#')">
+
+                                    <xsl:call-template name="get-relative-file-ref">
+                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+                                        <xsl:with-param name="targetFileRef" select="."/>
+                                    </xsl:call-template>
+<!--        <xsl:value-of select="concat($contentTableURL, $earlierDocURL)"/>-->
+                                </xsl:when>
+                                <xsl:otherwise>
+
+                                    <xsl:call-template name="get-relative-file-ref">
+                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+                                        <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
+                                    </xsl:call-template>
+<!--
+
+                                    <xsl:value-of select="concat($globalDocumentDir, $earlierDocURL)"/>-->
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:attribute>
+                        <xsl:text>Previous document</xsl:text>
+                    </xsl:element>
+
+                    <xsl:text> | </xsl:text>
+                </xsl:if>
+
+                <xsl:element name="a">
+                    <xsl:attribute name="href">
+                        <!-- when globalDocumentRefToCurrentFile is unset the current file is the Content Table-->
+                        <xsl:choose>
+                            <xsl:when test="$globalDocumentRefToCurrentFile">
+                                <xsl:variable name="contentTableDir">
+                                    <xsl:call-template name="get-name-of-table-of-content-document"/>
+                                </xsl:variable>
+
+                                <xsl:call-template name="get-relative-file-ref">
+                                    <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+                                    <xsl:with-param name="targetFileRef" select="$contentTableDir"/>
+                                </xsl:call-template>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:text>#</xsl:text>
+                            </xsl:otherwise>
+                        </xsl:choose>
+
+<!--                    <xsl:value-of select="$contentTableURL"/>-->
+                    </xsl:attribute>
+                    <xsl:text>Content Table</xsl:text>
+                </xsl:element>
+
+
+                <xsl:variable name="nextDocURL" select="$contentTableHeadings/heading[($currentChildNo + 1) = @child-document-no]/@out-file-url"/>
+                <xsl:if test="$nextDocURL">
+                    <xsl:text> | </xsl:text>
+                    <xsl:element name="a">
+                        <xsl:attribute name="href">
+                            <!-- when the links starts with a '#' it's a link to the Content Table-->
+                            <xsl:choose>
+                                <xsl:when test="starts-with($nextDocURL, '#')">
+                                    <xsl:call-template name="get-relative-file-ref">
+                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+                                        <xsl:with-param name="targetFileRef" select="."/>
+                                    </xsl:call-template>
+<!--                                <xsl:value-of select="concat($contentTableURL, $nextDocURL)"/>-->
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:call-template name="get-relative-file-ref">
+                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
+                                        <xsl:with-param name="targetFileRef" select="$nextDocURL"/>
+                                    </xsl:call-template>
+<!--                                 <xsl:value-of select="concat($globalDocumentDir, $nextDocURL)"/>-->
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:attribute>
+                        <xsl:text>Next document</xsl:text>
+                    </xsl:element>
+                </xsl:if>
+                <xsl:text> ]</xsl:text>
+            </xsl:element>
+        </xsl:element>
+    </xsl:template>
+
+
+    <xsl:template name="get-relative-file-ref">
+        <xsl:param name="sourceFileRef"/>
+        <xsl:param name="targetFileRef"/>
+
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:get-relative-file-ref')">
+                <xsl:value-of select="sxghelper:get-relative-file-ref(string($sourceFileRef), string($targetFileRef))"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef')">
+                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef(string($sourceFileRef), string($targetFileRef))"/>
+            </xsl:when>
+        </xsl:choose>
+
+    </xsl:template>
+
+
+    <xsl:template name="get-name-of-table-of-content-document">
+
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:get-name-of-table-of-content-document')">
+                <xsl:value-of select="sxghelper:get-name-of-table-of-content-document()"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument')">
+                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument()"/>
+            </xsl:when>
+        </xsl:choose>
+
+    </xsl:template>
+
+
+       <xsl:template name="debug-content-table-headings-variable">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:message><xsl:text>**** THE HEADING VARIABLE **** </xsl:text></xsl:message>
+        <xsl:message>content-table-url: <xsl:value-of select="collectedGlobalData/content-table-headings/content-table-url"/></xsl:message>
+
+        <xsl:for-each select="$collectedGlobalData/content-table-headings/heading">
+            <xsl:message><xsl:text>**** new heading:        </xsl:text></xsl:message>
+            <xsl:message>content-table-id:      <xsl:value-of select="@content-table-id"/></xsl:message>
+            <xsl:message>child-document-no:     <xsl:value-of select="@child-document-no"/></xsl:message>
+            <xsl:message>file-url:              <xsl:value-of select="@file-url"/></xsl:message>
+            <xsl:message>out-file-url:          <xsl:value-of select="@out-file-url"/></xsl:message>
+            <xsl:message>level:                 <xsl:value-of select="@level"/></xsl:message>
+            <xsl:message>title:                 <xsl:value-of select="@title"/></xsl:message>
+            <xsl:message>encoded-title:         <xsl:value-of select="@encoded-title"/></xsl:message>
+            <xsl:message>absolute-chapter-level:<xsl:value-of select="@absolute-chapter-level"/></xsl:message>
+        </xsl:for-each>
+
+       </xsl:template>
+
+
+       <!-- To make the headings unique, the absolute heading is added to them
+            E.g. The level 1.2.3.4. would result into a 1+2+3+4 string -->
+    <xsl:template name="calc-chapter-numbers">
+        <xsl:param name="level"/>
+
+        <xsl:choose>
+            <xsl:when test="function-available('sxghelper:calc-chapter-numbers')">
+                <xsl:value-of select="sxghelper:calc-chapter-numbers($level)"/>
+            </xsl:when>
+            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers')">
+                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers($level)"/>
+            </xsl:when>
+        </xsl:choose>
+
+    </xsl:template>
+
+
+
+
+    <xsl:template match="text:p" mode="content-table">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:variable name="allTabStopStyles" select="$office:automatic-styles/style:style[@style:name = current()/@text:style-name]/style:properties/style:tab-stops"/>
+
+        <xsl:element name="table">
+            <xsl:attribute name="border">0</xsl:attribute>
+            <xsl:attribute name="class"><xsl:value-of select="@text:style-name"/></xsl:attribute>
+<!--
+<xsl:message>*********</xsl:message>
+<xsl:message>Stylename:<xsl:value-of select="@text:style-name"/></xsl:message>
+<xsl:message>position: <xsl:value-of select="count($allTabStopStyles/style:tab-stop)"/></xsl:message>
+-->
+
+            <xsl:element name="colgroup">
+                <xsl:call-template name="create-col-element">
+                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                </xsl:call-template>
+            </xsl:element>
+
+
+            <!-- all elements before the first tabStop -->
+            <xsl:variable name="testNo-RTF">
+                <xsl:apply-templates select="node()" mode="cell-content"/>
+            </xsl:variable>
+
+
+        <xsl:choose>
+            <xsl:when test="function-available('xt:node-set')">
+                <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
+                       <xsl:element name="tr">
+                        <xsl:call-template name="create-td-elements">
+                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+                    <xsl:with-param name="position"         select="1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:element>
+
+            </xsl:when>
+            <xsl:when test="function-available('xalan:nodeset')">
+                <xsl:variable name="tabNodePositions" select="xalan:nodeset($testNo-RTF)"/>
+                       <xsl:element name="tr">
+                        <xsl:call-template name="create-td-elements">
+                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+                    <xsl:with-param name="position"         select="1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:element>
+
+            </xsl:when>
+        </xsl:choose>
+
+           <!-- <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
+
+            <xsl:element name="tr">
+                <xsl:call-template name="create-td-elements">
+                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
+                    <xsl:with-param name="position"         select="1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:element>-->
+
+
+        </xsl:element>
+    </xsl:template>
+
+
+    <xsl:template name="create-col-element">
+        <xsl:param name="lastNodePosition"/>
+        <xsl:param name="allTabStopStyles"/>
+
+        <xsl:for-each select="$allTabStopStyles/style:tab-stop">
+            <xsl:element name="col">
+                <xsl:attribute name="style">
+                    <xsl:text>width: </xsl:text>
+                    <xsl:call-template name="grap-cell-width">
+                        <xsl:with-param name="position"         select="position()"/>
+                        <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                    </xsl:call-template>
+                </xsl:attribute>
+            </xsl:element>
+        </xsl:for-each>
+
+    </xsl:template>
+<!--
+Scenarios tabstops
+
+1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
+ -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.
+
+2) style:type is 'right' and earlier tabStop is right
+ -> following text-nodes, will be put into a right aligned TD
+
+3) style:type is 'non-right' and earlier tabStop 'non-right' as well
+ -> put the preceding tab stops into a TD (left aligned is default)
+
+4) first style:type would have no right precedign tabStop
+ -> works well with first sceanrios 1 and 3
+
+5) last style:type would be a special case, if it would be left aligned, but this won't happen in our case.. :D
+
+Scenarios unmatched:
+- text:styleposition 'center' will not be matched in our case (effort for nothing), there will be only 'right' and not 'right'
+- If the last tabStop is not from text:stylepostion 'right', the length of the last cell is undefined and a document length must be found.
+  Not happens in our global document case. Also the algorithm below would have to be expanded (cp. scenario 5).
+
+-->
+    <xsl:template name="create-td-elements">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="lastNodePosition"/>
+        <xsl:param name="position"/>
+        <xsl:param name="allTabStopStyles"/>
+        <xsl:param name="tabNodePositions"/>
+<!--
+<xsl:message>++++++++</xsl:message>
+<xsl:message>Position: <xsl:value-of select="$position"/></xsl:message>
+<xsl:message>lastNodePosition: <xsl:value-of select="$lastNodePosition"/></xsl:message>
+-->
+
+        <xsl:variable name="currentStyleType" select="$allTabStopStyles/style:tab-stop[$position]/@style:type"/>
+        <xsl:variable name="earlierStyleType" select="$allTabStopStyles/style:tab-stop[$position - 1]/@style:type"/>
+        <xsl:choose>
+            <xsl:when test="$currentStyleType = 'right'">
+                <xsl:choose>
+                    <xsl:when test="$earlierStyleType = 'right'">
+                        <!--
+                        2) style:type is 'right' and earlier tabStop is right
+                            -> following text-nodes, will be put into a right aligned TD -->
+                        <xsl:element name="td">
+                            <xsl:attribute name="style">
+                                <xsl:text>align: right</xsl:text>
+                            </xsl:attribute>
+                            <xsl:call-template name="grap-cell-content-before-tab-stop">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                <xsl:with-param name="endingTabStopPosition"  select="$position + 1"/>
+                                <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+                                <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                            </xsl:call-template>
+                        </xsl:element>
+                    </xsl:when>
+                    <xsl:otherwise>
+                    <!--
+                        1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
+                         -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.-->
+<!-- valid HTML but browsers make a line break (border=0 and paragraphstyle also missing):
+                        <xsl:element name="table">
+                            <xsl:element name="td">
+                                <xsl:call-template name="grap-cell-content-before-tab-stop">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    <xsl:with-param name="endingTabStopPosition"  select="$position"/>
+                                    <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+                                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                                </xsl:call-template>
+                            </xsl:element>
+                            <xsl:element name="td">
+                                <xsl:attribute name="style">
+                                    <xsl:text>align: right</xsl:text>
+                                </xsl:attribute>
+                                <xsl:call-template name="grap-cell-content-before-tab-stop">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    <xsl:with-param name="endingTabStopPosition"  select="$position + 1"/>
+                                    <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+                                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                                </xsl:call-template>
+                            </xsl:element>
+                        </xsl:element>
+-->
+                            <xsl:element name="td">
+                                <xsl:call-template name="grap-cell-content-before-tab-stop">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    <xsl:with-param name="endingTabStopPosition"  select="$position"/>
+                                    <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+                                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                                </xsl:call-template>
+<!-- ODK FEATURE NO PAGES
+                                <xsl:element name="td">
+                                    <xsl:attribute name="style">
+                                        <xsl:text>align: right</xsl:text>
+                                    </xsl:attribute>
+                                    <xsl:call-template name="grap-cell-content-before-tab-stop">
+                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                        <xsl:with-param name="endingTabStopPosition"  select="$position + 1"/>
+                                        <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+                                        <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                                    </xsl:call-template>
+                                </xsl:element>          -->
+                            </xsl:element>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:choose>
+                    <xsl:when test="$earlierStyleType = 'right'">
+                    </xsl:when>
+                    <xsl:otherwise>
+                    <!--
+                       3) style:type is 'non-right' and earlier tabStop 'non-right' as well
+                            -> put the preceding tab stops into a TD (left aligned is default) -->
+                        <xsl:element name="td">
+                            <xsl:call-template name="grap-cell-content-before-tab-stop">
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                <xsl:with-param name="endingTabStopPosition"  select="$position"/>
+                                <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+                                <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+                            </xsl:call-template>
+                        </xsl:element>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+
+        <xsl:if test="$position != $lastNodePosition">
+            <xsl:call-template name="create-td-elements">
+                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
+                <xsl:with-param name="position"         select="$position + 1"/>
+                <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
+            </xsl:call-template>
+        </xsl:if>
+    </xsl:template>
+
+
+    <xsl:template name="grap-cell-content-before-tab-stop">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="endingTabStopPosition"/>
+        <xsl:param name="tabNodePositions"/>
+        <xsl:param name="lastNodePosition"/>
+
+        <xsl:choose>
+            <xsl:when test="$endingTabStopPosition = 1">
+                <xsl:apply-templates mode="content-table" select="node()[position() &lt; $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]]">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:when test="$endingTabStopPosition > $lastNodePosition">
+                <xsl:apply-templates mode="content-table" select="node()[position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:apply-templates>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:apply-templates mode="content-table" select="node()[position() &lt; $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]][position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template mode="content-table" match="text:s">
+        <xsl:call-template name="write-breakable-whitespace">
+            <xsl:with-param name="whitespaces" select="@text:c"/>
+        </xsl:call-template>
+    </xsl:template>
+
+
+    <xsl:template match="*" mode="cell-content">
+
+        <xsl:if test="name() = 'text:tab-stop' or *[name() = 'text:tab-stop']">
+            <xsl:element name="tab-stop-node-position">
+                <xsl:value-of select="position()"/>
+            </xsl:element>
+        </xsl:if>
+    </xsl:template>
+
+
+    <xsl:template name="grap-cell-width">
+        <xsl:param name="position"/>
+        <xsl:param name="allTabStopStyles"/>
+
+        <xsl:variable name="tabStopPosition" select="$allTabStopStyles/style:tab-stop[$position]/@style:position"/>
+        <xsl:choose>
+            <xsl:when test="contains($tabStopPosition, 'cm')">
+                <xsl:call-template name="create-cell-width">
+                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'cm'))"/>
+                    <xsl:with-param name="unit"     select="'cm'"/>
+                    <xsl:with-param name="position" select="$position - 1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="contains($tabStopPosition, 'in')">
+                <xsl:call-template name="create-cell-width">
+                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'in'))"/>
+                    <xsl:with-param name="unit"     select="'in'"/>
+                    <xsl:with-param name="position" select="$position - 1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="contains($tabStopPosition, 'ch')">
+                <xsl:call-template name="create-cell-width">
+                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'ch'))"/>
+                    <xsl:with-param name="unit"     select="'ch'"/>
+                    <xsl:with-param name="position" select="$position - 1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="contains($tabStopPosition, 'pt')">
+                <xsl:call-template name="create-cell-width">
+                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'pt'))"/>
+                    <xsl:with-param name="unit"     select="'pt'"/>
+                    <xsl:with-param name="position" select="$position - 1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template name="create-cell-width">
+        <xsl:param name="width"/>
+        <xsl:param name="unit"/>
+        <xsl:param name="position"/>
+        <xsl:param name="allTabStopStyles"/>
+
+        <xsl:choose>
+            <xsl:when test="$position > 1">
+                <xsl:call-template name="create-cell-width">
+                    <xsl:with-param name="width"    select="$width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit))"/>
+                    <xsl:with-param name="unit"     select="$unit"/>
+                    <xsl:with-param name="position" select="$position - 1"/>
+                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="$position = 1">
+                <xsl:value-of select="concat($width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit)), $unit)"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="concat($width, $unit)"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+</xsl:stylesheet>
\ No newline at end of file
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/main_html.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/main_html.xsl
new file mode 100644 (file)
index 0000000..443182a
--- /dev/null
@@ -0,0 +1,462 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+    <xsl:output method      ="xml"
+                encoding    ="UTF-8"
+                indent      ="yes"/>
+
+
+
+    <!--+++++ INCLUDED XSL MODULES +++++-->
+    <!-- inherited style properties will be collected and written in a CSS header (CSS) -->
+    <xsl:include href="style_header.xsl"/>
+
+    <!-- inherited style properties will be collected and written as html properties in a temporary variable (HTML4, PALM) -->
+    <xsl:include href="style_inlined.xsl"/>
+
+    <!-- our xml style properties will be mapped to CSS and HTML4.x properties -->
+    <xsl:include href="style_mapping.xsl"/>
+
+    <!-- common element handling -->
+    <xsl:include href="common.xsl"/>
+
+    <!-- table handling -->
+    <xsl:include href="table.xsl"/>
+
+    <!-- palm handling -->
+    <xsl:include href="palm.xsl"/>
+
+    <!-- global document handling -->
+    <xsl:include href="global_document.xsl"/>
+
+
+
+
+
+
+
+    <!--+++++ PARAMETER FROM THE APPLICATION AND GLOBAL VARIABLES +++++-->
+
+    <!-- MANDATORY: URL of meta stream -->
+    <xsl:param name="metaFileURL"/>
+
+    <!-- MANDATORY: URL of styles stream -->
+    <xsl:param name="stylesFileURL"/>
+
+    <!-- MANDATORY: for resolving relative links
+        For resolving realtive links to the packed SO document, i.e. the path/URL of the jared sxw file (e.g. meta.xml, styles.xml, links to graphics in a relative directory) -->
+    <xsl:param name="absoluteSourceDirRef"/>
+
+    <!-- OPTIONAL (mandatory, when when source is compressed): Necessary for the in the packed OO document embedded files (mostly graphics from the compressed /Picture dir).
+         When the OpenOffice (OO) file has been unpacked the absoluteSoureDirRef can be taken,
+         Otherwise, a JAR URL could be choosen or when working with OpenOffice a so called Package-URL encoded over HTTP can be used to
+         access the jared contents of the the jared document. . -->
+    <xsl:param name="jaredRootURL" select="$absoluteSourceDirRef"/>
+
+    <!-- OPTIONAL (mandatory, when used in session based environment)
+         Useful for WebApplications: if a HTTP session is not cookie based, URL rewriting is beeing used (the session is appended to the URL).
+         This URL session is used when creating links to graphics by XSLT. Otherwise the user havt to log again in for every graphic he would like to see. -->
+    <xsl:param name="optionalURLSuffix"/>
+
+    <!-- OPTIONAL: DPI (dots per inch) the standard solution of given pictures (necessary for the conversion of 'cm' into 'pixel')-->
+    <!-- Although many pictures have the 96 dpi resolution, a higher resoltion give better results for common browsers -->
+    <xsl:param name="dpi" select="96"/>
+
+    <!-- OPTIONAL: in case of using a different processor than a JAVA XSLT, you can unable the Java functionality
+         (i.e. debugging time and encoding chapter names for the content-table as href and anchors ) -->
+    <xsl:param name="disableJava"    select="false"/>
+    <xsl:param name="isJavaDisabled" select="boolean($disableJava)"/>
+
+    <!-- OPTIONAL: user-agent will be differntiated by this parameter given by application (e.g. java servlet)-->
+    <xsl:param name="outputType" select="'CSS_HEADER'"/>
+    <!-- set of possible deviceTyps (WML is set in its own startfile main_wml.xsl):
+    <xsl:param name="outputType" select="'CSS_HEADER'"/>
+    <xsl:param name="outputType" select="'CSS_INLINED'"/>
+    <xsl:param name="outputType" select="'PALM'"/> -->
+
+    <!-- OPTIONAL: for activating the debug mode set the variable here to 'true()' or give any value from outside -->
+    <xsl:param name="debug"         select="false"/>
+    <xsl:param name="isDebugMode"   select="boolean($debug)"/>
+
+<!-- *************************************************************************
+    OPTIONAL: NEEDED IN CONNECTION WITH A GLOBAL DOCUMENT -->
+
+    <!--SUMMARY:
+         following parameter triggers a (quite time consuming) enabling of bookmarks in the table-of-content.
+        IN DETAIL:
+         Currently some links used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
+         is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
+         links in the Office XML.
+         A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
+         can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
+         All header titles gonna be encoding to be usable in a relative URL.    -->
+    <xsl:param name="disableLinkedTableOfContent" select="false()"/>
+
+    <!-- The chapter numbers of the current document (as a sequence of a global document) is dependent of the number
+        of chapter of the same level in preceding documents. -->
+    <xsl:param name="precedingChapterLevel1"  select="0"/>
+    <xsl:param name="precedingChapterLevel2"  select="0"/>
+    <xsl:param name="precedingChapterLevel3"  select="0"/>
+    <xsl:param name="precedingChapterLevel4"  select="0"/>
+    <xsl:param name="precedingChapterLevel5"  select="0"/>
+    <xsl:param name="precedingChapterLevel6"  select="0"/>
+    <xsl:param name="precedingChapterLevel7"  select="0"/>
+    <xsl:param name="precedingChapterLevel8"  select="0"/>
+    <xsl:param name="precedingChapterLevel9"  select="0"/>
+    <xsl:param name="precedingChapterLevel10" select="0"/>
+
+    <!-- XML documents containing a table of contents,
+        gonna link for usability reason above each chapter to the preceding and following document and the content table -->
+    <xsl:param name="contentTableURL"/>
+
+    <!-- Needed for the bug workaround of missing content table links
+        by this ambigous HTML references from the content table can be evoided-->
+    <xsl:param name="globalDocumentRefToCurrentFile"/>
+
+    <!-- Needed for the bug workaround of missing content table links
+        by this node-set the relation between content-table link and children document header can be unambigous established -->
+    <xsl:param name="contentTableHeadings"/>
+
+
+<!-- END OF GLOBAL DOCUMENT SECTION
+*************************************************************************-->
+
+
+
+    <!-- works for normal separated zipped xml files as for flat filter single xml file format as well -->
+    <xsl:variable name="office:meta-file"           select="document($metaFileURL)"/>
+    <xsl:variable name="office:styles-file"         select="document($stylesFileURL)"/>
+    <xsl:variable name="office:font-decls"          select="$office:styles-file/*/office:font-decls"/>
+    <xsl:variable name="office:styles"              select="$office:styles-file/*/office:styles"/>
+    <!-- office:automatic-styles may occure in two different files (i.d. content.xml and styles.xml). Furthermore the top level tag is different in a flat xml file -->
+    <xsl:variable name="office:automatic-styles"    select="/*/office:automatic-styles"/>
+
+    <!-- simple declaration of WML used to avoid parser errors -->
+    <xsl:variable name="wap-paragraph-elements-without-table-row"/>
+    <xsl:variable name="wap-paragraph-elements"/>
+    <xsl:template name="wml-repeat-write-row"/>
+
+
+    <!-- ************************************* -->
+    <!-- *** build the propriate HTML file *** -->
+    <!-- ************************************* -->
+
+    <xsl:template match="/">
+
+        <!--<xsl:message>
+
+
+        Entered the styleSheets, transformation begins... </xsl:message>-->
+
+        <xsl:choose>
+            <xsl:when test="$isDebugMode">
+                <xsl:call-template name="check-parameter"/>
+
+                <xsl:if test="not($isJavaDisabled)">
+                    <xsl:call-template name="debug-style-collecting-time"/>
+                </xsl:if>
+            </xsl:when>
+            <xsl:otherwise>
+                <!-- to access the variable like a node-set it is necessary to convert it
+                     from a result-tree-fragment (RTF) to a node set using the James Clark extension -->
+                <xsl:variable name="collectedGlobalData-RTF">
+                    <xsl:call-template name='create-all-inline-styles'/>
+                </xsl:variable>
+
+                <xsl:choose>
+                    <xsl:when test="function-available('xt:node-set')">
+                        <xsl:call-template name="start">
+                            <xsl:with-param name="collectedGlobalData" select="xt:node-set($collectedGlobalData-RTF)"/>
+                        </xsl:call-template>
+                    </xsl:when>
+                    <xsl:when test="function-available('xalan:nodeset')">
+                        <xsl:call-template name="start">
+                            <xsl:with-param name="collectedGlobalData" select="xalan:nodeset($collectedGlobalData-RTF)"/>
+                        </xsl:call-template>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:element name="NodeSetFunctionNotAvailable"/>
+                        <xsl:call-template name="start"/>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <xsl:template name="start">
+        <xsl:param name="collectedGlobalData"/>
+
+        <xsl:choose>
+            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER'">
+                <xsl:element name="html">
+                    <xsl:element name="head">
+                        <xsl:if test="$isDebugMode"><xsl:message>CSS helper variable will be created....</xsl:message></xsl:if>
+                        <xsl:call-template name='common-header-properties'/>
+                        <xsl:if test="$isDebugMode"><xsl:message>CSS variable ready, header will be created....</xsl:message></xsl:if>
+                        <!-- constructing the css header simulating inheritance of style-families by style order -->
+                        <xsl:call-template name='create-css-styleheader'/>
+                        <xsl:if test="$isDebugMode"><xsl:message>CSS header creation finished!</xsl:message></xsl:if>
+                    </xsl:element>
+
+
+
+                    <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
+                    <xsl:element name="body">
+                        <!-- background image -->
+                        <xsl:if test="$backgroundImageURL">
+                            <xsl:attribute name="background">
+                                <xsl:choose>
+                                    <!-- for images jared in open office document -->
+                                    <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
+                                        <!-- creating an absolute http URL to the contained/packed image file -->
+                                        <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:attribute>
+                        </xsl:if>
+
+                        <!-- processing the content of the xml file -->
+                        <xsl:apply-templates select="/*/office:body">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:apply-templates>
+                    </xsl:element>
+
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ HTML 4.0 INLINING  +++++-->
+            <xsl:when test="$outputType = 'CSS_INLINED'">
+                <xsl:element name="html">
+                    <xsl:element name="head">
+                        <xsl:call-template name='common-header-properties'/>
+                    </xsl:element>
+
+                    <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
+                    <xsl:element name="body">
+                        <!-- background image -->
+                        <xsl:if test="$backgroundImageURL">
+                            <xsl:attribute name="background">
+                                <xsl:choose>
+                                    <!-- for images jared in open office document -->
+                                    <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
+                                        <!-- creating an absolute http URL to the contained/packed image file -->
+                                        <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:attribute>
+                        </xsl:if>
+                        <xsl:apply-templates select="/*/office:body">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:apply-templates>
+                    </xsl:element>
+                </xsl:element>
+            </xsl:when>
+
+            <!--+++++ PALM-VII (3.2 HTML SUBSET)  +++++-->
+            <xsl:when test="$outputType = 'PALM'">
+                <!-- the proxy will convert the html file later to PQA -->
+                <xsl:element name="html">
+                    <xsl:element name="head">
+                        <xsl:call-template name='palm-header-properties'/>
+                    </xsl:element>
+
+                    <xsl:element name="body">
+                        <!-- processing the content of the xml file -->
+                        <xsl:apply-templates select="/*/office:body">
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:apply-templates>
+                    </xsl:element>
+                </xsl:element>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <!-- ********************************************* -->
+    <!-- *** Header for CSS_INLINED and CSS_HEADER *** -->
+    <!-- ********************************************* -->
+
+    <xsl:template name='common-header-properties'>
+        <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:title"/>
+        <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:description"/>
+<!--2DO add further header elements..
+        <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:subject"/>
+        <xsl:apply-templates select="$office:meta-file/*/office:meta/meta:keywords[postition()=1]"/>-->
+    </xsl:template>
+
+    <xsl:template match="dc:title">
+        <xsl:element name="title">
+            <xsl:value-of select="."/>
+        </xsl:element>
+    </xsl:template>
+
+    <xsl:template match="dc:description">
+        <xsl:element name="meta">
+            <xsl:attribute name="name">
+                <xsl:text>description</xsl:text>
+            </xsl:attribute>
+            <xsl:attribute name="content">
+                <xsl:value-of select="."/>
+            </xsl:attribute>
+        </xsl:element>
+    </xsl:template>
+
+
+    <!-- ********************************************* -->
+    <!-- *** Measuring the time for style creating *** -->
+    <!-- ********************************************* -->
+
+
+    <xsl:template name="debug-style-collecting-time">
+
+        <xsl:variable name="startTime-RTF">
+            <xsl:choose>
+                <xsl:when test="function-available('system:current-time-millis')">
+                    <xsl:value-of select="system:current-time-millis()"/>
+                </xsl:when>
+                <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
+                    <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
+                </xsl:when>
+            </xsl:choose>
+        </xsl:variable>
+
+
+
+        <xsl:variable name="collectedGlobalData-RTF">
+            <xsl:call-template name='create-all-inline-styles'/>
+        </xsl:variable>
+
+
+        <xsl:choose>
+            <xsl:when test="function-available('xt:node-set')">
+                <xsl:message>Creating the inline styles....</xsl:message>
+                <xsl:variable name="startTime"              select="number(xt:node-set($startTime-RTF))"/>
+                <xsl:variable name="collectedGlobalData"    select="xt:node-set($collectedGlobalData-RTF)"/>
+                <xsl:variable name="endTime"                select="system:current-time-millis()"/>
+
+                <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
+                <xsl:call-template name="start">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="function-available('xalan:nodeset')">
+                <xsl:message>Creating the inline styles....</xsl:message>
+                <xsl:variable name="startTime"              select="number(xalan:nodeset($startTime-RTF))"/>
+                <xsl:variable name="endTime"                select="java:java.lang.System.currentTimeMillis()"/>
+                <xsl:variable name="collectedGlobalData"    select="xalan:nodeset($collectedGlobalData-RTF)"/>
+
+                <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
+                <xsl:call-template name="start">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose>
+
+    </xsl:template>
+
+    <!-- DEBUG purpose only: checking the parameters of this template-->
+    <xsl:template name="check-parameter">
+        <xsl:message>Parameter dpi: <xsl:value-of select="$dpi"/></xsl:message>
+        <xsl:message>Parameter metaFileURL: <xsl:value-of select="$metaFileURL"/></xsl:message>
+        <xsl:message>Parameter stylesFileURL: <xsl:value-of select="$stylesFileURL"/></xsl:message>
+        <xsl:message>Parameter absoluteSourceDirRef: <xsl:value-of select="$absoluteSourceDirRef"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel1 : <xsl:value-of select="$precedingChapterLevel1"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel2 : <xsl:value-of select="$precedingChapterLevel2"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel3 : <xsl:value-of select="$precedingChapterLevel3"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel4 : <xsl:value-of select="$precedingChapterLevel4"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel5 : <xsl:value-of select="$precedingChapterLevel5"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel6 : <xsl:value-of select="$precedingChapterLevel6"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel7 : <xsl:value-of select="$precedingChapterLevel7"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel8 : <xsl:value-of select="$precedingChapterLevel8"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel9 : <xsl:value-of select="$precedingChapterLevel9"/></xsl:message>
+        <xsl:message>Parameter precedingChapterLevel10: <xsl:value-of select="$precedingChapterLevel10"/></xsl:message>
+    </xsl:template>
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/palm.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/palm.xsl
new file mode 100644 (file)
index 0000000..212edb1
--- /dev/null
@@ -0,0 +1,404 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+    <xsl:output cdata-section-elements="meta"/>
+
+
+    <!-- **************************** -->
+    <!-- *** specific palm header *** -->
+    <!-- **************************** -->
+
+    <xsl:template name='palm-header-properties'>
+        <xsl:element name="meta">
+            <xsl:attribute name="name">PalmComputingPlatform</xsl:attribute>
+            <xsl:attribute name="content">true</xsl:attribute>
+        </xsl:element>
+        <xsl:element name="meta">
+            <xsl:attribute name="name">HandheldFriendly</xsl:attribute>
+            <xsl:attribute name="content">true</xsl:attribute>
+        </xsl:element>
+        <xsl:element name="meta">
+            <xsl:attribute name="name">HistoryListText</xsl:attribute>
+            <xsl:attribute name="content">Dateimanager&#10;: &amp;date &amp;time</xsl:attribute>
+        </xsl:element>
+        <xsl:element name="meta">
+            <xsl:attribute name="name">description</xsl:attribute>
+            <xsl:attribute name="content">StarPortal</xsl:attribute>
+        </xsl:element>
+        <xsl:element name="meta">
+            <xsl:attribute name="name">keywords</xsl:attribute>
+            <xsl:attribute name="content">starportal, staroffice, software</xsl:attribute>
+        </xsl:element>
+        <xsl:element name="meta">
+            <xsl:attribute name="http-equiv">Content-Type</xsl:attribute>
+            <xsl:attribute name="content">text/html; charset=iso-8859-1</xsl:attribute>
+        </xsl:element>
+    </xsl:template>
+
+
+    <!-- ********************************* -->
+    <!-- *** creating table attributes *** -->
+    <!-- ********************************* -->
+
+    <!-- table data (td) and table header (th) attributes -->
+    <xsl:template name="create-attribute-ALIGN">
+        <xsl:param name="styleProperties"/>
+
+        <xsl:if test="contains($styleProperties, 'align')">
+            <xsl:attribute name="align">
+                 <xsl:choose>
+                    <xsl:when test="contains($styleProperties, 'align:left')">
+                        <xsl:text>left</xsl:text>
+                    </xsl:when>
+                    <xsl:when test="contains($styleProperties, 'align:right')">
+                        <xsl:text>right</xsl:text>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:text>center</xsl:text>
+                    </xsl:otherwise>
+                 </xsl:choose>
+            </xsl:attribute>
+        </xsl:if>
+    </xsl:template>
+
+
+    <!-- ********************************* -->
+    <!-- *** creating List attributes  *** -->
+    <!-- ********************************* -->
+<!--
+    <xsl:template name="create-list-attributes">
+        <xsl:param name="styleProperties"/>
+
+
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+2 be implemented
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+    </xsl:template>
+-->
+
+    <!-- ************************************************ -->
+    <!-- *** creating nested format tags (PALM & WML) *** -->
+    <!-- ************************************************ -->
+
+    <!-- Italic -->
+    <xsl:template name="create-nested-format-tags">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="styleProperties"/>
+        <xsl:choose>
+            <xsl:when test="contains($styleProperties, 'italic')">
+                <xsl:element name="i">
+                    <xsl:call-template name="bold">
+                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="bold">
+                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- Bold -->
+    <xsl:template name="bold">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="styleProperties"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($styleProperties, 'bold')">
+                <xsl:element name="b">
+                    <xsl:call-template name="underline">
+                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="underline">
+                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- Underline : last format attribute, which is also used from WML - WML ends here! -->
+    <xsl:template name="underline">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="styleProperties"/>
+
+        <xsl:choose>
+            <xsl:when test="$outputType = 'PALM'">
+                <xsl:choose>
+                    <xsl:when test="contains($styleProperties, 'underline')">
+                        <xsl:element name="u">
+                            <xsl:call-template name="strikethrough">
+                                <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:call-template>
+                        </xsl:element>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:call-template name="strikethrough">
+                            <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:call-template>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:choose>
+                    <xsl:when test="contains($styleProperties, 'underline')">
+                        <xsl:element name="u">
+                            <xsl:apply-templates>
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:apply-templates>
+                        </xsl:element>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <xsl:apply-templates>
+                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        </xsl:apply-templates>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- strikethrough -->
+    <xsl:template name="strikethrough">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="styleProperties"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($styleProperties, 'strike')">
+                <xsl:element name="strike">
+                    <xsl:call-template name="align">
+                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="align">
+                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- Alignment -->
+    <xsl:template name="align">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="styleProperties"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($styleProperties, 'align')">
+                <xsl:element name="div">
+                    <xsl:attribute name="align">
+                         <xsl:choose>
+                            <xsl:when test="contains($styleProperties, 'align:left')">
+                                <xsl:text>left</xsl:text>
+                            </xsl:when>
+                            <xsl:when test="contains($styleProperties, 'align:right')">
+                                <xsl:text>right</xsl:text>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:text>center</xsl:text>
+                            </xsl:otherwise>
+                         </xsl:choose>
+                    </xsl:attribute>
+                    <xsl:call-template name="font_combined">
+                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:call-template>
+                </xsl:element>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="font_combined">
+                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- Both size and Color for font -->
+    <xsl:template name="font_combined">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="styleProperties"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($styleProperties, 'color') and contains($styleProperties, 'size')">
+                <xsl:element name="font">
+
+                    <xsl:attribute name="color">
+                         <xsl:choose>
+                            <xsl:when test="contains($styleProperties, 'color:#000000')">
+                                <xsl:text>#000000</xsl:text>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:text>#FFFFFF</xsl:text>
+                            </xsl:otherwise>
+                         </xsl:choose>
+                    </xsl:attribute>
+
+                    <xsl:attribute name="size">
+                        <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
+                    </xsl:attribute>
+
+                    <!-- get the embedded content -->
+                    <xsl:apply-templates>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:apply-templates>
+                </xsl:element>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:call-template name="font_simple">
+                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- size or Color for font -->
+    <xsl:template name="font_simple">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="styleProperties"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($styleProperties, 'color')">
+                <xsl:element name="font">
+                    <xsl:attribute name="color">
+                         <xsl:choose>
+                            <xsl:when test="contains($styleProperties, 'color:#000000')">
+                                <xsl:text>#000000</xsl:text>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:text>#FFFFFF</xsl:text>
+                            </xsl:otherwise>
+                         </xsl:choose>
+                    </xsl:attribute>
+
+                    <!-- get the embedded content -->
+                    <xsl:apply-templates>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:apply-templates>
+                </xsl:element>
+            </xsl:when>
+
+            <xsl:when test="contains($styleProperties, 'size')">
+                <xsl:element name="font">
+                    <xsl:attribute name="size">
+                        <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
+                    </xsl:attribute>
+
+                    <!-- get the embedded content -->
+                    <xsl:apply-templates>
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    </xsl:apply-templates>
+                </xsl:element>
+            </xsl:when>
+
+            <xsl:otherwise>
+                <!-- get the embedded content -->
+                <xsl:apply-templates>
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                </xsl:apply-templates>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_header.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_header.xsl
new file mode 100644 (file)
index 0000000..eeb0c20
--- /dev/null
@@ -0,0 +1,379 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+
+    <!-- ****************************** -->
+    <!-- *** style sheet processing *** -->
+    <!-- ****************************** -->
+
+
+    <xsl:template name='create-css-styleheader'>
+        <xsl:comment>
+            <xsl:text>The CSS style header method for setting styles</xsl:text>
+        </xsl:comment>
+        <xsl:element name="style">
+            <xsl:attribute name="type">text/css</xsl:attribute>
+            <xsl:comment>
+                <xsl:text>
+
+        </xsl:text>
+                <xsl:call-template name="write-default-styles"/>
+
+                <!-- THE STYLE PROPERTIES OF THE FIRST WRITTEN STYLE (PARENT) IS GIVEN OUT -->
+
+                <!-- 1) styles from office:styles are possible parent from all (itself or office:automatic-styles).
+                     Therefore they are created first.
+                     Beginning with the top-level parents (the styles without any parent). -->
+                <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
+
+                    <xsl:call-template name="write-styleproperty-line"/>
+                    <xsl:call-template name="write-styleproperty-lines-for-children"/>
+                </xsl:for-each>
+
+                <xsl:text> </xsl:text>
+
+                <!-- 2) styles from office:automatic-styles can only be parent of styles from the office:automatic-styles section.
+                     Beginning with top-level styles, again, all children style will be recursivly traversed -->
+                <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
+                    <xsl:call-template name="write-styleproperty-line">
+                        <xsl:with-param name="searchOnlyInAutomaticStyles" select="true()"/>
+                    </xsl:call-template>
+                    <xsl:call-template name="write-styleproperty-lines-for-children">
+                        <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+                    </xsl:call-template>
+                </xsl:for-each>
+            //</xsl:comment>
+        </xsl:element>
+    </xsl:template>
+
+
+    <xsl:template name='write-styleproperty-line'>
+        <xsl:param name="searchOnlyInAutomaticStyles"/>
+
+        <xsl:variable name="styleProperties">
+            <xsl:call-template name="write-style-properties">
+                <xsl:with-param name="styleAttributePath"   select="current()/style:properties/@*"/>
+            </xsl:call-template>
+        </xsl:variable>
+
+        <!-- do not write styles with no css property -->
+        <xsl:if test="not(string-length($styleProperties) = 0)">
+            <!-- write out the name of the current (parent) style in the CSS headersection (e.g. "span.myStyle") -->
+            <xsl:call-template name="write-style-name">
+                <xsl:with-param name="is-parent-style" select="true()"/>
+            </xsl:call-template>
+
+            <!-- the names of all styles children will be written out(office:style AND office:automatic-style) -->
+            <xsl:call-template name="write-children-style-names">
+                <xsl:with-param name="parentStyleName"          select="@style:name"/>
+                <xsl:with-param name="parentStyleFamily"        select="@style:family"/>
+                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+            </xsl:call-template>
+
+        <!-- the style properties of the first written style (parent) is given out -->
+        <xsl:text> {
+                </xsl:text>
+                <xsl:value-of select="$styleProperties"/>
+        <xsl:text>}
+        </xsl:text>
+
+        </xsl:if>
+
+
+
+    </xsl:template>
+
+
+
+
+    <!-- RECURSION WITH ENDCONDITON: adding style classes for all existing childs -->
+    <xsl:template name='write-styleproperty-lines-for-children'>
+        <xsl:param name="searchOnlyInAutomaticStyles"/>
+
+        <xsl:variable name="parentStyleName"    select="@style:name"/>
+        <xsl:variable name="parentStyleFamily"  select="@style:family"/>
+
+        <xsl:if test="not(searchOnlyInAutomaticStyles)">
+            <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+                <xsl:call-template name="write-styleproperty-line"/>
+                <xsl:call-template name="write-styleproperty-lines-for-children"/>
+            </xsl:for-each>
+        </xsl:if>
+        <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+            <xsl:call-template name="write-styleproperty-line">
+                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+            </xsl:call-template>
+            <xsl:call-template name="write-styleproperty-lines-for-children">
+                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+            </xsl:call-template>
+        </xsl:for-each>
+    </xsl:template>
+
+
+    <xsl:template name="write-default-styles">
+
+        <!-- some default attributes in xml have to be explicitly set in HTML (e.g. margin-top="0") -->
+        <xsl:text>*.OOo_defaults</xsl:text>
+
+                <xsl:for-each select="$office:styles/style:style">
+                    <xsl:text>, </xsl:text>
+                    <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+                </xsl:for-each>
+
+                <xsl:for-each select="$office:automatic-styles/style:style">
+                    <xsl:text>, </xsl:text>
+                    <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+                </xsl:for-each>
+        <!-- 2DO: the defaults might be better collected and written in a separated (XML) file -->
+<xsl:text> {
+                margin-top:0cm; margin-bottom:0cm; }
+        </xsl:text>
+
+        <xsl:for-each select="$office:styles/style:default-style">
+            <xsl:call-template name="write-default-style"/>
+        </xsl:for-each>
+
+        <xsl:for-each select="$office:automatic-styles/style:default-style">
+            <xsl:call-template name="write-default-style"/>
+        </xsl:for-each>
+
+    </xsl:template>
+
+
+
+    <xsl:template name="write-default-style">
+        <xsl:variable name="family-style" select="@style:family"/>
+
+        <!-- some default attributes for format families (e.g. graphics, paragraphs, etc.) written as style:default-style -->
+        <xsl:value-of select="concat('*.', translate($family-style, '. %()/\', ''), '_defaults')"/>
+
+        <xsl:for-each select="$office:styles/style:style[@style:family = $family-style]">
+            <xsl:text>, </xsl:text>
+            <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+        </xsl:for-each>
+
+        <xsl:for-each select="$office:automatic-styles/style:style[@style:family = $family-style]">
+            <xsl:text>, </xsl:text>
+            <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
+        </xsl:for-each>
+
+
+        <xsl:variable name="styleProperties">
+            <xsl:call-template name="write-style-properties">
+                <xsl:with-param name="styleAttributePath"   select="current()/style:properties/@*"/>
+            </xsl:call-template>
+        </xsl:variable>
+
+        <!-- do not write styles with no css property -->
+        <xsl:if test="not(string-length($styleProperties) = 0)">
+        <!-- the style properties of the first written style (parent) is given out -->
+        <xsl:text> {
+                </xsl:text>
+                <xsl:value-of select="$styleProperties"/>
+        <xsl:text>}
+        </xsl:text>
+        </xsl:if>
+
+    </xsl:template>
+
+
+    <!--++
+          The parent style will be written out!
+          For each Style:family a prefix must be added
+            <!ENTITY % styleFamily
+            "(paragraph|text|section|table|table-column|table-row|table-cell|table-page|chart|graphics|default|drawing-page|presentation|control)">
+        ++-->
+    <xsl:template name="write-style-name">
+        <xsl:param name="is-parent-style"/>
+
+        <!-- This construct is for list elements. Whenever a paragraph element is being used as child of a list element the name paragraph style is been used for
+            the list item. This can be switched as the paragaph style-name and the list-style-name are in the same element.
+            Otherwise there would be formatting errors (e.g. margin-left will be used for the content in the list elment and not for the list element itself). -->
+        <xsl:variable name="style-name">
+            <xsl:choose>
+                <xsl:when test="@style:list-style-name">
+                    <xsl:value-of select="@style:list-style-name"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:value-of select="@style:name"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:variable>
+
+        <xsl:if test="not($is-parent-style)">
+            <xsl:text>, </xsl:text>
+        </xsl:if>
+
+        <xsl:choose>
+            <!-- normally 'p.' would be used as CSS element,
+                 but header (h1, h2,...) are also from the style:family paragraph -->
+            <xsl:when test="@style:family='paragraph'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='text'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='section'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='table'">
+                <xsl:value-of select="concat('table.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='table-column'">
+            <!-- as column styles have to be included as span styles AFTER the table (no two class attributes in TD allowed -->
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='table-row'">
+                <xsl:value-of select="concat('tr.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='table-cell'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='table-page'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='chart'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='graphics'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='default'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='drawing-page'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='presentation'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+            <xsl:when test="@style:family='control'">
+                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- finding all style child of a section and give their styleIdentifier to the output -->
+    <xsl:template name='write-children-style-names'>
+        <xsl:param name="parentStyleName" select="@style:name"/>
+        <xsl:param name="parentStyleFamily" select="@style:family"/>
+        <xsl:param name="searchOnlyInAutomaticStyles"/>
+
+
+        <!--** the names of all office:styles children will be written out
+            ** (a automatic style can only have children in the office:automatic-style section) -->
+
+        <!-- if NOT called from a office:automatic-style parent -->
+        <xsl:if test="not(searchOnlyInAutomaticStyles)">
+            <!-- for all children in the office:style section -->
+            <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+                <!-- write the style name in the css header -->
+                <xsl:call-template name="write-style-name"/>
+
+                <!-- search for child styles -->
+                <xsl:call-template name="write-children-style-names">
+                    <xsl:with-param name="parentStyleName" select="@style:name"/>
+                    <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+                </xsl:call-template>
+
+            </xsl:for-each>
+        </xsl:if>
+
+        <!--** the names of all office:automatic-styles children will be written out -->
+
+        <!-- for all children in the office:automatic-style section -->
+        <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+            <!-- write the style name in the css header -->
+            <xsl:call-template name="write-style-name"/>
+
+            <!-- search for child styles -->
+            <xsl:call-template name="write-children-style-names">
+                <xsl:with-param name="parentStyleName" select="@style:name"/>
+                <xsl:with-param name="parentStyleFamily" select="@style:family"/>
+                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
+            </xsl:call-template>
+
+        </xsl:for-each>
+    </xsl:template>
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_inlined.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_inlined.xsl
new file mode 100644 (file)
index 0000000..1915995
--- /dev/null
@@ -0,0 +1,398 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+
+    <!-- ********************************************* -->
+    <!-- *** hard attributed (inlined) properties  *** -->
+    <!-- ********************************************* -->
+
+
+    <!-- RESTRICTIONS:
+            1)  As the styles-node-variables are NOT global, the style variables are not global, either!!
+            2)  As a list of elements can only be added to a variable as a result tree fragment the
+                extension is neccessary!!
+    -->
+
+    <!-- 2DO: Inline styles do not inherit from XML office defaults nor font:family defaults as the style header does
+              (cp. stylesheet 'style_header.xsl' and the 'write-default-styles' template) -->
+
+    <xsl:template name='create-all-inline-styles'>
+
+        <!--** traversee all style trees and their branches collecting style properties **-->
+        <xsl:element name="allstyles">
+        <!--** traversee all office:styles trees beginning with the top-level styles**-->
+            <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
+
+                <!--** give out the style properties of the parent node **-->
+                <xsl:call-template name='write-current-and-inherited-style-properties'>
+                    <xsl:with-param name="styles-node"                  select="$office:styles"/>
+                    <xsl:with-param name="style-family"                 select="@style:family"/>
+                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+                </xsl:call-template>
+
+                <!--** all office:styles children of the current top-level office:styles **-->
+                <xsl:call-template name='for-all-templates-child-styles'>
+                    <xsl:with-param name="parentStyleName"              select="@style:name"/>
+                    <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
+                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+                </xsl:call-template>
+
+                <!--** all office:automatic-styles children of the current top-level style **-->
+                <xsl:call-template name='for-all-automatic-child-styles'>
+                    <xsl:with-param name="parentStyleName"              select="@style:name"/>
+                    <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
+                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+                </xsl:call-template>
+            </xsl:for-each>
+
+        <!--** traversee all office:automatic-styles trees beginning with the top-level styles **-->
+            <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
+                <!--** give out the style properties of the parent node **-->
+                <xsl:call-template name='write-current-and-inherited-style-properties'>
+                    <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
+                    <xsl:with-param name="style-family"                 select="@style:family"/>
+                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+                </xsl:call-template>
+
+                <!--** all children of the top-level office:automatic-styless  **-->
+                <xsl:call-template name='for-all-automatic-child-styles'>
+                    <xsl:with-param name="parentStyleName"              select="@style:name"/>
+                    <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
+                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+                </xsl:call-template>
+            </xsl:for-each>
+        </xsl:element>
+    </xsl:template>
+
+
+
+    <xsl:template name='for-all-templates-child-styles'>
+        <xsl:param name="parentStyleName"/>
+        <xsl:param name="parentStyleFamily"/>
+        <xsl:param name="style-name-tokenized"/>
+
+        <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+            <!--** give out the style properties of the current node **-->
+            <xsl:element name="{$style-name-tokenized}">
+                <xsl:call-template name='write-current-and-inherited-style-properties'>
+                    <xsl:with-param name="styles-node"                  select="$office:styles"/>
+                    <xsl:with-param name="style-family"                 select="@style:family"/>
+                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+                </xsl:call-template>
+            </xsl:element>
+
+            <!--** for all template-children of the current office:styles  **-->
+            <xsl:call-template name='for-all-templates-child-styles'>
+                <xsl:with-param name="styles-node"                  select="$office:styles"/>
+                <xsl:with-param name="parentStyleName"              select="@style:name"/>
+                <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
+                <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+            </xsl:call-template>
+
+            <!--** for all automatic-children of the current office:styles  **-->
+            <xsl:call-template name='for-all-automatic-child-styles'>
+                <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
+                <xsl:with-param name="parentStyleName"              select="@style:name"/>
+                <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
+                <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+            </xsl:call-template>
+
+        </xsl:for-each>
+    </xsl:template>
+
+
+
+    <xsl:template name='for-all-automatic-child-styles'>
+        <xsl:param name="styles-node"/>
+        <xsl:param name="parentStyleName"/>
+        <xsl:param name="parentStyleFamily"/>
+        <xsl:param name="style-name-tokenized"/>
+
+        <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
+            <!--** give out the style properties of the current node **-->
+            <xsl:element name="{$style-name-tokenized}">
+                <xsl:call-template name='write-current-and-inherited-style-properties'>
+                    <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
+                    <xsl:with-param name="style-family"                 select="@style:family"/>
+                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+                </xsl:call-template>
+            </xsl:element>
+
+            <!--** for all automatic-children of the current office:automatic-styles  **-->
+            <xsl:call-template name='for-all-automatic-child-styles'>
+                <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
+                <xsl:with-param name="parentStyleName"              select="@style:name"/>
+                <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
+                <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
+            </xsl:call-template>
+        </xsl:for-each>
+    </xsl:template>
+
+
+    <xsl:template name='write-current-and-inherited-style-properties'>
+        <xsl:param name="style-family"/>
+        <xsl:param name="styles-node"/>
+        <xsl:param name="style-name-tokenized"/>
+
+        <xsl:element name="{$style-name-tokenized}">
+            <xsl:variable name="current-style-name" select="@style:name"/>
+            <xsl:variable name="parent-style-name" select="@style:parent-style-name"/>
+
+            <xsl:variable name="new-property-list">
+                <!--*** COLLECT STYLE ATTRIBUTES (only toplevel) ***-->
+                <xsl:call-template name="write-style-properties">
+                    <xsl:with-param name="styleAttributePath"   select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*"/>
+                </xsl:call-template>
+            </xsl:variable>
+            <xsl:choose>
+                <!--*** @End: GIVE OUT All COLLECTED STYLE ATTRIBUTES (only toplevel) ***-->
+                <xsl:when test="string-length($parent-style-name)=0">
+                <!--** if no styleParent is given, the properties are given out at once **-->
+                    <xsl:value-of select="normalize-space($new-property-list)"/>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:variable name="new-property-names">
+                        <xsl:for-each select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*">
+                            <xsl:value-of select="name()"/>
+                        </xsl:for-each>
+                    </xsl:variable>
+                    <!--** further attributes of the parent style must be collected **-->
+                    <xsl:call-template name="add-parent-style-attributes">
+                        <xsl:with-param name="property-name-list"       select="$new-property-names"/>
+                        <xsl:with-param name="complete-property-list"   select="normalize-space($new-property-list)"/>
+                        <xsl:with-param name="current-style-name"       select="$current-style-name"/>
+                        <xsl:with-param name="parent-style-name"        select="$parent-style-name"/>
+                        <xsl:with-param name="style-family"             select="$style-family"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:element>
+    </xsl:template>
+
+
+
+    <xsl:template name="add-parent-style-attributes">
+        <xsl:param name="property-name-list"/>
+        <xsl:param name="complete-property-list"/>
+        <xsl:param name="current-style-name"/>
+        <xsl:param name="parent-style-name"/>
+        <xsl:param name="style-family"/>
+
+        <!--*** New two be added property names will be collected (only one variable per template) ***-->
+        <xsl:variable name="new-property-names">
+            <xsl:call-template name="get-new-style-names">
+                <xsl:with-param name="property-name-list"       select="$property-name-list"/>
+                <xsl:with-param name="parent-style-name"        select="$parent-style-name"/>
+                <xsl:with-param name="current-style-name"       select="$current-style-name"/>
+            </xsl:call-template>
+        </xsl:variable>
+
+        <xsl:choose>
+            <!--*** check if the new parent style exist in the office:automatic-styles section (defined by name and family) ***-->
+            <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$current-style-name]">
+                <!--*** RECURSION: adding new parent style attributes to the current style ***-->
+                <xsl:variable name="new-property-attributes">
+                    <xsl:call-template name="get-new-style-attributes">
+                        <xsl:with-param name="new-property-names"           select="$new-property-names"/>
+                        <xsl:with-param name="current-style-name"           select="$current-style-name"/>
+                        <xsl:with-param name="parent-style-name"            select="$parent-style-name"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <!--*** End CONDITION: the last style parent has already been executed ***-->
+                <xsl:variable name="new-parent-style-name"  select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
+                <xsl:choose>
+                    <xsl:when test="string-length($new-parent-style-name)=0">
+                    <!--** no further parent is found, the given parameter property-node is the final style -->
+                        <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                    <!--** further attributes of the parent style must be collected **-->
+                        <xsl:call-template name="add-parent-style-attributes">
+                            <xsl:with-param name="property-name-list"       select="concat($property-name-list, $new-property-names)"/>
+                            <xsl:with-param name="complete-property-list"   select="concat($complete-property-list,$new-property-attributes)"/>
+                            <xsl:with-param name="current-style-name"       select="$parent-style-name"/>
+                            <xsl:with-param name="parent-style-name"        select="$new-parent-style-name"/>
+                            <xsl:with-param name="style-family"             select="$style-family"/>
+                        </xsl:call-template>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:when>
+
+            <!--** the specific style (defined by name and family) must be found in the office:styles section -->
+            <xsl:otherwise>
+                <!--*** RECURSION: adding new parent style attributes to the current style ***-->
+                <!--*** adding new parent style attributes to the current style ***-->
+                <xsl:variable name="new-property-attributes">
+                    <xsl:call-template name="get-new-style-attributes">
+                        <xsl:with-param name="new-property-names"           select="$new-property-names"/>
+                        <xsl:with-param name="current-style-name"           select="$current-style-name"/>
+                        <xsl:with-param name="parent-style-name"            select="$parent-style-name"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <!--*** End CONDITION: the last style parent has already been executed ***-->
+                <xsl:variable name="new-parent-style-name"  select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
+                <xsl:choose>
+                    <xsl:when test="string-length($new-parent-style-name)=0">
+                    <!--** no further parent is found, the given parameter property-node is the final style -->
+                        <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
+                    </xsl:when>
+                    <xsl:otherwise>
+                    <!--** further attributes of the parent style must be collected **  -->
+                        <xsl:call-template name="add-parent-style-attributes">
+                            <xsl:with-param name="property-name-list"       select="concat($property-name-list, $new-property-names)"/>
+                            <xsl:with-param name="complete-property-list"   select="concat($complete-property-list,$new-property-attributes)"/>
+                            <xsl:with-param name="current-style-name"       select="$parent-style-name"/>
+                            <xsl:with-param name="parent-style-name"        select="$new-parent-style-name"/>
+                            <xsl:with-param name="style-family"             select="$style-family"/>
+                        </xsl:call-template>
+                    </xsl:otherwise>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <xsl:template name="get-new-style-names">
+        <xsl:param name="property-name-list"/>
+        <xsl:param name="parent-style-name"/>
+        <xsl:param name="current-style-name"/>
+        <!--** where to find the specific style (defined by name and family) wheter in office:automatic-styles or office:styles section -->
+        <xsl:choose>
+            <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
+            <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
+                <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+
+                <xsl:variable name="new-property-name-list">
+                    <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
+                        <xsl:value-of select="name()"/>
+                    </xsl:for-each>
+                </xsl:variable>
+                <xsl:value-of select="$new-property-name-list"/>
+            </xsl:when>
+            <!--** the specific style (defined by name and family) should be found in the office:styles section -->
+            <xsl:otherwise>
+                <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+                <xsl:variable name="new-property-name-list">
+                    <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
+                        <xsl:value-of select="name()"/>
+                    </xsl:for-each>
+                </xsl:variable>
+                <xsl:value-of select="$new-property-name-list"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <xsl:template name="get-new-style-attributes">
+        <xsl:param name="new-property-names"/>
+        <xsl:param name="current-style-name"/>
+        <xsl:param name="parent-style-name"/>
+
+        <!--** where to find the specific style (defined by name and family) whether in office:automatic-styles or office:styles section -->
+        <xsl:choose>
+            <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
+            <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
+                <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+                <xsl:variable name="new-property-name-list">
+                    <xsl:call-template name="write-style-properties">
+                        <xsl:with-param name="styleAttributePath"   select="$parent-property-node/@*[contains($new-property-names, name())]"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <xsl:value-of select="normalize-space($new-property-name-list)"/>
+            </xsl:when>
+            <!--** otherwise the specific style (defined by name and family) should be found in the office:styles section -->
+            <xsl:otherwise>
+                <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
+                <xsl:variable name="new-property-name-list">
+                    <xsl:call-template name="write-style-properties">
+                        <xsl:with-param name="styleAttributePath"   select="$parent-property-node/@*[contains($new-property-names, name())]"/>
+                    </xsl:call-template>
+                </xsl:variable>
+                <xsl:value-of select="normalize-space($new-property-name-list)"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_mapping.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/style_mapping.xsl
new file mode 100644 (file)
index 0000000..a9a858d
--- /dev/null
@@ -0,0 +1,660 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+    <xsl:template name="write-style-properties">
+        <xsl:param name="styleAttributePath"/>
+
+        <xsl:choose>
+            <!--+++++ CSS PROPERTIES  +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
+
+                <xsl:for-each select="$styleAttributePath">
+                <!-- isDebugModeMESSAGE:
+                    <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message>      -->
+
+
+                    <!-- <!ATTLIST style:properties style:horizontal-pos (from-left|left|center|right|from-inside|inside|outside)#IMPLIED>-->
+                    <!-- 2DO: is inside/from-inside also better showable ? -->
+                    <!-- !!!! 2DO: Still there have to be placed a <br clear='all'/> to disable the flow!!!!-->
+                    <!--           The OOo attribute 'style:number-wrapped-paragraphs' is currently ignored -->
+                    <xsl:choose>
+                        <xsl:when test='name(.)="style:wrap"'>
+                            <xsl:choose>
+                                <xsl:when test='.="left"'>
+                                    <xsl:text>float: right; </xsl:text>
+                                </xsl:when>
+                                <xsl:when test='.="right"'>
+                                    <xsl:text>float: left; </xsl:text>
+                                </xsl:when>
+                            </xsl:choose>
+                        </xsl:when>
+
+                        <xsl:when test='name(.) = "style:horizontal-pos"'>
+                            <xsl:choose>
+                                <xsl:when test='.="left"'>
+                                    <xsl:text>align: left; </xsl:text>
+                                </xsl:when>
+                                <xsl:when test='.="right"'>
+                                    <xsl:text>align: right; </xsl:text>
+                                </xsl:when>
+                                <xsl:when test='.="center"'>
+                                    <xsl:text>align: center; </xsl:text>
+                                </xsl:when>
+                            </xsl:choose>
+                        </xsl:when>
+<!-- results into a bad view (overlapped) in Mozilla 1.0
+                        <xsl:when test='name(.) = "table:align"'>
+                            <xsl:choose>
+                                <xsl:when test='.="left"'>
+                                    <xsl:text>float: right; </xsl:text>
+                                </xsl:when>
+                                <xsl:when test='.="right"'>
+                                    <xsl:text>float: left; </xsl:text>
+                                </xsl:when>
+                            </xsl:choose>
+                        </xsl:when>
+-->
+
+                        <!-- PADDING for all variations: fo:padding, fo:padding-top, fo:padding-bottom, fo:padding-left, fo:padding-right -->
+                        <xsl:when test='contains(name(.),"fo:padding")'>
+                            <xsl:text>padding: </xsl:text>
+                            <xsl:value-of select="."/>
+                            <xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <!--
+                        fo:border
+                        fo:border-top
+                        fo:border-bottom
+                        fo:border-left
+                        fo:border-right
+
+                            At present, all four borders must be set simultaneously by using either
+                            the fo:border property or by attaching all four of the other border
+                            properties to an item set element. In the latter case, if one or more
+                            of the properties is missing their values are assumed to be none. The
+                            only border styles supported are none or hidden, solid, and double. Any
+                            other border style specified is displayed as solid. Transparent borders
+                            are not supported and the border widths thin, medium, and thick are
+                            mapped to lengths. In addition, only some distinct border widths are
+                            supported. Unsupported widths are rounded up to the next supported
+                            width.
+                            If there are no padding properties specified within the same
+                            item set element, a default padding is used for sides that have a
+                            border. A value of 0cm is used for sides without a border.
+                            (cp. wd-so-xml-text.sdw)
+                        -->
+
+<!--2DO START: change measurement equally -->
+                        <xsl:when test='name(.)="fo:border"'>
+                            <xsl:choose>
+                                <!-- changing the distance measure: inch to in -->
+                                <xsl:when test="contains(., 'ch')">
+                                    <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,'ch ')"/><xsl:text>; </xsl:text>
+                                    <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
+                                    <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
+                                </xsl:when>
+                                <xsl:when test="contains(., 'cm')">
+                                    <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
+                                    <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
+                                    <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
+                                </xsl:when>
+                                <xsl:when test="contains(., 'pt')">
+                                    <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
+                                    <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
+                                    <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
+                                </xsl:when>
+                            </xsl:choose>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:border-top"'>
+                            <xsl:text>border-top: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:border-bottom"'>
+                            <xsl:text>border-bottom: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:border-left"'>
+                            <xsl:text>border-left: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:border-right"'>
+                            <xsl:text>border-right: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:column-width"'>
+                            <xsl:choose>
+                                <!-- changing the distance measure: inch to in -->
+                                <xsl:when test="contains(., 'ch')">
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:row-height"'>
+                            <xsl:choose>
+                                <!-- changing the distance measure: inch to in -->
+                                <xsl:when test="contains(., 'ch')">
+                                    <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:width"'>
+                            <xsl:choose>
+                                <!-- changing the distance measure: inch to in -->
+                                <xsl:when test="contains(., 'ch')">
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+<!--2DO END: change measurement equally -->
+                        <xsl:when test='name(.)="fo:font-style"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:font-name"'>
+                            <xsl:text>font-family:</xsl:text>
+                                <xsl:variable name="content" select="."/>
+                                <xsl:value-of select="$office:font-decls/style:font-decl[@style:name=$content]/@fo:font-family"/>
+                            <xsl:text>; </xsl:text>
+                            <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Italic')">
+                                <xsl:text>font-style:italic; </xsl:text>
+                            </xsl:if>
+                            <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Bold')">
+                                <xsl:text>font-weight:bold; </xsl:text>
+                            </xsl:if>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:font-weight"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:font-size"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:font-family"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:color"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:margin-left"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:margin-right"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:margin-top"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:margin-bottom"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:line-height"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:text-align"'>
+                            <!-- IMPORTANT is necessary as table cell value alignment is decided by runtime over the valuetype
+                                 Otherwise a table cell style-class will ALWAYS be overwritten by the run-time value -->
+                             <xsl:choose>
+                                <xsl:when test="contains(., 'start')">
+                                    <xsl:text>text-align:left ! important; </xsl:text>
+                                </xsl:when>
+                                <xsl:when test="contains(., 'end')">
+                                    <xsl:text>text-align:right ! important; </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>text-align:</xsl:text><xsl:value-of select='.'/><xsl:text> ! important; </xsl:text>
+                                </xsl:otherwise>
+                             </xsl:choose>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:text-indent"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:text-background-color"'>
+                            <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="fo:background-color"'>
+                            <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:background-image"'>
+                            <xsl:text>background-image:url(</xsl:text><xsl:value-of select="@xlink:href"/><xsl:text>); </xsl:text>
+                            <xsl:choose>
+                                <xsl:when test="@style:repeat = 'repeat'">
+                                    <xsl:text>background-repeat:repeat; </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>background-repeat:no-repeat; </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+                        <!-- text-shadow is a CSS2 feature and yet not common used in user-agents -->
+                        <xsl:when test='name(.)="fo:text-shadow"'>
+                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:text-crossing-out"'>
+                            <xsl:if test='not(.="none")'>
+                                <xsl:text>text-decoration:line-through; </xsl:text>
+                            </xsl:if>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:text-underline"'>
+                            <xsl:if test='not(.="none")'>
+                                <xsl:text>text-decoration:underline; </xsl:text>
+                            </xsl:if>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:text-position"'>
+                            <xsl:if test='contains(., "sub")'>
+                                <xsl:text>vertical-align:sub; </xsl:text>
+                            </xsl:if>
+                            <xsl:if test='contains(., "sup")'>
+                                <xsl:text>vertical-align:sup; </xsl:text>
+                            </xsl:if>
+                        </xsl:when>
+                        <!-- isDebugModeMESSAGE:
+                        <xsl:otherwise>
+                                <xsl:message>No transformation implemented for attribute-typ <xsl:value-of select="name(.)"/></xsl:message>
+                        </xsl:otherwise>-->
+                    </xsl:choose>
+                </xsl:for-each>
+            </xsl:when>
+            <!--+++++ PALM 3.2 SUBSET AND WAP PROPERTIES  +++++-->
+            <xsl:otherwise>
+                <xsl:for-each select="$styleAttributePath">
+                    <!-- isDebugModeMESSAGE:
+                    <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message>      -->
+
+                    <!-- BUG WORK AROUND:
+                    Due to a bug in the XT Processor, it is not possible to create serveral elements in variable and search over them,
+                    after explicit conversion to nodeset
+                    This generated sting identifier shall be later changed back to a set of elements
+                    -->
+                    <xsl:choose>
+                        <!--*** FORMAT ATTRIBUTES ***-->
+
+                        <!-- Italic -->
+                        <xsl:when test='name(.)="fo:font-style"'>
+                            <xsl:if test="contains(., 'italic') or contains(., 'oblique')">
+                                <xsl:text>italic, </xsl:text>
+                            </xsl:if>
+                        </xsl:when>
+
+                        <!-- Boldface -->
+                        <xsl:when test='name(.)="fo:font-weight"'>
+                            <xsl:if test="contains(., 'bold') or contains(., 'bolder')">
+                                <xsl:text>bold, </xsl:text>
+                            </xsl:if>
+                        </xsl:when>
+
+                        <!-- Underline -->
+                        <xsl:when test='name(.)="style:text-underline"'>
+                            <xsl:text>underline, </xsl:text>
+                        </xsl:when>
+
+                        <!-- Alignment -->
+                        <xsl:when test='name(.)="fo:text-align"'>
+                             <xsl:choose>
+                                <xsl:when test="contains(., 'start')">
+                                    <xsl:text>align:left, </xsl:text>
+                                </xsl:when>
+                                <xsl:when test="contains(., 'end')">
+                                    <xsl:text>align:right, </xsl:text>
+                                </xsl:when>
+                                <xsl:when test="contains(., 'center')">
+                                    <xsl:text>align:center, </xsl:text>
+                                </xsl:when>
+                             </xsl:choose>
+                        </xsl:when>
+
+                        <!-- strikethrough -->
+                        <xsl:when test='name(.)="style:text-crossing-out"'>
+                            <xsl:text>strike, </xsl:text>
+                        </xsl:when>
+
+                        <!-- Font - size (Palm: emulator transformed sizes to available set (e.g. 30 to (probably) 9)-->
+                        <xsl:when test='name(.)="fo:font-size"'>
+                            <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
+                        </xsl:when>
+
+                        <!-- Font - Color (PALM: but mostly only 2 available)
+                            black (#000000)
+                            gray (#808080)(rendered as dark gray)
+                            silver (#C0C0C0)(rendered as light gray)
+                            white (#FFFFFF)-->
+                        <xsl:when test='name(.)="fo:color"'>
+                            <xsl:choose>
+                                <xsl:when test="contains(. , '#FFFFFF') or contains(. , '#ffffff') or contains(. , 'white') or contains(. , 'WHITE')">
+                                    <xsl:text>color:#FFFFFF, </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>color:#000000, </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+
+
+                        <!--*** TABLE ATTRIBUTES ***-->
+                        <xsl:when test='name(.)="fo:font-size"'>
+                            <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:column-width"'>
+                            <xsl:choose>
+                                <!-- changing the distance measure: inch to in -->
+                                <xsl:when test="contains(., 'ch')">
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width, </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:row-height"'>
+                            <xsl:choose>
+                                <!-- changing the distance measure: inch to in -->
+                                <xsl:when test="contains(., 'ch')">
+                                    <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:height; </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>:height; </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+                        <xsl:when test='name(.)="style:width"'> <!--earlier fo:width-->
+                            <xsl:choose>
+                                <!-- changing the distance measure: inch to in -->
+                                <xsl:when test="contains(., 'ch')">
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width; </xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:when>
+                    </xsl:choose>
+                </xsl:for-each>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+<!-- 2DO: NAMING CONVENTION variable are written with '-' instead of case-sensitive writing -->
+
+
+
+    <!-- ***** MEASUREMENT CONVERSIONS *****
+
+     * 1 centimeter = 10 mm
+
+     * 1 inch = 25.4 mm
+        While the English have already seen the light (read: the metric system), the US
+        remains loyal to this medieval system.
+
+     * 1 didot point = 0.376065 mm
+            The didot system originated in France but was used in most of Europe
+
+     * 1 pica point = 0.35146 mm
+            The Pica points system was developed in England and is used in Great-Britain and the US.
+
+     * 1 PostScript point = 0.35277138 mm
+            When Adobe created PostScript, they added their own system of points.
+            There are exactly 72 PostScript points in 1 inch.
+
+     * 1 pixel = 0.26458333.. mm   (by 96 dpi)
+            Most pictures have the 96 dpi resolution, but the dpi variable may vary by stylesheet parameter
+    -->
+
+
+    <!-- changing measure to mm -->
+    <xsl:template name="convert2mm">
+        <xsl:param name="value"/>
+
+        <xsl:param name="centimeter-in-mm"          select="10"/>
+        <xsl:param name="inch-in-mm"                select="25.4"/>
+        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
+        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($value, 'cm')">
+                <xsl:value-of select="round(number(substring-before($value,'cm' )) * $centimeter-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'in')">
+                <xsl:value-of select="round(number(substring-before($value,'in' )) * $inch-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'dpt')">
+                <xsl:value-of select="round(number(substring-before($value,'dpt')) * $didot-point-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'ppt')">
+                <xsl:value-of select="round(number(substring-before($value,'ppt')) * $pica-point-in-mm)"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$value"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- changing measure to cm -->
+    <xsl:template name="convert2cm">
+        <xsl:param name="value"/>
+
+        <xsl:param name="centimeter-in-mm"          select="10"/>
+        <xsl:param name="inch-in-mm"                select="25.4"/>
+        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
+        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($value, 'mm')">
+                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $centimeter-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'in')">
+                <xsl:value-of select="round(number(substring-before($value, 'in')) div $centimeter-in-mm * $inch-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'dpt')">
+                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $centimeter-in-mm * $didot-point-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'ppt')">
+                <xsl:value-of select="round(number(substring-before($value,'ppt')) div $centimeter-in-mm * $pica-point-in-mm)"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$value"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+    <!-- changing measure to inch (cp. section comment) -->
+    <xsl:template name="convert2inch">
+        <xsl:param name="value"/>
+
+        <xsl:param name="centimeter-in-mm"          select="10"/>
+        <xsl:param name="inch-in-mm"                select="25.4"/>
+        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
+        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($value, 'mm')">
+                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $inch-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'cm')">
+                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $inch-in-mm * $centimeter-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'dpt')">
+                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $inch-in-mm * $didot-point-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'ppt')">
+                <xsl:value-of select="round(number(substring-before($value,'ppt')) div $inch-in-mm * $pica-point-in-mm)"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$value"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- changing measure to dpt (cp. section comment) -->
+    <xsl:template name="convert2dpt">
+        <xsl:param name="value"/>
+
+        <xsl:param name="centimeter-in-mm"          select="10"/>
+        <xsl:param name="inch-in-mm"                select="25.4"/>
+        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
+        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($value, 'mm')">
+                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $didot-point-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'cm')">
+                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $didot-point-in-mm * $centimeter-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'in')">
+                <xsl:value-of select="round(number(substring-before($value, 'in')) div $didot-point-in-mm * $inch-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'ppt')">
+                <xsl:value-of select="round(number(substring-before($value,'ppt')) div $didot-point-in-mm * $pica-point-in-mm)"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$value"/>
+            </xsl:otherwise>
+        </xsl:choose>
+
+    </xsl:template>
+
+
+    <!-- changing measure to ppt (cp. section comment) -->
+    <xsl:template name="convert2ppt">
+        <xsl:param name="value"/>
+
+        <xsl:param name="centimeter-in-mm"          select="10"/>
+        <xsl:param name="inch-in-mm"                select="25.4"/>
+        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
+        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($value, 'mm')">
+                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pica-point-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'cm')">
+                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pica-point-in-mm * $centimeter-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'in')">
+                <xsl:value-of select="round(number(substring-before($value, 'in')) div $pica-point-in-mm * $inch-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'dpt')">
+                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pica-point-in-mm * $didot-point-in-mm)"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$value"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- changing measure to pixel by via parameter provided dpi (dots per inch) standard factor (cp. section comment) -->
+    <xsl:template name="convert2pixel">
+        <xsl:param name="value"/>
+
+        <xsl:param name="centimeter-in-mm"          select="10"/>
+        <xsl:param name="inch-in-mm"                select="25.4"/>
+        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
+        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
+        <xsl:param name="pixel-in-mm"               select="$inch-in-mm div $dpi"/>
+
+        <xsl:choose>
+            <xsl:when test="contains($value, 'mm')">
+                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pixel-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'cm')">
+                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pixel-in-mm * $centimeter-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'in')">
+                <xsl:value-of select="round(number(substring-before($value, 'in')) div $pixel-in-mm * $inch-in-mm)"/>
+            </xsl:when>
+            <xsl:when test="contains($value, 'dpt')">
+                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pixel-in-mm * $didot-point-in-mm)"/>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:value-of select="$value"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table.xsl
new file mode 100644 (file)
index 0000000..36339ed
--- /dev/null
@@ -0,0 +1,328 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+    <!-- table row handling -->
+    <xsl:include href="table_rows.xsl"/>
+    <!-- table column handling -->
+    <xsl:include href="table_columns.xsl"/>
+    <!-- table cell handling -->
+    <xsl:include href="table_cells.xsl"/>
+
+
+
+    <!-- ******************* -->
+    <!-- *** main table  *** -->
+    <!-- ******************* -->
+
+    <xsl:template match="table:table | table:sub-table">
+        <xsl:param name="collectedGlobalData"/>
+
+        <!-- a table will only be created if the "scenario" is active -->
+        <xsl:if test="string-length(table:scenario/@table:is-active) = 0">
+            <!-- collecting all visible "table:table-row" elements of the table -->
+            <xsl:variable name="allVisibleTableRows" select="table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
+                    |    table:table-header-rows/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
+                    |    table:table-row-group/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]"/>
+            <xsl:choose>
+                <!-- for all but WAP/WML devices a table border check is done (cp. "check-for-table-border") -->
+                <xsl:when test="not($outputType = 'WML')">
+
+                    <!-- As the alignment of a table is by 'align' attribut is deprecated and as the CSS 'float' attribute not well displayed,
+                         we do a little trick by encapsulating the table with a aligned 'div' element-->
+                    <xsl:variable name="table-alignment" select="$office:automatic-styles/style:style[@style:name = current()/@table:style-name]/style:properties/@table:align"/>
+
+                    <xsl:choose>
+                        <xsl:when test="string-length($table-alignment) != 0">
+                            <xsl:element name="div">
+                                <xsl:attribute name="align">
+                                    <xsl:choose>
+                                        <xsl:when test='$table-alignment="left" or $table-alignment="margins"'>
+                                                <xsl:text>left</xsl:text>
+                                        </xsl:when>
+                                        <xsl:when test='$table-alignment="right"'>
+                                            <xsl:text>right</xsl:text>
+                                        </xsl:when>
+                                        <xsl:when test='$table-alignment="center"'>
+                                            <xsl:text>center</xsl:text>
+                                        </xsl:when>
+                                    </xsl:choose>
+                                </xsl:attribute>
+                                <xsl:element name="table">
+
+                                    <xsl:apply-templates select="@table:style-name">
+                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    </xsl:apply-templates>
+
+                                    <!-- workaround, set table border attribut if any cell-border exists
+                                    <xsl:call-template name="check-for-table-border">
+                                        <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+                                    </xsl:call-template> -->
+                                    <xsl:call-template name="create-column-style-variable">
+                                        <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                    </xsl:call-template>
+                                </xsl:element>
+                            </xsl:element>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:element name="table">
+                                <xsl:apply-templates select="@table:style-name">
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:apply-templates>
+
+                                <!-- workaround, set table border attribut if any cell-border exists
+                                <xsl:call-template name="check-for-table-border">
+                                    <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+                                </xsl:call-template>  -->
+                                <xsl:call-template name="create-column-style-variable">
+                                    <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
+                                     <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:call-template>
+                            </xsl:element>
+                        </xsl:otherwise>
+                    </xsl:choose>
+
+                </xsl:when>
+                <xsl:otherwise>
+                <!-- for WML devices only ASCII table are written as tables are not implemented widley.
+                     Beginning from 'repeat-write-row' the templates are handled by the table_wml.xsl stylesheet -->
+                    <xsl:call-template name="create-column-style-variable">
+                        <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
+                        <xsl:with-param name="allVisibleTableRows"  select="$allVisibleTableRows"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:if>
+    </xsl:template>
+
+
+
+    <xsl:template name="create-column-style-variable">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allVisibleTableRows"/>
+
+        <!-- all columns of the table -->
+        <xsl:variable name="allTableColumns" select="table:table-column |
+                                                     table:table-column-group/descendant::table:table-column |
+                                                     table:table-header-columns/descendant::table:table-column"/>
+        <!-- allColumnStyleEntries: Containing all columns of the table, hidden and viewed.
+            - if a column is hidden, it contains the hidden attribute, otherwise the style-properties will be stored
+            - if a column is being repeated, each repeated column is explicitly written as entry in this variable.
+              Later (during template "write-cell") the style of the column will be mixed with the cell-style by using
+              the position() of the column entry and comparing it with the iterating cell number. -->
+        <xsl:variable name="allColumnStyleEntries-RTF">
+            <xsl:call-template name="adding-column-styles-entries">
+                <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
+                <xsl:with-param name="allTableColumns"      select="$allTableColumns"/>
+            </xsl:call-template>
+        </xsl:variable>
+
+        <xsl:choose>
+            <xsl:when test="function-available('xt:node-set')">
+                <xsl:call-template name="create-table">
+                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                    <xsl:with-param name="allVisibleTableRows"      select="$allVisibleTableRows"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="xt:node-set($allColumnStyleEntries-RTF)"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="function-available('xalan:nodeset')">
+                <xsl:call-template name="create-table">
+                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                    <xsl:with-param name="allVisibleTableRows"      select="$allVisibleTableRows"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="xalan:nodeset($allColumnStyleEntries-RTF)"/>
+                </xsl:call-template>
+            </xsl:when>
+        </xsl:choose>
+
+    </xsl:template>
+
+
+
+    <xsl:template name="create-table">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allVisibleTableRows"/>
+        <xsl:param name="allColumnStyleEntries"/>
+
+
+        <!-- Some Office Calc documents simulate a background by repeating the last cell until end of space
+             (The value of "table:number-columns-repeated" is enourmous). Writing out all these cells would be fatal.
+             Therefore, this global variable shows us the longest row with content.
+
+        Earlier only the viewable columns were listed, but it is easier to handle with all columns:
+        <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry[not(@column-hidden-flag)])"/> -->
+        <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry)"/>
+
+
+        <!--isDebugMode-START-->
+        <xsl:if test="$isDebugMode">
+            <xsl:message>maxRowLength: <xsl:value-of select="$maxRowLength"/></xsl:message>
+            <xsl:variable name="numberOfHiddenColumns" select="count($allColumnStyleEntries/column-style-entry[@column-hidden-flag])"/>
+            <xsl:message>numberOfHiddenColumns: <xsl:value-of select="$numberOfHiddenColumns"/></xsl:message>
+            <xsl:call-template name="table-debug-allColumnStyleEntries">
+                <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+            </xsl:call-template>
+        </xsl:if>
+        <!--isDebugMode-END-->
+        <xsl:choose>
+            <xsl:when test="$outputType = 'WML'">
+                <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
+                     (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
+                     2DO:CHECK WITH XALAN-->
+                <xsl:for-each select="$allVisibleTableRows">
+                    <xsl:call-template name="wml-repeat-write-row">
+                        <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                        <xsl:with-param name="number-rows-repeated"     select="@table:number-rows-repeated"/>
+                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                    </xsl:call-template>
+                </xsl:for-each>
+            </xsl:when>
+            <xsl:otherwise>
+                <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
+                     (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
+                     2DO:CHECK WITH XALAN -->
+                <xsl:for-each select="$allVisibleTableRows">
+                    <xsl:call-template name="repeat-write-row">
+                        <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                        <xsl:with-param name="number-rows-repeated"     select="@table:number-rows-repeated"/>
+                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                    </xsl:call-template>
+                </xsl:for-each>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+
+
+    <!-- **************************** -->
+    <!-- *** HELPER: table border *** -->
+    <!-- **************************** -->
+
+    <!-- only one table border for HTML4 or CSS devices which contain one or more 'fo:border-top' attributes (pars pro toto, if one exist the other usually exist, too) -->
+    <!-- this was a work-around for the netscape 4.xx but not longer necessary for Mozilla -->
+    <xsl:template name="check-for-table-border">
+        <xsl:param name="allVisibleTableRows"/>
+
+        <xsl:variable name="startTime">
+            <xsl:if test="$isDebugMode and not($isJavaDisabled)">
+                <xsl:choose>
+                    <xsl:when test="function-available('system:current-time-millis')">
+                        <xsl:value-of select="system:current-time-millis()"/>
+                    </xsl:when>
+                    <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
+                        <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
+                    </xsl:when>
+                </xsl:choose>
+            </xsl:if>
+        </xsl:variable>
+
+        <!-- checks if one cell (table:table-cell) of the rows of this table (allVisibleTableRows) contains a border style (i.e. fo:border-top)
+             If only one single border element exist, the whole table will gets pre-defined borders (simple heuristic for better browser display) -->
+        <xsl:if test="$allVisibleTableRows/table:table-cell[@table:style-name=/*/*/style:style[style:properties/@fo:border-top]/@style:name]">
+            <xsl:attribute name="border">1</xsl:attribute>
+            <xsl:attribute name="bordercolor">#000000</xsl:attribute>
+            <xsl:attribute name="cellpadding">2</xsl:attribute>
+            <xsl:attribute name="cellspacing">0</xsl:attribute>
+            <xsl:attribute name="page-break-inside">page-break-inside:avoid</xsl:attribute>
+        </xsl:if>
+
+
+        <!-- check the time for borderchecking (debug)-->
+        <xsl:if test="$isDebugMode and not($isJavaDisabled)">
+            <xsl:variable name="endTime">
+                <xsl:choose>
+                    <xsl:when test="function-available('system:current-time-millis')">
+                        <xsl:value-of select="system:current-time-millis()"/>
+                    </xsl:when>
+                    <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
+                        <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
+                    </xsl:when>
+                </xsl:choose>
+            </xsl:variable>
+            <xsl:message>Time for checking BorderStyle: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
+        </xsl:if>
+    </xsl:template>
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_cells.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_cells.xsl
new file mode 100644 (file)
index 0000000..4671ea9
--- /dev/null
@@ -0,0 +1,484 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+    <!-- *********************************** -->
+    <!-- *** write repeating table cells *** -->
+    <!-- *********************************** -->
+
+
+    <!-- matching cells to give out -> covered table cells are not written out -->
+    <xsl:template match="table:table-cell">
+        <xsl:param name="collectedGlobalData"/>
+        <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="maxRowLength"/>
+
+        <xsl:if test="$isDebugMode">
+            <xsl:message>
+--------------> table:table-cell has been entered with node value: <xsl:value-of select="."/></xsl:message>
+            <xsl:message>table:number-columns-repeated: -<xsl:value-of select="@table:number-columns-repeated"/>-</xsl:message>
+        </xsl:if>
+
+        <xsl:call-template name="create-column-position-variable">
+            <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+            <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+            <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+            <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+        </xsl:call-template>
+
+    </xsl:template>
+
+
+
+    <xsl:template name="create-column-position-variable">
+        <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="maxRowLength"/>
+
+        <!-- column position needed for styles, esp. for column-hidden-flag -->
+        <xsl:variable name="preceding-columns">
+            <xsl:for-each select="preceding-sibling::*">
+                <xsl:element name="quantity">
+                    <xsl:choose>
+                        <xsl:when test="string-length(@table:number-columns-repeated) = 0">1</xsl:when>
+                        <xsl:otherwise><xsl:value-of select="@table:number-columns-repeated"/></xsl:otherwise>
+                    </xsl:choose>
+                </xsl:element>
+            </xsl:for-each>
+        </xsl:variable>
+
+        <xsl:choose>
+            <xsl:when test="function-available('xt:node-set')">
+                <xsl:call-template name="create-table-cell">
+                    <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                    <xsl:with-param name="column-position"          select="sum(xt:node-set($preceding-columns)/quantity) + 1"/>
+                    <xsl:with-param name="collectedGlobalData"      select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:when test="function-available('xalan:nodeset')">
+                <xsl:call-template name="create-table-cell">
+                    <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                    <xsl:with-param name="column-position"          select="sum(xalan:nodeset($preceding-columns)/quantity) + 1"/>
+                    <xsl:with-param name="collectedGlobalData"      select="$collectedGlobalData"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <xsl:element name="NodeSetFunctionNotAvailable"/>
+                <xsl:call-template name="create-table-cell"/>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <xsl:template name="create-table-cell">
+        <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="maxRowLength"/>
+        <xsl:param name="column-position"/>
+
+
+        <xsl:if test="$isDebugMode">
+            <xsl:message>NEW VALUE: column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
+        </xsl:if>
+
+
+        <!-- a hidden column will give out nothing -->
+        <xsl:if test="not($allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag)">
+            <xsl:choose>
+                <!-- when the columns are not repeated the next column-positions raises up to 1, otherwise up to the amount of repeated columns -->
+                <xsl:when test="@table:number-columns-repeated">
+                    <!-- writes multiple entries of a cell -->
+                    <xsl:call-template name="repeat-write-cell">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                        <xsl:with-param name="column-position"          select="$column-position"/>
+                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                        <xsl:with-param name="number-columns-repeated"  select="@table:number-columns-repeated"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <xsl:otherwise>
+                    <!-- writes an entry of a cell -->
+                    <xsl:call-template name="write-cell">
+                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                        <xsl:with-param name="column-position"          select="$column-position"/>
+                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:if>
+
+    </xsl:template>
+
+
+
+    <xsl:template name="repeat-write-cell">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="column-position"/>
+        <xsl:param name="maxRowLength"/>
+        <xsl:param name="number-columns-repeated"/>
+
+        <xsl:choose>
+            <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
+            <xsl:when test="$number-columns-repeated > 1 and $maxRowLength > $column-position">
+
+                <xsl:if test="$isDebugMode">
+                    <xsl:message>+++++++++ starting cell writing +++++++++</xsl:message>
+                    <xsl:message>number-columns-repeated: -<xsl:value-of select="$number-columns-repeated"/>-</xsl:message>
+                    <xsl:message>maxRowLength: -<xsl:value-of select="$maxRowLength"/>-</xsl:message>
+                    <xsl:message>column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
+                </xsl:if>
+
+                <!-- writes an entry of a cell -->
+                <xsl:call-template name="write-cell">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="column-position"          select="$column-position"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                </xsl:call-template>
+                <!-- repeat calling this method until all elements written out -->
+                <xsl:if test="$isDebugMode">
+                    <xsl:message>+++++++++ cell repetition +++++++++</xsl:message>
+                </xsl:if>
+                <xsl:call-template name="repeat-write-cell">
+                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="column-position"          select="$column-position + 1"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                    <xsl:with-param name="number-columns-repeated"  select="$number-columns-repeated - 1"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
+                <!--      When the maxRowLength is reached a last entry of a cell is written -->
+                <xsl:call-template name="write-cell">
+                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="column-position"          select="$column-position"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <xsl:template name="write-cell">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="column-position"/>
+        <xsl:param name="maxRowLength"/>
+
+
+        <xsl:if test="$isDebugMode">
+            <xsl:message>WriteTest -> If nothing between '-' write cell -<xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag"/>-</xsl:message>
+        </xsl:if>
+
+            <xsl:if test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
+                <xsl:if test="$isDebugMode">
+                    <xsl:message>TABLE COLUMN is hidden!</xsl:message>
+                </xsl:if>
+            </xsl:if>
+
+        <xsl:choose>
+            <!-- a hidden column will give out nothing -->
+            <xsl:when test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
+                <xsl:if test="$isDebugMode">
+                    <xsl:message>TABLE COLUMN is hidden!</xsl:message>
+                </xsl:if>
+            </xsl:when>
+
+            <!-- NOT a hidden column -->
+            <xsl:otherwise>
+
+                <!-- a table is a table header, when it has a "table:table-header-rows" ancestor -->
+                <xsl:variable name="tableDataType">
+                    <xsl:choose>
+                        <xsl:when test="ancestor::table:table-header-rows">
+                            <xsl:text>th</xsl:text>
+                        </xsl:when>
+                        <xsl:otherwise>
+                            <xsl:text>td</xsl:text>
+                        </xsl:otherwise>
+                    </xsl:choose>
+                </xsl:variable>
+
+                <xsl:choose>
+                    <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+                    <xsl:when test="$outputType = 'CSS_HEADER'">
+                        <xsl:element name="{$tableDataType}">
+
+                            <xsl:if test="$isDebugMode">
+                                <xsl:message>
+*****************************************'<xsl:value-of select="$tableDataType"/>' element has been added!</xsl:message>
+                            </xsl:if>
+
+                            <xsl:if test="@table:number-columns-spanned">
+                                <xsl:attribute name="colspan">
+                                    <xsl:value-of select="@table:number-columns-spanned"/>
+                                </xsl:attribute>
+                            </xsl:if>
+                            <xsl:if test="@table:number-rows-spanned">
+                                <xsl:attribute name="rowspan">
+                                    <xsl:value-of select="@table:number-rows-spanned"/>
+                                </xsl:attribute>
+                            </xsl:if>
+
+
+
+                            <!-- *** the cell-style *** -->
+                            <!-- The cell style has no conclusion with the column style, so we switch the order/priorities due to browser issues
+
+                                The cell-style depends on two attributes:
+
+                                1) table:style-name - the style properties of cell. When they exist, a default alignement (cp. below) will be added for the
+                                                      case of no alignment in the style exist.
+
+                                2) table:value-type - the value type of the table-cell giving the default alignments.
+                                                      By default a string value is left aligned, all other are aligned:right.
+                            -->
+                            <xsl:choose>
+                                <xsl:when test="@table:style-name">
+                                    <xsl:attribute name="style">
+
+                                        <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
+                                        <xsl:variable name="cellStyle" select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
+                                        <xsl:choose>
+                                            <xsl:when test="string-length($cellStyle) > 0 and not(contains($cellStyle, 'text-align'))">
+                                                <!-- CELL-STYLE: alignment by table:value-type -->
+                                                <!-- no alignment in the cell style, the alignment based on the table:value-type will be added -->
+                                                <xsl:choose>
+                                                    <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
+                                                        <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:right; ')"/>
+                                                    </xsl:when>
+                                                    <xsl:otherwise>
+                                                        <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:left; ')"/>
+                                                    </xsl:otherwise>
+                                                </xsl:choose>
+                                            </xsl:when>
+                                            <xsl:otherwise>
+                                                <!-- CELL-STYLE: alignment by table:value-type -->
+                                                <!-- no CSS style properties exist, only alignment from the table:value-type will be used -->
+                                                <xsl:choose>
+                                                    <xsl:when test="@table:value-type and not(@table:value-type = 'string')">text-align:right; </xsl:when>
+                                                    <xsl:otherwise>text-align:left; </xsl:otherwise>
+                                                </xsl:choose>
+                                            </xsl:otherwise>
+                                        </xsl:choose>
+
+                                         <!-- column-style (disjunct of cell style -->
+                                         <!-- 2DO: only absolut styles are supported, relative styles (i.e. 'style:rel-column-width' e.g. with value "8933*" are ignored.
+                                              Issue: browsers (not sure if CSS) does not support the '*' relationship, only the '%', where the sum is always '100'!
+                                              For this, it is easier to work on with the absolute values, instead of calculating the values for 100% -->
+                                         <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
+                                    </xsl:attribute>
+                                    <!-- CELL-STYLE: table:style-name -->
+                                    <xsl:attribute name="class">
+                                        <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
+                                    </xsl:attribute>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <xsl:attribute name="style">
+                                        <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
+                                        <!-- no table:style-name exist, only alignment from the table:value-type will be used -->
+                                        <xsl:choose>
+                                            <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
+                                                text-align:right;
+                                            </xsl:when>
+                                            <xsl:otherwise>
+                                                text-align:left;
+                                            </xsl:otherwise>
+                                        </xsl:choose>
+                                    </xsl:attribute>
+                                </xsl:otherwise>
+                            </xsl:choose>
+
+                            <xsl:choose>
+                                <!-- In case of no cell content a non-breakable space will be inserted
+                                     to make the browser show the table-cell grid -->
+                                <xsl:when test="not(child::text()) and not(child::*)">
+                                    <xsl:text> &#160;</xsl:text>
+                                </xsl:when>
+                                <xsl:otherwise>
+                                    <!-- *** the column-style *** -->
+                                    <!--  the column style has no conclusion with the cell style, so we switch the order/priorities due to browser issues-->
+                                    <xsl:element name="span">
+                                        <xsl:attribute name="class">
+                                            <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@style-name"/>
+                                        </xsl:attribute>
+                                        <xsl:apply-templates>
+                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                        </xsl:apply-templates>
+                                    </xsl:element>
+                                </xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:element>
+                    </xsl:when>
+
+                    <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+                    <xsl:when test="$outputType = 'CSS_INLINED'">
+                        <xsl:element name="{$tableDataType}">
+
+                            <xsl:if test="@table:number-columns-spanned">
+                                <xsl:attribute name="colspan">
+                                    <xsl:value-of select="@table:number-columns-spanned"/>
+                                </xsl:attribute>
+                            </xsl:if>
+                            <xsl:if test="@table:number-rows-spanned">
+                                <xsl:attribute name="rowspan">
+                                    <xsl:value-of select="@table:number-rows-spanned"/>
+                                </xsl:attribute>
+                            </xsl:if>
+
+                            <xsl:attribute name="style">
+                                <!-- cell-style -->
+                                <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
+                                <!-- column-style -->
+                                <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
+                                <!-- TABLE:VALUE-TYPE - the value of a table-cell will be aligned left by default only exlicit non-string is aligned:right-->
+                                <xsl:choose>
+                                    <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
+                                        <xsl:text>text-align:right;</xsl:text>
+                                    </xsl:when>
+                                    <xsl:otherwise>
+                                        <xsl:text>text-align:left;</xsl:text>
+                                    </xsl:otherwise>
+                                </xsl:choose>
+                            </xsl:attribute>
+
+                            <!-- &#160 is a non-breakable space, necessary to make to the browser show the table-cell grid -->
+                            <xsl:if test="not(child::text()) and not(child::*)"> &#160;</xsl:if>
+                            <xsl:apply-templates>
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:apply-templates>
+                        </xsl:element>
+                    </xsl:when>
+                    <!--+++++ PALM INLINED WAY  +++++-->
+                    <xsl:when test="$outputType = 'PALM'">
+                        <xsl:element name="{$tableDataType}">
+                            <xsl:if test="@table:number-columns-spanned">
+                                <xsl:attribute name="colspan">
+                                    <xsl:value-of select="@table:number-columns-spanned"/>
+                                </xsl:attribute>
+                            </xsl:if>
+
+                            <xsl:if test="@table:number-rows-spanned">
+                                <xsl:attribute name="rowspan">
+                                    <xsl:value-of select="@table:number-rows-spanned"/>
+                                </xsl:attribute>
+                            </xsl:if>
+                            <xsl:apply-templates>
+                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                            </xsl:apply-templates>
+                        </xsl:element>
+                    </xsl:when>
+                    <!--+++++ WML WAY  +++++-->
+                    <xsl:when test="$outputType = 'WML'">
+                        <xsl:choose>
+                            <xsl:when test="not($allColumnStyleEntries/column-style-entry[last() = $column-position])">
+                                <xsl:apply-templates>
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:apply-templates>
+                                <xsl:text>, </xsl:text>
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:apply-templates>
+                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+                                </xsl:apply-templates>
+                                <xsl:text>; </xsl:text>
+                                <xsl:element name="br"/>
+                            </xsl:otherwise>
+                        </xsl:choose>
+                    </xsl:when>
+                </xsl:choose>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_columns.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_columns.xsl
new file mode 100644 (file)
index 0000000..a9a907f
--- /dev/null
@@ -0,0 +1,215 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+    <!-- ******************************************** -->
+    <!-- *** Create table columns style variable  *** -->
+    <!-- ******************************************** -->
+
+    <xsl:template name="adding-column-styles-entries">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allTableColumns"/>
+
+        <xsl:for-each select="$allTableColumns">
+
+            <xsl:variable name="column-style-entry" select="$collectedGlobalData/allstyles/*[name() = translate(current()/@table:style-name, '. %()/\', '')]"/>
+            <xsl:choose>
+                <xsl:when test="not(@table:number-columns-repeated)">
+                    <!-- writes an entry of a column in the columns-variable -->
+                    <xsl:call-template name="adding-column-style-entry">
+                        <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
+                    </xsl:call-template>
+                </xsl:when>
+                <!-- No higher repetition of cells greater than 4 for the last and second last column -->
+                <!-- a hack for the sample document 'Waehrungsumrechner.sxc having 230 repeated columns in the second last column -->
+                <!-- ??? <xsl:when test="(position() = last() or (position() = (last() - 1)) and @table:number-columns-repeated &lt; 5)"> ???-->
+                <xsl:when test="position() = last() or position() = (last() - 1)">
+                    <xsl:if test="@table:number-columns-repeated &lt; 5">
+                        <!-- writes an entry of a column in the columns-variable -->
+                        <xsl:call-template name="repeat-adding-column-style-entry">
+                            <xsl:with-param name="column-style-entry"       select="$column-style-entry"/>
+                            <xsl:with-param name="number-columns-repeated"  select="1"/>
+                        </xsl:call-template>
+                    </xsl:if>
+                </xsl:when>
+                <xsl:otherwise>
+                    <!-- repeated colums will be written explicit several times in the variable-->
+                    <xsl:call-template name="repeat-adding-column-style-entry">
+                        <xsl:with-param name="column-style-entry"           select="$column-style-entry"/>
+                        <xsl:with-param name="number-columns-repeated"      select="@table:number-columns-repeated"/>
+                    </xsl:call-template>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:for-each>
+     </xsl:template>
+
+
+    <!-- WRITES THE REPEATED COLUMN STYLE EXPLICIT AS AN ELEMENT IN THE COLUMNS-VARIABLE -->
+    <xsl:template name="repeat-adding-column-style-entry">
+        <xsl:param name="column-style-entry"/>
+        <xsl:param name="number-columns-repeated"/>
+
+        <xsl:choose>
+            <xsl:when test="$number-columns-repeated > 1">
+                <!-- writes an entry of a column in the columns-variable -->
+                <xsl:call-template name="adding-column-style-entry">
+                    <xsl:with-param name="column-style-entry"   select="$column-style-entry"/>
+                </xsl:call-template>
+                <!-- repeat calling this method until all elements written out -->
+                <xsl:call-template name="repeat-adding-column-style-entry">
+                    <xsl:with-param name="column-style-entry"       select="$column-style-entry"/>
+                    <xsl:with-param name="number-columns-repeated"  select="$number-columns-repeated - 1"/>
+                </xsl:call-template>
+            </xsl:when>
+            <xsl:otherwise>
+                <!-- writes an entry of a column in the columns-variable -->
+                <xsl:call-template name="adding-column-style-entry">
+                    <xsl:with-param name="column-style-entry"   select="$column-style-entry"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+    <!-- THE COLUMN-STYLE WRITE-PATTERN FOR EACH COLUMN WRITTEN IN A VARIABLE -->
+    <xsl:template name="adding-column-style-entry">
+        <xsl:param name="column-style-entry"/>
+
+        <xsl:element name="column-style-entry">
+            <xsl:choose>
+                <xsl:when test="@table:visibility = 'collapse' or @table:visibility = 'filter'">
+                    <xsl:attribute name="column-hidden-flag">true</xsl:attribute>
+                </xsl:when>
+                <xsl:otherwise>
+                    <xsl:variable  name="table:style-name"         select="translate(@table:style-name, '. %()/\', '')"/>
+                    <xsl:attribute name="style-name"><xsl:value-of select="$table:style-name"/></xsl:attribute>
+                    <xsl:value-of select="$column-style-entry"/>
+                </xsl:otherwise>
+            </xsl:choose>
+        </xsl:element>
+    </xsl:template>
+
+
+
+    <!--isDebugMode-START-->
+    <!-- giving out the 'allColumnStyle' variable:
+        For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
+        In case of 'column-hidden-flag' attribute the text 'Column is hidden is given out.-->
+    <xsl:template name="table-debug-allColumnStyleEntries">
+        <xsl:param name="allColumnStyleEntries"/>
+
+        <!-- debug output as table summary attribut in html -->
+        <xsl:attribute name="summary">
+            <xsl:call-template name="table-debug-column-out">
+                <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+            </xsl:call-template>
+        </xsl:attribute>
+        <!-- debug output to console -->
+        <xsl:message>
+            <xsl:call-template name="table-debug-column-out">
+                <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
+            </xsl:call-template>
+        </xsl:message>
+    </xsl:template>
+
+
+    <xsl:template name="table-debug-column-out">
+        <xsl:param name="allColumnStyleEntries"/>
+            <xsl:text>
+            DebugInformation: For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
+                              In case of 'column-hidden-flag' attribute the text 'column is hidden' is given out.
+            </xsl:text>
+                <xsl:for-each select="$allColumnStyleEntries/column-style-entry">
+                <xsl:choose>
+                <xsl:when test="@column-hidden-flag">
+            <xsl:text>  </xsl:text><xsl:value-of select="@style-name"/><xsl:text>column is hidden</xsl:text><xsl:text>
+            </xsl:text>
+                </xsl:when>
+                <xsl:otherwise>
+            <xsl:text>  </xsl:text><xsl:value-of select="@style-name"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
+            </xsl:text>
+                </xsl:otherwise>
+                </xsl:choose>
+                           </xsl:for-each>
+    </xsl:template>
+    <!--isDebugMode-END-->
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_rows.xsl b/framework/Mime/lib/Horde/Mime/Viewer/Ooo/table_rows.xsl
new file mode 100644 (file)
index 0000000..6f7d17d
--- /dev/null
@@ -0,0 +1,177 @@
+<!--
+
+   The Contents of this file are made available subject to the terms of
+   either of the following licenses
+
+          - GNU Lesser General Public License Version 2.1
+          - Sun Industry Standards Source License Version 1.1
+
+   Sun Microsystems Inc., October, 2000
+
+   GNU Lesser General Public License Version 2.1
+   =============================================
+   Copyright 2000 by Sun Microsystems, Inc.
+   901 San Antonio Road, Palo Alto, CA 94303, USA
+
+   This library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License version 2.1, as published by the Free Software Foundation.
+
+   This library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with this library; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+   MA  02111-1307  USA
+
+
+   Sun Industry Standards Source License Version 1.1
+   =================================================
+   The contents of this file are subject to the Sun Industry Standards
+   Source License Version 1.1 (the "License"); You may not use this file
+   except in compliance with the License. You may obtain a copy of the
+   License at http://www.openoffice.org/license.html.
+
+   Software provided under this License is provided on an "AS IS" basis,
+   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
+   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
+   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
+   See the License for the specific provisions governing your rights and
+   obligations concerning the Software.
+
+   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
+
+   Copyright Â© 2002 by Sun Microsystems, Inc.
+
+   All Rights Reserved.
+
+   Contributor(s): _______________________________________
+
+-->
+<xsl:stylesheet version="1.0"
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+                xmlns:office="http://openoffice.org/2000/office"
+                xmlns:style="http://openoffice.org/2000/style"
+                xmlns:text="http://openoffice.org/2000/text"
+                xmlns:table="http://openoffice.org/2000/table"
+                xmlns:draw="http://openoffice.org/2000/drawing"
+                xmlns:fo="http://www.w3.org/1999/XSL/Format"
+                xmlns:xlink="http://www.w3.org/1999/xlink"
+                xmlns:number="http://openoffice.org/2000/datastyle"
+                xmlns:svg="http://www.w3.org/2000/svg"
+                xmlns:chart="http://openoffice.org/2000/chart"
+                xmlns:dr3d="http://openoffice.org/2000/dr3d"
+                xmlns:math="http://www.w3.org/1998/Math/MathML"
+                xmlns:form="http://openoffice.org/2000/form"
+                xmlns:script="http://openoffice.org/2000/script"
+                office:class="text"
+                office:version="1.0"
+                xmlns:dc="http://purl.org/dc/elements/1.1/"
+                xmlns:meta="http://openoffice.org/2000/meta"
+                xmlns:config="http://openoffice.org/2001/config"
+                xmlns:help="http://openoffice.org/2000/help"
+                xmlns:xt="http://www.jclark.com/xt"
+                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
+                xmlns:xalan="http://xml.apache.org/xalan"
+                xmlns:java="http://xml.apache.org/xslt/java"
+                exclude-result-prefixes="java">
+
+
+
+    <!-- ********************************************* -->
+    <!-- *** write (explicit) repeating table rows *** -->
+    <!-- ********************************************* -->
+
+    <xsl:template name="repeat-write-row">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="number-rows-repeated" select="1"/>
+        <xsl:param name="maxRowLength"/>
+
+        <xsl:choose>
+            <!-- write an entry of a row and repeat calling this method until all elements are written out -->
+            <xsl:when test="$number-rows-repeated > 1 and (table:table-cell/text() or table:table-cell/*)">
+                <xsl:call-template name="write-row">
+                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                </xsl:call-template>
+
+                <!-- 2DO: take variable from the output of repeated write-row and iterate giving out the variable -->
+                <xsl:call-template name="repeat-write-row">
+                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                    <xsl:with-param name="number-rows-repeated"     select="$number-rows-repeated - 1"/>
+                </xsl:call-template>
+            </xsl:when>
+            <!-- write a single entry of a row -->
+            <xsl:otherwise>
+                <xsl:call-template name="write-row">
+                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+                </xsl:call-template>
+            </xsl:otherwise>
+        </xsl:choose>
+    </xsl:template>
+
+
+
+    <xsl:template name="write-row">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="maxRowLength"/>
+
+
+        <xsl:element name="tr">
+            <!-- writing the style of the row -->
+            <xsl:call-template name='add-style-properties'>
+                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
+            </xsl:call-template>
+
+            <xsl:if test="$isDebugMode">
+                <xsl:message>
+*************************'tr' element has been added!</xsl:message>
+            </xsl:if>
+
+            <xsl:apply-templates select="table:table-cell">
+                <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
+                <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
+                <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
+            </xsl:apply-templates>
+
+        </xsl:element>
+    </xsl:template>
+
+
+    <!-- **************************** -->
+    <!-- *** HELPER: table styles *** -->
+    <!-- **************************** -->
+
+    <xsl:template name="add-style-properties">
+        <xsl:param name="collectedGlobalData"/>
+        <xsl:param name="allColumnStyleEntries"/>
+        <xsl:param name="node-position"/>
+
+        <xsl:choose>
+            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
+            <xsl:when test="$outputType = 'CSS_HEADER'">
+                <xsl:attribute name="class">
+                    <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
+                </xsl:attribute>
+            </xsl:when>
+
+            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
+            <xsl:when test="$outputType = 'CSS_INLINED'">
+                <xsl:attribute name="style">
+                    <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
+                </xsl:attribute>
+            </xsl:when>
+        </xsl:choose>
+    </xsl:template>
+
+</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Pdf.php b/framework/Mime/lib/Horde/Mime/Viewer/Pdf.php
new file mode 100644 (file)
index 0000000..4305a11
--- /dev/null
@@ -0,0 +1,45 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Pdf class simply outputs the PDF file with the
+ * content-type 'application/pdf' enabling web browsers with a PDF viewer
+ * plugin to view the PDF file inside the browser.
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Pdf extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_mimepart->getContents(),
+                'status' => array(),
+                'type' => 'application/pdf'
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Php.php b/framework/Mime/lib/Horde/Mime/Viewer/Php.php
new file mode 100644 (file)
index 0000000..3fd2753
--- /dev/null
@@ -0,0 +1,157 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Php class renders out syntax-highlighted PHP code in
+ * HTML format.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Php extends Horde_Mime_Viewer_source
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_renderInline();
+
+        // Need Horde headers for CSS tags.
+        reset($ret);
+        $ret[key($ret)]['data'] =  Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+            $ret[key($ret)]['data'] .
+            Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        ini_set('highlight.comment', 'comment');
+        ini_set('highlight.default', 'default');
+        ini_set('highlight.keyword', 'keyword');
+        ini_set('highlight.string', 'string');
+        ini_set('highlight.html', 'html');
+
+        $code = $this->_mimepart->getContents();
+        $text = (strpos($code, '<?php') === false)
+            ? $this->_lineNumber(str_replace('&lt;?php&nbsp;', '', highlight_string('<?php ' . $code, true)))
+            : $this->_lineNumber(highlight_string($code, true));
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $text,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Add line numbers to a block of code.
+     *
+     * @param string $code  The code to number.
+     *
+     * @return string  The code with line numbers added.
+     */
+    protected function _lineNumber($code, $linebreak = "\n")
+    {
+        // Clean up.
+        $code = preg_replace(
+            array(
+                '/<code><span style="color: #?\w+">\s*/',
+                '/<code><font color="#?\w+">\s*/',
+                '/\s*<\/span>\s*<\/span>\s*<\/code>/',
+                '/\s*<\/font>\s*<\/font>\s*<\/code>/'
+            ), '', $code);
+
+        $code = str_replace(
+            array('&nbsp;', '&amp;', '<br />', '<span style="color: ', '<font color="', '</font>',),
+            array(' ', '&#38;', "\n", '<span class="', '<span class="', '</span>',),
+            $code);
+
+        $code = trim($code);
+
+        // Normalize newlines.
+        $code = str_replace("\r", '', $code);
+        $code = preg_replace('/\n\n\n+/', "\n\n", $code);
+
+        $results = array('<ol class="code-listing striped">');
+        $previous = false;
+
+        $lines = explode("\n", $code);
+        reset($lines);
+        while (list($lineno, $line) = each($lines)) {
+            if (substr($line, 0, 7) == '</span>') {
+                $previous = false;
+                $line = substr($line, 7);
+            }
+
+            if (empty($line)) {
+                $line = '&#160;';
+            }
+
+            if ($previous) {
+                $line = "<span class=\"$previous\">" . $line;
+            }
+
+            // Save the previous style.
+            if (strpos($line, '<span') !== false) {
+                switch (substr($line, strrpos($line, '<span') + 13, 1)) {
+                case 'c':
+                    $previous = 'comment';
+                    break;
+
+                case 'd':
+                    $previous = 'default';
+                    break;
+
+                case 'k':
+                    $previous = 'keyword';
+                    break;
+
+                case 's':
+                    $previous = 'string';
+                    break;
+                }
+            }
+
+            // Unset previous style unless the span continues.
+            if (substr($line, -7) == '</span>') {
+                $previous = false;
+            } elseif ($previous) {
+                $line .= '</span>';
+            }
+
+            $results[] = '<li id="l' . ($lineno + 1). '">' . $line . '</li>';
+        }
+
+        $results[] = '</ol>';
+
+        return implode("\n", $results);
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Plain.php b/framework/Mime/lib/Horde/Mime/Viewer/Plain.php
new file mode 100644 (file)
index 0000000..57ae876
--- /dev/null
@@ -0,0 +1,95 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Plain class renders out plain text with URLs made
+ * into hyperlinks (if viewing inline).
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Plain extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $text = $this->_mimepart->getContents();
+        $charset = $this->_mimepart->getCharset();
+
+        /* Check for 'flowed' text data. */
+        if ($this->_mimepart->getContentTypeParameter('format') == 'flowed') {
+            $text = $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'));
+        }
+
+        require_once 'Horde/Text/Filter.php';
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => '<html><body><tt>' . Text_Filter::filter($text, 'text2html', array('parselevel' => TEXT_HTML_MICRO, 'charset' => $charset, 'class' => null)) . '</tt></body></html>',
+                'status' => array(),
+                'type' => 'text/html; charset=' . $charset
+            )
+        );
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        $text = String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset());
+
+        /* Check for 'flowed' text data. */
+        $data = ($this->_mimepart->getContentTypeParameter('format') == 'flowed')
+            ? $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'))
+            : $text;
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $data,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Format flowed text for HTML output.
+     *
+     * @param string $text    The text to format.
+     * @param boolean $delsp  Was text created with DelSp formatting?
+     *
+     * @return string  The formatted text.
+     */
+    protected function _formatFlowed($text, $delsp = null)
+    {
+        $flowed = new Horde_Text_Flowed($this->_mimepart->replaceEOL($text, "\n"), $this->_mimepart->getCharset());
+        $flowed->setMaxLength(0);
+        if (!is_null($delsp)) {
+            $flowed->setDelSp($delsp);
+        }
+        return $flowed->toFixed();
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Rar.php b/framework/Mime/lib/Horde/Mime/Viewer/Rar.php
new file mode 100644 (file)
index 0000000..261c725
--- /dev/null
@@ -0,0 +1,108 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Rar class renders out the contents of .rar archives
+ * in HTML format.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @author  Michael Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rar extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => true,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_renderInline();
+        if (!empty($ret)) {
+            reset($ret);
+            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+        }
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        $contents = $this->_mimepart->getContents();
+
+        $rar = &Horde_Compress::singleton('rar');
+
+        $rarData = $rar->decompress($contents);
+        if (is_a($rarData, 'PEAR_Error')) {
+            return array();
+        }
+        $fileCount = count($rarData);
+
+        require_once 'Horde/Text.php';
+
+        $name = $this->_mimepart->getName(true);
+        if (empty($name)) {
+            $name = _("unnamed");
+        }
+
+        $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
+            '<table><tr><td align="left"><tt><span class="fixed">' .
+            Text::htmlAllSpaces(_("Archive Name") . ':  ' . $name) . "\n" .
+            Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
+            Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
+            "\n\n" .
+            Text::htmlAllSpaces(
+                String::pad(_("File Name"), 50, ' ', STR_PAD_RIGHT) .
+                String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
+                String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
+                String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
+                String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
+                String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT)
+            ) . "\n" .
+            str_repeat('-', 109) . "\n";
+
+        foreach ($rarData as $val) {
+            $ratio = empty($val['size'])
+                ? 0
+                : 100 * ($val['csize'] / $val['size']);
+
+            $text .= Text::htmlAllSpaces(
+                String::pad($val['name'], 50, ' ', STR_PAD_RIGHT) .
+                String::pad($val['attr'], 10, ' ', STR_PAD_LEFT) .
+                String::pad($val['size'], 10, ' ', STR_PAD_LEFT) .
+                String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT) .
+                String::pad($val['method'], 10, ' ', STR_PAD_LEFT) .
+                String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT)
+            ) . "\n";
+        }
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Report.php b/framework/Mime/lib/Horde/Mime/Viewer/Report.php
new file mode 100644 (file)
index 0000000..2b02001
--- /dev/null
@@ -0,0 +1,33 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Report class is a wrapper used to load the
+ * appropriate Horde_Mime_Viewer for multipart/report data (RFC 3462).
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Report extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Return the underlying MIME Viewer for this part.
+     *
+     * @return mixed  A Horde_Mime_Viewer object, or false if not found.
+     */
+    protected function _getViewer()
+    {
+        if (!($type = $this->_mimepart->getContentTypeParameter('report-type'))) {
+            return false;
+        }
+
+        $viewer = Horde_Mime_Viewer::factory($this->_mimepart, 'message/' . String::lower($type));
+        if ($viewer) {
+            $viewer->setParams($this->_params);
+        }
+        return $viewer;
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Rfc822.php b/framework/Mime/lib/Horde/Mime/Viewer/Rfc822.php
new file mode 100644 (file)
index 0000000..57df4bc
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Rfc822 class renders out messages from the
+ * message/rfc822 content type.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (GPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rfc822 extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => true,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_mimepart->getContents(),
+                'status' => array(),
+                'type' => 'text/plain; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Return the rendered information about the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInfo()
+    {
+        /* Get the text of the part.  Since we need to look for the end of
+         * the headers by searching for the CRLFCRLF sequence, use
+         * getCanonicalContents() to make sure we are getting the text with
+         * CRLF's. */
+        $text = $this->_mimepart->getCanonicalContents();
+        if (empty($text)) {
+            return array();
+        }
+
+        /* Search for the end of the header text (CRLFCRLF). */
+        $text = substr($text, 0, strpos($text, "\r\n\r\n"));
+
+        /* Get the list of headers now. */
+        $headers = Horde_Mime_Headers::parseHeaders($text);
+
+        $header_array = array(
+            'date' => _("Date"),
+            'from' => _("From"),
+            'to' => _("To"),
+            'cc' => _("Cc"),
+            'bcc' => _("Bcc"),
+            'reply-to' => _("Reply-To"),
+            'subject' => _("Subject")
+        );
+        $header_output = array();
+
+        foreach ($header_array as $key => $val) {
+            $hdr = $headers->getValue($key);
+            if (!empty($hdr)) {
+                $header_output[] = '<strong>' . $val . ':</strong> ' . htmlspecialchars($hdr);
+            }
+        }
+
+        require_once 'Horde/Text/Filter.php';
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => empty($header_output) ? '' : ('<div class="mimeHeaders">' . Text_Filter::filter(implode("<br />\n", $header_output), 'emails') . '</div>'),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Richtext.php b/framework/Mime/lib/Horde/Mime/Viewer/Richtext.php
new file mode 100644 (file)
index 0000000..4aae86b
--- /dev/null
@@ -0,0 +1,152 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Richtext class renders out HTML text from
+ * text/richtext content tags, (RFC 1896 [7.1.3]).
+ *
+ * A minimal richtext implementation is one that simply converts "<lt>" to
+ * "<", converts CRLFs to SPACE, converts <nl> to a newline according to
+ * local newline convention, removes everything between a <comment> command
+ * and the next balancing </comment> command, and removes all other
+ * formatting commands (all text enclosed in angle brackets).
+ *
+ * We implement the following tags:
+ *   <bold>, <italic>, <fixed>, <smaller>, <bigger>, <underline>, <center>,
+ *   <flushleft>, <flushright>, <indent>, <subscript>, <excerpt>, <paragraph>,
+ *   <signature>, <comment>, <no-op>, <lt>, <nl>
+ *
+ * The following tags are implemented differently than described in the RFC
+ * (due to limitations in HTML output):
+ *   <heading> - Output as centered, bold text.
+ *   <footing> - Output as centered, bold text.
+ *   <np>      - Output as paragraph break.
+ *
+ * The following tags are NOT implemented:
+ *   <indentright>, <outdent>, <outdentright>, <samepage>, <iso-8859-X>,
+ *   <us-ascii>,
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Richtext extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_toHTML(),
+                'status' => array(),
+                'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
+            )
+        );
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Convert richtext to HTML.
+     *
+     * @return string  The converted HTML string.
+     */
+    protected function _toHTML()
+    {
+        $text = trim($this->_mimepart->getContents());
+        if ($text == '') {
+            return array();
+        }
+
+        /* We add space at the beginning and end of the string as it will
+         * make some regular expression checks later much easier (so we
+         * don't have to worry about start/end of line characters). */
+        $text = ' ' . $text . ' ';
+
+        /* Remove everything between <comment> tags. */
+        $text = preg_replace('/<comment.*>.*<\/comment>/Uis', '', $text);
+
+        /* Remove any unrecognized tags in the text.  We don't need <no-op>
+         * in $tags since it doesn't do anything anyway.  All <comment> tags
+         * have already been removed. */
+        $tags = '<bold><italic><fixed><smaller><bigger><underline><center><flushleft><flushright><indent><subscript><excerpt><paragraph><signature><lt><nl>';
+        $text = strip_tags($text, $tags);
+
+        /* <lt> becomes a '<'. CRLF becomes a SPACE. */
+        $text = str_ireplace(array('<lt>', "\r\n"), array('&lt;', ' '), $text);
+
+        /* We try to protect against bad stuff here. */
+        $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
+
+        /* <nl> becomes a newline (<br />);
+         * <np> becomes a paragraph break (<p />). */
+        $text = str_ireplace(array('&lt;nl&gt;', '&lt;np&gt;'), array('<br />', '<p />'), $text);
+
+        /* Now convert the known tags to html. Try to remove any tag
+         * parameters to stop people from trying to pull a fast one. */
+        $replace = array(
+            '/(?<!&lt;)&lt;bold.*&gt;(.*)&lt;\/bold&gt;/Uis' => '<span style="font-weight: bold">\1</span>',
+            '/(?<!&lt;)&lt;italic.*&gt;(.*)&lt;\/italic&gt;/Uis' => '<span style="font-style: italic">\1</span>',
+            '/(?<!&lt;)&lt;fixed.*&gt;(.*)&lt;\/fixed&gt;/Uis' => '<font face="fixed">\1</font>',
+            '/(?<!&lt;)&lt;smaller.*&gt;(.*)&lt;\/smaller&gt;/Uis' => '<span style="font-size: smaller">\1</span>',
+            '/(?<!&lt;)&lt;bigger.*&gt;(.*)&lt;\/bigger&gt;/Uis' => '<span style="font-size: larger">\1</span>',
+            '/(?<!&lt;)&lt;underline.*&gt;(.*)&lt;\/underline&gt;/Uis' => '<span style="text-decoration: underline">\1</span>',
+            '/(?<!&lt;)&lt;center.*&gt;(.*)&lt;\/center&gt;/Uis' => '<div align="center">\1</div>',
+            '/(?<!&lt;)&lt;flushleft.*&gt;(.*)&lt;\/flushleft&gt;/Uis' => '<div align="left">\1</div>',
+            '/(?<!&lt;)&lt;flushright.*&gt;(.*)&lt;\/flushright&gt;/Uis' => '<div align="right">\1</div>',
+            '/(?<!&lt;)&lt;indent.*&gt;(.*)&lt;\/indent&gt;/Uis' => '<blockquote>\1</blockquote>',
+            '/(?<!&lt;)&lt;excerpt.*&gt;(.*)&lt;\/excerpt&gt;/Uis' => '<cite>\1</cite>',
+            '/(?<!&lt;)&lt;subscript.*&gt;(.*)&lt;\/subscript&gt;/Uis' => '<sub>\1</sub>',
+            '/(?<!&lt;)&lt;superscript.*&gt;(.*)&lt;\/superscript&gt;/Uis' => '<sup>\1</sup>',
+            '/(?<!&lt;)&lt;heading.*&gt;(.*)&lt;\/heading&gt;/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
+            '/(?<!&lt;)&lt;footing.*&gt;(.*)&lt;\/footing&gt;/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
+            '/(?<!&lt;)&lt;paragraph.*&gt;(.*)&lt;\/paragraph&gt;/Uis' => '<p>\1</p>',
+            '/(?<!&lt;)&lt;signature.*&gt;(.*)&lt;\/signature&gt;/Uis' => '<address>\1</address>'
+        );
+        $text = preg_replace(array_keys($replace), array_values($replace), $text);
+
+        /* Now we remove the leading/trailing space we added at the start. */
+        $text = substr($text, 1, -1);
+
+        /* Wordwrap. */
+        $text = str_replace(array("\t", '  ', "\n "), array('        ', ' &nbsp;', "\n&nbsp;"), $text);
+        if ($text[0] == ' ') {
+            $text = '&nbsp;' . substr($text, 1);
+        }
+
+        return '<p style="font-size:100%;font-family:Lucida Console,Courier,Courier New;">' . nl2br($text) . '</p>';
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Rpm.php b/framework/Mime/lib/Horde/Mime/Viewer/Rpm.php
new file mode 100644 (file)
index 0000000..698cde6
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Rpm class renders out lists of files in RPM
+ * packages by using the rpm tool to query the package.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rpm extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => true,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        $data = '';
+        $tmp_rpm = Horde::getTempFile('horde_rpm');
+
+        file_put_contents($tmp_rpm, $this->_mimepart->getContents());
+
+        $fh = popen($this->_conf['location'] . " -qip $tmp_rpm 2>&1", 'r');
+        while (($rc = fgets($fh, 8192))) {
+            $data .= $rc;
+        }
+        pclose($fh);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => '<html><body><pre>' . htmlentities($data) . '</pre></body></html>',
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Rtf.php b/framework/Mime/lib/Horde/Mime/Viewer/Rtf.php
new file mode 100644 (file)
index 0000000..c4573da
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Rtf class renders out Rich Text Format documents in
+ * HTML format by using the UnRTF package.
+ *
+ * UnRTF package: http://www.gnu.org/software/unrtf/unrtf.html
+ *
+ * Copyright 2007 Duck <duck@obala.net>
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Duck <duck@obala.net>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Rtf extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        $tmp_rtf = Horde::getTempFile('rtf');
+        $tmp_output = Horde::getTempFile('rtf');
+
+        file_put_contents($tmp_rtf, $this->_mimepart->getContents());
+
+        exec($this->_conf['location'] . " $tmp_rtf > $tmp_output");
+
+        if (file_exists($tmp_output)) {
+            $data = file_get_contents($tmp_output);
+        } else {
+            $data = _("Unable to translate this RTF document");
+        }
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $data,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Security.php b/framework/Mime/lib/Horde/Mime/Viewer/Security.php
new file mode 100644 (file)
index 0000000..2600ba5
--- /dev/null
@@ -0,0 +1,34 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Security class is a wrapper used to load the
+ * appropriate Horde_Mime_Viewer for secure multipart messages (defined by RFC
+ * 1847). This class handles multipart/signed and multipart/encrypted data.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Security extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Return the underlying MIME Viewer for this part.
+     *
+     * @return mixed  A Horde_Mime_Viewer object, or false if not found.
+     */
+    protected function _getViewer()
+    {
+        if (!($protocol = $this->_mimepart->getContentTypeParameter('protocol'))) {
+            return false;
+        }
+
+        $viewer = Horde_Mime_Viewer::factory($this->_mimepart, $protocol);
+        if ($viewer) {
+            $viewer->setParams($this->_params);
+        }
+        return $viewer;
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Simple.php b/framework/Mime/lib/Horde/Mime/Viewer/Simple.php
new file mode 100644 (file)
index 0000000..aa4a157
--- /dev/null
@@ -0,0 +1,60 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Simple class renders out plain text without any
+ * modifications.
+ *
+ * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Simple extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_mimepart->getContents(),
+                'status' => array(),
+                'type' => 'text/plain; charset=' . $this->_mimepart->getCharset()
+            )
+        );
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset()),
+                'status' => array(),
+                'type' => 'text/plain; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Smil.php b/framework/Mime/lib/Horde/Mime/Viewer/Smil.php
new file mode 100644 (file)
index 0000000..3270597
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Smil renders SMIL documents to very basic HTML.
+ *
+ * Copyright 2006-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Jan Schneider <jan@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Smil extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Handle for the XML parser object.
+     *
+     * @var resource
+     */
+    protected $_parser;
+
+    /**
+     * String buffer to hold the generated content
+     *
+     * @var string
+     */
+    protected $_content;
+
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => true,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $this->_content = '';
+
+        /* Create a new parser and set its default properties. */
+        $this->_parser = xml_parser_create();
+        xml_set_object($this->_parser, $this);
+        xml_set_element_handler($this->_parser, '_startElement', '_endElement');
+        xml_set_character_data_handler($this->_parser, '_defaultHandler');
+        xml_parse($this->_parser, $this->_mimepart->getContents(), true);
+        xml_parser_free($this->_parser);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_content,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * User-defined function callback for start elements.
+     *
+     * @param object $parser  Handle to the parser instance.
+     * @param string $name    The name of this XML element.
+     * @param array $attrs    List of this element's attributes.
+     */
+    protected function _startElement($parser, $name, $attrs)
+    {
+        switch ($name) {
+        case 'IMG':
+            if (isset($attrs['SRC'])) {
+                $this->_content .= '<img src="' . htmlspecialchars($attrs['SRC']) . '" />';
+            }
+            break;
+        }
+    }
+
+    /**
+     * User-defined function callback for end elements.
+     *
+     * @param object $parser  Handle to the parser instance.
+     * @param string $name    The name of this XML element.
+     */
+    protected function _endElement($parser, $name)
+    {
+    }
+
+    /**
+     * User-defined function callback for character data.
+     *
+     * @param object $parser  Handle to the parser instance.
+     * @param string $data    String of character data.
+     */
+    protected function _defaultHandler($parser, $data)
+    {
+        $data = trim($data);
+        if (!empty($data)) {
+            $this->_content .= ' ' . htmlspecialchars($data);
+        }
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Source.php b/framework/Mime/lib/Horde/Mime/Viewer/Source.php
new file mode 100644 (file)
index 0000000..bddc95c
--- /dev/null
@@ -0,0 +1,31 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Source class is a class for any viewer that wants
+ * to provide line numbers to extend.
+ *
+ * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Chuck Hagenbuch <chuck@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Source extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Add line numbers to a block of code.
+     *
+     * @param string $code  The code to number.
+     *
+     * @return string  The code with line numbers added.
+     */
+    protected function _lineNumber($code, $linebreak = "\n")
+    {
+        $html = array('<table class="lineNumbered" cellspacing="0"><tr><th>');
+        for ($l = 1,  $lines = substr_count($code, $linebreak) + 1; $l <= $lines; ++$l) {
+            $html[] = sprintf('<a id="l%s" href="#l%s">%s</a><br />', $l, $l, $l);
+        }
+        return implode("\n", $html) . '</th><td><div>' . $code . '</div></td></tr></table>';
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Srchighlite.php b/framework/Mime/lib/Horde/Mime/Viewer/Srchighlite.php
new file mode 100644 (file)
index 0000000..af4e77e
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Srchighlite class renders out various content in HTML
+ * format by using Source-highlight.
+ *
+ * Source-highlight: http://www.gnu.org/software/src-highlite/
+ *
+ * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Mike Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Srchighlite extends Horde_Mime_Viewer_Source
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_renderInline();
+
+        // Need Horde headers for CSS tags.
+        reset($ret);
+        $ret[key($ret)]['data'] =  Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+            $ret[key($ret)]['data'] .
+            Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        /* Create temporary files for Webcpp. */
+        $tmpin  = Horde::getTempFile('SrcIn');
+        $tmpout = Horde::getTempFile('SrcOut', false);
+
+        /* Write the contents of our buffer to the temporary input file. */
+        file_put_contents($tmpin, $this->_mimepart->getContents());
+
+        /* Determine the language from the mime type. */
+        $lang = $this->_typeToLang($this->_mimepart->getType());
+
+        /* Execute Source-Highlite. */
+        exec($this->_conf['location'] . " --src-lang $lang --out-format xhtml --input $tmpin --output $tmpout");
+        $results = file_get_contents($tmpout);
+        unlink($tmpout);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $this->_lineNumber($results),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Attempts to determine what mode to use for the source-highlight
+     * program from a MIME type.
+     *
+     * @param string $type  The MIME type.
+     *
+     * @return string  The mode to use.
+     */
+    protected function _typeToLang($type)
+    {
+        switch ($type) {
+        case 'text/x-java':
+            return 'java';
+
+        case 'text/x-csrc':
+        case 'text/x-c++src':
+        case 'text/cpp':
+            return 'cpp';
+
+        case 'application/x-perl':
+            return 'perl';
+
+        case 'application/x-php':
+        case 'x-extension/phps':
+        case 'x-extension/php3s':
+        case 'application/x-httpd-php':
+        case 'application/x-httpd-php3':
+        case 'application/x-httpd-phps':
+            return 'php3';
+
+        case 'application/x-python':
+            return 'python';
+
+        // TODO: 'prolog', 'flex', 'changelog', 'ruby'
+        }
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Tgz.php b/framework/Mime/lib/Horde/Mime/Viewer/Tgz.php
new file mode 100644 (file)
index 0000000..cbfd711
--- /dev/null
@@ -0,0 +1,118 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Tgz class renders out plain or gzipped tarballs in
+ * HTML.
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Anil Madhavapeddy <anil@recoil.org>
+ * @author  Michael Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Tgz extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => true,
+        'full' => false,
+        'info' => true,
+        'inline' => true
+    );
+
+    /**
+     * The list of compressed subtypes.
+     *
+     * @var array
+     */
+    protected $_gzipSubtypes = array(
+        'x-compressed-tar', 'tgz', 'x-tgz', 'gzip', 'x-gzip',
+        'x-gzip-compressed', 'x-gtar'
+    );
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        /* Currently, can't do anything without tar file. */
+        $subtype = $this->_mimepart->getSubType();
+        if (in_array($subtype, array('gzip', 'x-gzip', 'x-gzip-compressed'))) {
+            return array();
+        }
+
+        $contents = $this->_mimepart->getContents();
+
+        /* Decompress gzipped files. */
+        if (in_array($subtype, $this->_gzipSubtypes)) {
+            $gzip = &Horde_Compress::singleton('gzip');
+            $contents = $gzip->decompress($contents);
+            if (is_a($contents, 'PEAR_Error') || empty($contents)) {
+                return array();
+            }
+        }
+
+        /* Obtain the list of files/data in the tar file. */
+        $tar = &Horde_Compress::singleton('tar');
+        $tarData = $tar->decompress($contents);
+        if (is_a($tarData, 'PEAR_Error')) {
+            return array();
+        }
+        $fileCount = count($tarData);
+
+        require_once 'Horde/Text.php';
+
+        $name = $this->_mimepart->getName(true);
+        if (empty($name)) {
+            $name = _("unnamed");
+        }
+
+        $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
+            '<table><tr><td align="left"><tt><span class="fixed">' .
+            Text::htmlAllSpaces(_("Archive Name") . ':  ' . $name) . "\n" .
+            Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
+            Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
+            "\n\n" .
+            Text::htmlAllSpaces(
+                str_pad(_("File Name"), 62, ' ', STR_PAD_RIGHT) .
+                str_pad(_("Attributes"), 15, ' ', STR_PAD_LEFT) .
+                str_pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
+                str_pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT)
+            ) . "\n" .
+            str_repeat('-', 106) . "\n";
+
+        foreach ($tarData as $val) {
+            $text .= Text::htmlAllSpaces(
+                str_pad($val['name'], 62, ' ', STR_PAD_RIGHT) .
+                str_pad($val['attr'], 15, ' ', STR_PAD_LEFT) .
+                str_pad($val['size'], 10, ' ', STR_PAD_LEFT) .
+                str_pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT)
+            ) . "\n";
+        }
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * Return the rendered information about the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInfo()
+    {
+        return $this->_renderInline();
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Tnef.php b/framework/Mime/lib/Horde/Mime/Viewer/Tnef.php
new file mode 100644 (file)
index 0000000..373ee91
--- /dev/null
@@ -0,0 +1,74 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Tnef class allows MS-TNEF attachments to be
+ * displayed.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Jan Schneider <jan@horde.org>
+ * @author  Michael Slusarz <slusarz@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Tnef extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => true,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_renderInline();
+        if (!empty($ret)) {
+            reset($ret);
+            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+        }
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        $tnef = &Horde_Compress::singleton('tnef');
+
+        $data = '<table border="1">';
+        $info = $tnef->decompress($this->_mimepart->getContents());
+        if (empty($info) || is_a($info, 'PEAR_Error')) {
+            $data .= '<tr><td>' . _("MS-TNEF Attachment contained no data.") . '</td></tr>';
+        } else {
+            $data .= '<tr><td>' . _("Name") . '</td><td>' . _("Mime Type") . '</td></tr>';
+            foreach ($info as $part) {
+                $data .= '<tr><td>' . $part['name'] . '</td><td>' . $part['type'] . '/' . $part['subtype'] . '</td></tr>';
+            }
+        }
+        $data .= '</table>';
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $data,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Vcard.php b/framework/Mime/lib/Horde/Mime/Viewer/Vcard.php
new file mode 100644 (file)
index 0000000..e7a7c3b
--- /dev/null
@@ -0,0 +1,403 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Vcard class renders out vCards in HTML format.
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Jan Schneider <jan@horde.org>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Vcard extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_renderInline();
+        if (!empty($ret)) {
+            reset($ret);
+            $ret[key($ret)]['data'] = Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
+                $ret[key($ret)]['data'] .
+                Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
+        }
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        global $registry, $prefs, $notification;
+
+        $app = false;
+        $data = $this->_mimepart->getContents();
+        $html = '';
+        $import_msg = null;
+        $title = _("vCard");
+
+        $iCal = new Horde_iCalendar();
+        if (!$iCal->parsevCalendar($data, 'VCALENDAR', $this->_mimepart->getCharset())) {
+            $notification->push(_("There was an error reading the contact data."), 'horde.error');
+        }
+
+        if (Util::getFormData('import') &&
+            Util::getFormData('source') &&
+            $registry->hasMethod('contacts/import')) {
+            $source = Util::getFormData('source');
+            $count = 0;
+            foreach ($iCal->getComponents() as $c) {
+                if (is_a($c, 'Horde_iCalendar_vcard')) {
+                    $contacts = $registry->call('contacts/import',
+                                                array($c, null, $source));
+                    if (is_a($contacts, 'PEAR_Error')) {
+                        $notification->push(
+                            _("There was an error importing the contact data:") . ' '
+                            . $contacts->getMessage(),
+                            'horde.error');
+                        continue;
+                    }
+                    $count++;
+                }
+            }
+            $notification->push(sprintf(ngettext(
+                "%d contact was successfully added to your address book.",
+                "%d contacts were successfully added to your address book.",
+                $count),
+                                        $count),
+                                'horde.success');
+        }
+
+        $html .= '<table cellspacing="1" border="0" cellpadding="1">';
+
+        $i = 0;
+        foreach ($iCal->getComponents() as $vc) {
+            if ($i > 0) {
+                $html .= '<tr><td colspan="2">&nbsp;</td></tr>';
+            }
+            ++$i;
+
+            $html .= '<tr><td colspan="2" class="header">';
+            $fullname = $vc->getAttributeDefault('FN', false);
+            if ($fullname !== false) {
+                $html .= $fullname;
+            }
+            $html .= '</td></tr>';
+
+            $n = $vc->printableName();
+            if (!empty($n)) {
+                $html .= $this->_row(_("Name"), $n);
+            }
+
+            $aliases = $vc->getAttributeValues('ALIAS');
+            if (!is_a($aliases, 'PEAR_Error')) {
+                $html .= $this->_row(_("Alias"), implode("\n", $aliases));
+            }
+            $birthdays = $vc->getAttributeValues('BDAY');
+            if (!is_a($birthdays, 'PEAR_Error')) {
+                $birthday = new Horde_Date($birthdays[0]);
+                $html .= $this->_row(
+                    _("Birthday"),
+                    $birthday->strftime($prefs->getValue('date_format')));
+            }
+
+            $photos = $vc->getAllAttributes('PHOTO');
+            foreach ($photos as $photo) {
+                if (!isset($photo['params']['VALUE']) ||
+                    String::upper($photo['params']['VALUE']) != 'URI') {
+                    continue;
+                }
+                $html .= $this->_row(_("Photo"),
+                                     '<img src="' . htmlspecialchars($photo['value']) . '" />',
+                                     false);
+            }
+
+            $labels = $vc->getAllAttributes('LABEL');
+            foreach ($labels as $label) {
+                if (isset($label['params']['TYPE'])) {
+                    if (!is_array($label['params']['TYPE'])) {
+                        $label['params']['TYPE'] = array($label['params']['TYPE']);
+                    }
+                } else {
+                    $label['params']['TYPE'] = array_keys($label['params']);
+                }
+                $types = array();
+                foreach ($label['params']['TYPE'] as $type) {
+                    switch(String::upper($type)) {
+                    case 'HOME':
+                        $types[] = _("Home Address");
+                        break;
+
+                    case 'WORK':
+                        $types[] = _("Work Address");
+                        break;
+
+                    case 'DOM':
+                        $types[] = _("Domestic Address");
+                        break;
+
+                    case 'INTL':
+                        $types[] = _("International Address");
+                        break;
+
+                    case 'POSTAL':
+                        $types[] = _("Postal Address");
+                        break;
+
+                    case 'PARCEL':
+                        $types[] = _("Parcel Address");
+                        break;
+
+                    case 'PREF':
+                        $types[] = _("Preferred Address");
+                        break;
+                    }
+                }
+                if (!count($types)) {
+                    $types = array(_("Address"));
+                }
+                $html .= $this->_row(implode('/', $types), $label['value']);
+            }
+
+            $adrs = $vc->getAllAttributes('ADR');
+            foreach ($adrs as $item) {
+                if (isset($item['params']['TYPE'])) {
+                    if (!is_array($item['params']['TYPE'])) {
+                        $item['params']['TYPE'] = array($item['params']['TYPE']);
+                    }
+                } else {
+                    $item['params']['TYPE'] = array_keys($item['params']);
+                }
+                $address = $item['values'];
+                $a = array();
+                if (isset($address[VCARD_ADR_STREET])) {
+                    $a[] = $address[VCARD_ADR_STREET];
+                }
+                if (isset($address[VCARD_ADR_LOCALITY])) {
+                    $a[] = $address[VCARD_ADR_LOCALITY];
+                }
+                if (isset($address[VCARD_ADR_REGION])) {
+                    $a[] = $address[VCARD_ADR_REGION];
+                }
+                if (isset($address[VCARD_ADR_POSTCODE])) {
+                    $a[] = $address[VCARD_ADR_POSTCODE];
+                }
+                if (isset($address[VCARD_ADR_COUNTRY])) {
+                    $a[] = $address[VCARD_ADR_COUNTRY];
+                }
+                $types = array();
+                foreach ($item['params']['TYPE'] as $type) {
+                    switch(String::upper($type)) {
+                    case 'HOME':
+                        $types[] = _("Home Address");
+                        break;
+
+                    case 'WORK':
+                        $types[] = _("Work Address");
+                        break;
+
+                    case 'DOM':
+                        $types[] = _("Domestic Address");
+                        break;
+
+                    case 'INTL':
+                        $types[] = _("International Address");
+                        break;
+
+                    case 'POSTAL':
+                        $types[] = _("Postal Address");
+                        break;
+
+                    case 'PARCEL':
+                        $types[] = _("Parcel Address");
+                        break;
+
+                    case 'PREF':
+                        $types[] = _("Preferred Address");
+                        break;
+                    }
+                }
+                if (!count($types)) {
+                    $types = array(_("Address"));
+                }
+                $html .= $this->_row(implode('/', $types), implode("\n", $a));
+            }
+
+            $numbers = $vc->getAllAttributes('TEL');
+
+            foreach ($numbers as $number) {
+                if (isset($number['params']['TYPE'])) {
+                    if (!is_array($number['params']['TYPE'])) {
+                        $number['params']['TYPE'] = array($number['params']['TYPE']);
+                    }
+                    foreach ($number['params']['TYPE'] as $type) {
+                        $number['params'][String::upper($type)] = true;
+                    }
+                }
+                if (isset($number['params']['FAX'])) {
+                    $html .= $this->_row(_("Fax"), $number['value']);
+                } else {
+                    if (isset($number['params']['HOME'])) {
+                        $html .= $this->_row(_("Home Phone"),
+                                             $number['value']);
+                    } elseif (isset($number['params']['WORK'])) {
+                        $html .= $this->_row(_("Work Phone"),
+                                             $number['value']);
+                    } elseif (isset($number['params']['CELL'])) {
+                        $html .= $this->_row(_("Cell Phone"),
+                                             $number['value']);
+                    } else {
+                        $html .= $this->_row(_("Phone"),
+                                             $number['value']);
+                    }
+                }
+            }
+
+            $addresses = $vc->getAllAttributes('EMAIL');
+            $emails = array();
+            foreach ($addresses as $address) {
+                if (isset($address['params']['TYPE'])) {
+                    if (!is_array($address['params']['TYPE'])) {
+                        $address['params']['TYPE'] = array($address['params']['TYPE']);
+                    }
+                    foreach ($address['params']['TYPE'] as $type) {
+                        $address['params'][String::upper($type)] = true;
+                    }
+                }
+                $email = '<a href="';
+                if ($registry->hasMethod('mail/compose')) {
+                    $email .= $registry->call(
+                        'mail/compose',
+                        array(array('to' => $address['value'])));
+                } else {
+                    $email .= 'mailto:' . htmlspecialchars($address['value']);
+                }
+                $email .= '">' . htmlspecialchars($address['value']) . '</a>';
+                if (isset($address['params']['PREF'])) {
+                    array_unshift($emails, $email);
+                } else {
+                    $emails[] = $email;
+                }
+            }
+
+            if (count($emails)) {
+                $html .= $this->_row(_("Email"), implode("\n", $emails), false);
+            }
+
+            $title = $vc->getAttributeValues('TITLE');
+            if (!is_a($title, 'PEAR_Error')) {
+                $html .= $this->_row(_("Title"), $title[0]);
+            }
+
+            $role = $vc->getAttributeValues('ROLE');
+            if (!is_a($role, 'PEAR_Error')) {
+                $html .= $this->_row(_("Role"), $role[0]);
+            }
+
+            $org = $vc->getAttributeValues('ORG');
+            if (!is_a($org, 'PEAR_Error')) {
+                $html .= $this->_row(_("Company"), $org[0]);
+                if (isset($org[1])) {
+                    $html .= $this->_row(_("Department"), $org[1]);
+                }
+            }
+
+            $notes = $vc->getAttributeValues('NOTE');
+            if (!is_a($notes, 'PEAR_Error')) {
+                $html .= $this->_row(_("Notes"), $notes[0]);
+            }
+
+            $url = $vc->getAttributeValues('URL');
+            if (!is_a($url, 'PEAR_Error')) {
+                $html .= $this->_row(
+                    _("URL"),
+                    '<a href="' . htmlspecialchars($url[0])
+                        . '" target="_blank">' . htmlspecialchars($url[0])
+                        . '</a>',
+                    false);
+            }
+        }
+
+        if ($registry->hasMethod('contacts/import') &&
+            $registry->hasMethod('contacts/sources')) {
+            $html .= '<tr><td colspan="2" class="smallheader"><form action="'
+                . Horde::selfUrl() . '" method="get" name="vcard_import">'
+                . Util::formInput();
+            foreach ($_GET as $key => $val) {
+                $html .= '<input type="hidden" name="' . htmlspecialchars($key)
+                    . '" value="' . htmlspecialchars($val) . '" />';
+            }
+
+            $sources = $registry->call('contacts/sources', array(true));
+            if (count($sources) > 1) {
+                $html .=
+                    '<input type="submit" class="button" name="import" value="'
+                    . _("Add to address book:") . '" />'
+                    . '<label for="add_source" class="hidden">'
+                    . _("Address Book") . '</label>'
+                    . '<select id="add_source" name="source">';
+                foreach ($sources as $key => $label) {
+                    $selected = ($key == $prefs->getValue('add_source'))
+                        ? ' selected="selected"' : '';
+                    $html .= '<option value="' . htmlspecialchars($key) . '"'
+                        . $selected . '>' . htmlspecialchars($label)
+                        . '</option>';
+                }
+            } else {
+                reset($sources);
+                $html .=
+                    '<input type="submit" class="button" name="import" value="'
+                    . _("Add to my address book") . '" />'
+                    . '<input type="hidden" name="source" value="'
+                    . htmlspecialchars(key($sources)) . '" />';
+            }
+
+            $html .= '</form></td></tr><tr><td>&nbsp;</td></tr>';
+        }
+
+        $html .=  '</table>';
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status')) . $html,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+
+    /**
+     * TODO
+     */
+    protected function _row($label, $value, $encode = true)
+    {
+        if ($encode) {
+            $label = htmlspecialchars($label);
+            $value = htmlspecialchars($value);
+        }
+        return '<tr><td class="item" valign="top">' . $label .
+            '</td><td class="item" valign="top">' . nl2br($value) .
+            "</td></tr>\n";
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Webcpp.php b/framework/Mime/lib/Horde/Mime/Viewer/Webcpp.php
new file mode 100644 (file)
index 0000000..b59e6bb
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Webcpp class renders out various content in HTML
+ * format by using Web C Plus Plus.
+ *
+ * Web C Plus plus: http://webcpp.sourceforge.net/
+ *
+ * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Mike Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Webcpp extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_toHTML();
+
+        /* The first 2 lines are the Content-Type line and a blank line so
+         * remove them before outputting. */
+        reset($ret);
+        $ret[key($ret)]['data'] = preg_replace("/.*\n.*\n/", '', $ret[key($ret)]['data'], 1);
+
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        $ret = $this->_toHTML();
+        reset($ret);
+        $data = $ret[key($ret)]['data'];
+
+        /* Extract the style sheet, removing any global body formatting
+         * if we're displaying inline. */
+        $res = preg_split(';(</style>)|(<style type="text/css">);', $data);
+        $style = $res[1];
+        $style = preg_replace('/\nbody\s+?{.*?}/s', '', $style);
+
+        /* Extract the content. */
+        $res = preg_split('/\<\/?pre\>/', $data);
+        $body = $res[1];
+
+        $ret[key($ret)]['data'] = '<style>' . $style . '</style><div class="webcpp" style="white-space:pre;font-family:Lucida Console,Courier,monospace;">' . $body . '</div>';
+
+        return $ret;
+    }
+
+    /**
+     * Converts the code to HTML.
+     *
+     * @return string  The HTML-ified version of the MIME part contents.
+     */
+    protected function _toHTML()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        /* Create temporary files for Webcpp. */
+        $tmpin  = Horde::getTempFile('WebcppIn');
+        $tmpout = Horde::getTempFile('WebcppOut');
+
+        /* Write the contents of our buffer to the temporary input file. */
+        file_put_contents($tmpin, $this->_mimepart->getContents());
+
+        /* Get the extension for the mime type. */
+        $ext = Horde_Mime_Magic::MIMEToExt($this->_mimepart->getType());
+
+        /* Execute Web C Plus Plus. Specifying the in and out files didn't
+         * work for me but pipes did. */
+        exec($this->_conf['location'] . " --pipe --pipe -x=$ext -l -a -t < $tmpin > $tmpout");
+        $results = file_get_contents($tmpout);
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $results,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Wordperfect.php b/framework/Mime/lib/Horde/Mime/Viewer/Wordperfect.php
new file mode 100644 (file)
index 0000000..8027e23
--- /dev/null
@@ -0,0 +1,65 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Wordperfect class renders out WordPerfect documents
+ * in HTML format by using the libwpd package.
+ *
+ * libpwd website: http://libwpd.sourceforge.net/
+ *
+ * Copyright 2007-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Matt Selsky <selsky@columbia.edu>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Wordperfect extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => false,
+        'full' => true,
+        'info' => false,
+        'inline' => false
+    );
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        /* Check to make sure the viewer program exists. */
+        if (!isset($this->_conf['location']) ||
+            !file_exists($this->_conf['location'])) {
+            return array();
+        }
+
+        $tmp_wpd = Horde::getTempFile('wpd');
+        $tmp_output = Horde::getTempFile('wpd');
+
+        file_put_contents($tmp_wpd, $this->_mimepart->getContents());
+
+        exec($this->_conf['location'] . " $tmp_wpd > $tmp_output");
+
+        if (file_exists($tmp_output)) {
+            $data = file_get_contents($tmp_output);
+        } else {
+            $data = _("Unable to translate this WordPerfect document");
+        }
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => $data,
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/Zip.php b/framework/Mime/lib/Horde/Mime/Viewer/Zip.php
new file mode 100644 (file)
index 0000000..3dac1c8
--- /dev/null
@@ -0,0 +1,147 @@
+<?php
+/**
+ * The Horde_Mime_Viewer_Zip class renders out the contents of ZIP files in
+ * HTML format.
+ *
+ * Copyright 2000-2009 The Horde Project (http://www.horde.org/)
+ *
+ * See the enclosed file COPYING for license information (LGPL). If you
+ * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
+ *
+ * @author  Chuck Hagenbuch <chuck@horde.org>
+ * @author  Michael Cochrane <mike@graftonhall.co.nz>
+ * @package Horde_Mime_Viewer
+ */
+class Horde_Mime_Viewer_Zip extends Horde_Mime_Viewer_Driver
+{
+    /**
+     * Can this driver render various views?
+     *
+     * @var boolean
+     */
+    protected $_capability = array(
+        'embedded' => false,
+        'forceinline' => true,
+        'full' => true,
+        'info' => false,
+        'inline' => true
+    );
+
+    /**
+     * A callback function to use in _toHTML().
+     *
+     * @var callback
+     */
+    protected $_callback = null;
+
+    /**
+     * Return the full rendered version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _render()
+    {
+        $ret = $this->_toHTML();
+        if (!empty($ret)) {
+            reset($ret);
+            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
+        }
+        return $ret;
+    }
+
+    /**
+     * Return the rendered inline version of the Horde_Mime_Part object.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _renderInline()
+    {
+        return $this->_toHTML();
+    }
+
+    /**
+     * Converts the ZIP file to an HTML display.
+     *
+     * @return array  See Horde_Mime_Viewer_Driver::render().
+     */
+    protected function _toHTML()
+    {
+        $contents = $this->_mimepart->getContents();
+
+        $zip = &Horde_Compress::singleton('zip');
+
+        /* Make sure this is a valid zip file. */
+        if ($zip->checkZipData($contents) === false) {
+            return array();
+        }
+
+        $zipInfo = $zip->decompress($contents, array('action' => HORDE_COMPRESS_ZIP_LIST));
+        if (is_a($zipInfo, 'PEAR_Error')) {
+            return array();
+        }
+        $fileCount = count($zipInfo);
+
+        /* Determine maximum file name length. */
+        $max_array = array();
+        foreach ($zipInfo as $val) {
+            $max_array[] = strlen($val['name']);
+        }
+        $maxlen = empty($max_array) ? 0 : max($max_array);
+
+        require_once 'Horde/Text.php';
+
+        $name = $this->_mimepart->getName(true);
+        if (empty($name)) {
+            $name = _("unnamed");
+        }
+
+        $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
+            '<table><tr><td align="left"><tt><span class="fixed">' .
+            Text::htmlAllSpaces(
+                _("Archive Name") . ': ' . $name . "\n" .
+                _("Archive File Size") . ': ' . strlen($contents) .
+                ' bytes' . "\n" .
+                sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount) .
+                "\n\n" .
+                String::pad(_("File Name"), $maxlen, ' ', STR_PAD_RIGHT) .
+                String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
+                String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
+                String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
+                String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
+                String::pad(_("CRC"), 10, ' ', STR_PAD_LEFT) .
+                String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT) .
+                "\n"
+            ) . str_repeat('-', 69 + $maxlen) . "\n";
+
+        foreach ($zipInfo as $key => $val) {
+            $ratio = (empty($val['size']))
+                ? 0
+                : 100 * ($val['csize'] / $val['size']);
+
+            $val['name']   = String::pad($val['name'], $maxlen, ' ', STR_PAD_RIGHT);
+            $val['attr']   = String::pad($val['attr'], 10,' ', STR_PAD_LEFT);
+            $val['size']   = String::pad($val['size'], 10, ' ', STR_PAD_LEFT);
+            $val['date']   = String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT);
+            $val['method'] = String::pad($val['method'], 10, ' ', STR_PAD_LEFT);
+            $val['crc']    = String::pad($val['crc'], 10, ' ', STR_PAD_LEFT);
+            $val['ratio']  = String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT);
+
+            $val = array_map(array('Text', 'htmlAllSpaces'), $val);
+            if (!is_null($this->_callback)) {
+                $val = call_user_func($this->_callback, $key, $val);
+            }
+
+            $text .= $val['name'] . $val['attr'] . $val['size'] .
+                $val['date'] . $val['method'] . $val['crc'] . $val['ratio'] .
+                "\n";
+        }
+
+        return array(
+            $this->_mimepart->getMimeId() => array(
+                'data' => nl2br($text . str_repeat('-', 69 + $maxlen) . "\n" . '</span></tt></td></tr></table>'),
+                'status' => array(),
+                'type' => 'text/html; charset=' . NLS::getCharset()
+            )
+        );
+    }
+}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/audio.php b/framework/Mime/lib/Horde/Mime/Viewer/audio.php
deleted file mode 100644 (file)
index 317c936..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_audio class sends audio parts to the browser for
- * handling by the browser, a plugin, or a helper application.
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_audio extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_mimepart->getContents(),
-                'status' => array(),
-                'type' => $this->_mimepart->getType()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/css.php b/framework/Mime/lib/Horde/Mime/Viewer/css.php
deleted file mode 100644 (file)
index de16c9d..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-<?php
-
-require_once dirname(__FILE__) . '/source.php';
-
-/**
- * The Horde_Mime_Viewer_css class renders CSS source as HTML with an effort
- * to remove potentially malicious code.
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Chuck Hagenbuch <chuck@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_css extends Horde_Mime_Viewer_source
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Attribute preg patterns.
-     *
-     * @var array
-     */
-    protected $_attrPatterns = array(
-        // Attributes
-        '!([-\w]+\s*):!s' => '<span class="attr"">\\1</span>:',
-        // Values
-        '!:(\s*)(.+?)(\s*;)!s' => ':\\1<span class="value">\\2</span><span class="eol">\\3</span>',
-        // URLs
-        '!(url\([\'"]?)(.*?)([\'"]?\))!s' => '<span class="url">\\1<span class="file">\\2</span>\\3</span>',
-        // Colors
-        '!(#[[:xdigit:]]{3,6})!s' => '<span class="color">\\1</span>',
-        // Parentheses
-        '!({|})!s' => '<span class="parentheses">\\1</span>',
-        // Unity
-        '!(em|px|%)\b!s' => '<em>\\1</em>'
-    );
-
-    /**
-     * Handles preg patterns.
-     *
-     * @var array
-     */
-    protected $_handlesPatterns = array(
-        // HTML Tags
-        '!\b(body|h\d|a|span|div|acronym|small|strong|em|pre|ul|ol|li|p)\b!s' => '<span class="htag">\\1</span>\\2',
-        // IDs
-        '!(#[-\w]+)!s' => '<span class="id">\\1</span>',
-        // Class
-        '!(\.[-\w]+)\b!s' => '<span class="class">\\1</span>',
-        // METAs
-        '!(:link|:visited|:hover|:active|:first-letter)!s' => '<span class="metac">\\1</span>'
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_renderInline();
-
-        // Need Horde headers for CSS tags.
-        reset($ret);
-        $ret[key($ret)]['data'] =  Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
-            $ret[key($ret)]['data'] .
-            Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
-
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        $css = preg_replace_callback('!(}|\*/).*?({|/\*)!s', array($this, '_handles'), htmlspecialchars($this->_mimepart->getContents(), ENT_NOQUOTES));
-        $css = preg_replace_callback('!{[^}]*}!s', array($this, '_attributes'), $css);
-        $css = preg_replace_callback('!/\*.*?\*/!s', array($this, '_comments'), $css);
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_lineNumber(trim($css)),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * TODO
-     */
-    protected function _comments($matches)
-    {
-        return '<span class="comment">' .
-            preg_replace('!(http://[/\w-.]+)!s', '<a href="\\1">\\1</a>', $matches[0]) .
-            '</span>';
-    }
-
-    /**
-     * TODO
-     */
-    protected function _attributes($matches)
-    {
-        return preg_replace(array_keys($this->_attrPatterns), array_values($this->_attrPatterns), $matches[0]);
-    }
-
-    /**
-     * TODO
-     */
-    protected function _handles($matches)
-    {
-        return preg_replace(array_keys($this->_handlesPatterns), array_values($this->_handlesPatterns), $matches[0]);
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/deb.php b/framework/Mime/lib/Horde/Mime/Viewer/deb.php
deleted file mode 100644 (file)
index a942f38..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_deb class renders out lists of files in Debian
- * packages by using the dpkg tool to query the package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_deb extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => true,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_renderInline();
-        if (!empty($ret)) {
-            reset($ret);
-            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
-        }
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        $tmp_deb = Horde::getTempFile('horde_deb');
-
-        file_put_contents($tmp_deb, $this->_mimepart->getContents());
-
-        $fh = popen($this->_conf['location'] . " -f $tmp_deb 2>&1", 'r');
-        while (($rc = fgets($fh, 8192))) {
-            $data .= $rc;
-        }
-        pclose($fh);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => '<pre>' . htmlspecialchars($data) . '</pre>',
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/default.php b/framework/Mime/lib/Horde/Mime/Viewer/default.php
deleted file mode 100644 (file)
index 35f06cc..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_default class simply prints out the encapsulated
- * content.  It exists as a fallback if no other intelligent rendering
- * mechanism could be used.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_default extends Horde_Mime_Viewer_Driver
-{
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/enriched.php b/framework/Mime/lib/Horde/Mime/Viewer/enriched.php
deleted file mode 100644 (file)
index cea2e47..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_enriched class renders out plain text from enriched
- * content tags, ala RFC 1896.
- *
- * By RFC, we must do the minimal conformance measures of: A minimal
- * text/enriched implementation is one that converts "<<" to "<",
- * removes everything between a <param> command and the next balancing
- * </param> removes all other formatting commands (all text enclosed
- * in angle brackets), and outside of <nofill> environments converts
- * any series of n CRLFs to n-1 CRLFs, and converts any lone CRLF
- * pairs to SPACE.
- *
- * We don't qualify as we don't currently track the <nofill>
- * environment, that is we do CRLF conversion even if <nofill> is
- * specified in the text, but we're close at least.
- *
- * Copyright 2001-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Eric Rostetter <eric.rostetter@physics.utexas.edu>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_enriched extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * This driver's capabilities.
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => '<html><body>' . $this->_toHTML() . '</body></html>',
-                'status' => array(),
-                'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
-            )
-        );
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Convert the enriched text to HTML.
-     *
-     * @return string  The HTML-ified version of the MIME part contents.
-     */
-    protected function _toHTML()
-    {
-        $text = trim($this->_mimepart->getContents());
-        if (!strlen($text)) {
-            return array();
-        }
-
-        // We add space at the beginning and end of the string as it will
-        // make some regular expression checks later much easier (so we
-        // don't have to worry about start/end of line characters)
-        $text = ' ' . $text . ' ';
-
-        // We need to preserve << tags, so map them to ascii 1 or ascii 255
-        // We make the assumption here that there would never be an ascii
-        // 1 in an email, which may not be valid, but seems reasonable...
-        // ascii 255 would work if for some reason you don't like ascii 1
-        // ascii 0 does NOT seem to work for this, though I'm not sure why
-        $text = str_replace('<<', chr(1), $text);
-
-        // Remove any unrecognized tags in the text (via RFC minimal specs)
-        // any tags we just don't want to implement can also be removed here
-        // Note that this will remove any html links, but this is intended
-        $implementedTags = '<param><bold><italic><underline><fixed><excerpt>' .
-                           '<smaller><bigger><center><color><fontfamily>' .
-                           '<flushleft><flushright><flushboth><paraindent>';
-        // $unImplementedTags = '<nofill><lang>';
-        $text = strip_tags($text, $implementedTags);
-
-        // restore the << tags as < tags now...
-        $text = str_replace(chr(1), '<<', $text);
-        // $text = str_replace(chr(255), '<', $text);
-
-        $replace = array(
-            // Get color parameters into a more useable format.
-            '/<color><param>([\da-fA-F]+),([\da-fA-F]+),([\da-fA-F]+)<\/param>/Uis' => '<color r=\1 g=\2 b=\3>',
-            '/<color><param>(red|blue|green|yellow|cyan|magenta|black|white)<\/param>/Uis' => '<color n=\1>',
-
-            // Get font family parameters into a more useable format.
-            '/<fontfamily><param>(\w+)<\/param>/Uis' => '<fontfamily f=\1>',
-
-            /* Just remove any remaining parameters -- we won't use them.
-             * Any tags with parameters that we want to implement will have
-             * come before this. Someday we hope to use these tags (e.g. for
-             * <color><param> tags). */
-            '/<param>.*<\/param>/Uis' => '',
-
-            /* Single line breaks become spaces, double line breaks are a
-             * real break. This needs to do <nofill> tracking to be compliant
-             * but we don't want to deal with state at this time, so we fake
-             * it some day we should rewrite this to handle <nofill>
-             * correctly. */
-            '/([^\n])\r\n([^\r])/' => '\1 \2',
-            '/(\r\n)\r\n/' => '\1'
-        );
-        $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
-        // We try to protect against bad stuff here.
-        $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
-
-        // Now convert the known tags to html. Try to remove any tag
-        // parameters to stop people from trying to pull a fast one
-        $replace = array(
-            '/(?<!&lt;)&lt;bold.*&gt;(.*)&lt;\/bold&gt;/Uis' => '<span style="font-weight: bold">\1</span>',
-            '/(?<!&lt;)&lt;italic.*&gt;(.*)&lt;\/italic&gt;/Uis' => '<span style="font-style: italic">\1</span>',
-            '/(?<!&lt;)&lt;underline.*&gt;(.*)&lt;\/underline&gt;/Uis' => '<span style="text-decoration: underline">\1</span>'
-        );
-        $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
-        $text = preg_replace_callback('/(?<!&lt;)&lt;color r=([\da-fA-F]+) g=([\da-fA-F]+) b=([\da-fA-F]+)&gt;(.*)&lt;\/color&gt;/Uis', array($this, 'colorize'), $text);
-
-        $replace = array(
-            '/(?<!&lt;)&lt;color n=(red|blue|green|yellow|cyan|magenta|black|white)&gt;(.*)&lt;\/color&gt;/Uis' => '<span style="color: \1">\2</span>',
-            '/(?<!&lt;)&lt;fontfamily&gt;(.*)&lt;\/fontfamily&gt;/Uis' => '\1',
-            '/(?<!&lt;)&lt;fontfamily f=(\w+)&gt;(.*)&lt;\/fontfamily&gt;/Uis' => '<span style="font-family: \1">\2</span>',
-            '/(?<!&lt;)&lt;smaller.*&gt;/Uis' => '<span style="font-size: smaller">',
-            '/(?<!&lt;)&lt;\/smaller&gt;/Uis' => '</span>',
-            '/(?<!&lt;)&lt;bigger.*&gt;/Uis' => '<span style="font-size: larger">',
-            '/(?<!&lt;)&lt;\/bigger&gt;/Uis' => '</span>',
-            '/(?<!&lt;)&lt;fixed.*&gt;(.*)&lt;\/fixed&gt;/Uis' => '<font face="fixed">\1</font>',
-            '/(?<!&lt;)&lt;center.*&gt;(.*)&lt;\/center&gt;/Uis' => '<div align="center">\1</div>',
-            '/(?<!&lt;)&lt;flushleft.*&gt;(.*)&lt;\/flushleft&gt;/Uis' => '<div align="left">\1</div>',
-            '/(?<!&lt;)&lt;flushright.*&gt;(.*)&lt;\/flushright&gt;/Uis' => '<div align="right">\1</div>',
-            '/(?<!&lt;)&lt;flushboth.*&gt;(.*)&lt;\/flushboth&gt;/Uis' => '<div align="justify">\1</div>',
-            '/(?<!&lt;)&lt;paraindent.*&gt;(.*)&lt;\/paraindent&gt;/Uis' => '<blockquote>\1</blockquote>',
-            '/(?<!&lt;)&lt;excerpt.*&gt;(.*)&lt;\/excerpt&gt;/Uis' => '<blockquote>\1</blockquote>'
-        );
-        $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
-        // Replace << with < now (from translated HTML form).
-        $text = str_replace('&lt;&lt;', '&lt;', $text);
-
-        // Now we remove the leading/trailing space we added at the
-        // start.
-        $text = preg_replace('/^ (.*) $/s', '\1', $text);
-
-        // Make URLs clickable.
-        require_once 'Horde/Text/Filter.php';
-        $text = Text_Filter::filter($text, 'linkurls', array('callback' => 'Horde::externalUrl'));
-
-        /* Wordwrap -- note this could impact on our above RFC compliance *IF*
-         * we honored nofill tags (which we don't yet). */
-        $text = str_replace(array("\t", '  ', "\n "), array('        ', ' &nbsp;', "\n&nbsp;"), $text);
-
-        if ($text[0] == ' ') {
-            $text = '&nbsp;' . substr($text, 1);
-        }
-
-        return '<p class="fixed">' . nl2br($text) . '</p>';
-    }
-
-    /**
-     * TODO
-     */
-    public function colorize($colors)
-    {
-        for ($i = 1; $i < 4; $i++) {
-            $colors[$i] = sprintf('%02X', round(hexdec($colors[$i]) / 255));
-        }
-        return '<span style="color: #' . $colors[1] . $colors[2] . $colors[3] . '">' . $colors[4] . '</span>';
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/enscript.php b/framework/Mime/lib/Horde/Mime/Viewer/enscript.php
deleted file mode 100644 (file)
index 6f1b10d..0000000
+++ /dev/null
@@ -1,168 +0,0 @@
-<?php
-
-require_once dirname(__FILE__) . '/source.php';
-
-/**
- * The Horde_Mime_Viewer_enscript class renders out various content in HTML
- * format by using GNU Enscript.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_enscript extends Horde_Mime_Viewer_source
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_toHTML(false),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_toHTML(true),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Converts the code to HTML.
-     *
-     * @param boolean $inline  Is this an inline display?
-     *
-     * @return string  The HTML-ified version of the MIME part contents.
-     */
-    protected function _toHTML($inline)
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        /* Create temporary files for input to Enscript. Note that we can't
-         * use a pipe, since enscript must have access to the whole file to
-         * determine its type for coloured syntax highlighting. */
-        $tmpin = Horde::getTempFile('enscriptin');
-
-        /* Write the contents of our buffer to the temporary input file. */
-        file_put_contents($tmpin, $this->_mimepart->getContents());
-
-        /* Execute the enscript command. */
-        $lang = escapeshellarg($this->_typeToLang($this->_mimepart->getType()));
-        $results = shell_exec($this->_conf['location'] . " -E$lang --language=html --color --output=- < $tmpin");
-
-        /* Strip out the extraneous HTML from enscript. */
-        if ($inline) {
-            $res_arr = preg_split('/\<\/?pre\>/i', $results);
-            if (count($res_arr) == 3) {
-                $results = trim($res_arr[1]);
-            }
-        }
-
-        return $this->_lineNumber($results);
-    }
-
-    /**
-     * Attempts to determine what language to use for the enscript program
-     * from a MIME type.
-     *
-     * @param string $type  The MIME type.
-     *
-     * @return string  The enscript 'language' parameter string.
-     */
-    protected function _typeToLang($type)
-    {
-        include_once dirname(__FILE__) . '/../Magic.php';
-        $ext = Horde_Mime_Magic::MIMEToExt($type);
-
-        switch ($ext) {
-        case 'cs':
-            return 'java';
-
-        case 'el':
-            return 'elisp';
-
-        case 'h':
-            return 'c';
-
-        case 'C':
-        case 'H':
-        case 'cc':
-        case 'hh':
-        case 'c++':
-        case 'cxx':
-        case 'cpp':
-            return 'cpp';
-
-        case 'htm':
-        case 'shtml':
-        case 'xml':
-            return 'html';
-
-        case 'js':
-            return 'javascript';
-
-        case 'pas':
-            return 'pascal';
-
-        case 'al':
-        case 'cgi':
-        case 'pl':
-        case 'pm':
-            return 'perl';
-
-        case 'ps':
-            return 'postscript';
-
-        case 'vb':
-            return 'vba';
-
-        case 'vhd':
-            return 'vhdl';
-
-        case 'patch':
-        case 'diff':
-            return 'diffu';
-
-        default:
-            return $ext;
-        }
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/html.php b/framework/Mime/lib/Horde/Mime/Viewer/html.php
deleted file mode 100644 (file)
index 0008b4d..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_html class renders out HTML text with an effort to
- * remove potentially malicious code.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (GPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @author  Jon Parise <jon@horde.org>
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_html extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $html = $this->_cleanHTML($this->_mimepart->getContents(), false);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $html['html'],
-                'status' => array(),
-                'type' => $this->_mimepart->getType(true)
-            )
-        );
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        $html = $this->_cleanHTML($this->_mimepart->getContents(), true);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => String::convertCharset($html['data'], $this->_mimepart->getCharset()),
-                'status' => $html['status'],
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Filters active content, dereferences external links, detects phishing,
-     * etc.
-     *
-     * @todo Use IP checks from
-     * http://lxr.mozilla.org/mailnews/source/mail/base/content/phishingDetector.js.
-     *
-     * @param string $data     The HTML data.
-     * @param boolean $inline  Are we viewing inline?
-     *
-     * @return array  Two elements: 'html' and 'status'.
-     */
-    protected function _cleanHTML($data, $inline)
-    {
-        global $browser, $prefs;
-
-        $phish_warn = false;
-
-        /* Deal with <base> tags in the HTML, since they will screw up our own
-         * relative paths. */
-        if (preg_match('/<base href="?([^"> ]*)"? ?\/?>/i', $data, $matches)) {
-            $base = $matches[1];
-            if (substr($base, -1) != '/') {
-                $base .= '/';
-            }
-
-            /* Recursively call _cleanHTML() to prevent clever fiends from
-             * sneaking nasty things into the page via $base. */
-            $base = $this->_cleanHTML($base, $inline);
-
-            /* Attempt to fix paths that were relying on a <base> tag. */
-            if (!empty($base)) {
-                $pattern = array('|src=(["\'])([^:"\']+)\1|i',
-                                 '|src=([^: >"\']+)|i',
-                                 '|href= *(["\'])([^:"\']+)\1|i',
-                                 '|href=([^: >"\']+)|i');
-                $replace = array('src=\1' . $base . '\2\1',
-                                 'src=' . $base . '\1',
-                                 'href=\1' . $base . '\2\1',
-                                 'href=' . $base . '\1');
-                $data = preg_replace($pattern, $replace, $data);
-            }
-        }
-
-        require_once 'Horde/Text/Filter.php';
-        $strip_style_attributes = (($browser->isBrowser('mozilla') &&
-                                    $browser->getMajor() == 4) ||
-                                   $browser->isBrowser('msie'));
-        $strip_styles = $inline || $strip_style_attributes;
-        $data = Text_Filter::filter($data, 'xss',
-                                    array('body_only' => $inline,
-                                          'strip_styles' => $strip_styles,
-                                          'strip_style_attributes' => $strip_style_attributes));
-
-        /* Check for phishing exploits. */
-        if ($this->getConfigParam('phishing_check')) {
-            if (preg_match('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})(?:[^>]*>\s*(?:\\1:\/\/)?(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})[^<]*<\/a)?/i', $data, $m)) {
-                /* Check 1: Check for IP address links, but ignore if the link
-                 * text has the same IP address. */
-                if (!isset($m[3]) || ($m[2] != $m[3])) {
-                    if (isset($m[3])) {
-                        $data = preg_replace('/href\s*=\s*["\']?\s*(http|https|ftp):\/\/' . preg_quote($m[2], '/') . '(?:[^>]*>\s*(?:$1:\/\/)?' . preg_quote($m[3], '/') . '[^<]*<\/a)?/i', 'class="mimeStatusWarning" $0', $data);
-                    }
-                    $phish_warn = true;
-                }
-            } elseif (preg_match_all('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/([^\s"\'>]+)["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?(.*?)<\/a/is', $data, $m)) {
-                /* $m[1] = Link; $m[2] = Target
-                 * Check 2: Check for links that point to a different host than
-                 * the target url; if target looks like a domain name, check it
-                 * against the link. */
-                for ($i = 0, $links = count($m[0]); $i < $links; ++$i) {
-                    $link = strtolower(urldecode($m[1][$i]));
-                    $target = strtolower(preg_replace('/^(http|https|ftp):\/\//', '', strip_tags($m[2][$i])));
-                    if (preg_match('/^[-._\da-z]+\.[a-z]{2,}/i', $target) &&
-                        (strpos($link, $target) !== 0) &&
-                        (strpos($target, $link) !== 0)) {
-                        /* Don't consider the link a phishing link if the
-                         * domain is the same on both links (e.g.
-                         * adtracking.example.com & www.example.com). */
-                        preg_match('/\.?([^\.\/]+\.[^\.\/]+)[\/?]/', $link, $host1);
-                        preg_match('/\.?([^\.\/]+\.[^\.\/ ]+)([\/ ].*)?$/', $target, $host2);
-                        if (!(count($host1) && count($host2)) ||
-                            (strcasecmp($host1[1], $host2[1]) !== 0)) {
-                            $data = preg_replace('/href\s*=\s*["\']?\s*(?:http|https|ftp):\/\/' . preg_quote($m[1][$i], '/') . '["\']?[^>]*>\s*(?:(?:http|https|ftp):\/\/)?' . preg_quote($m[2][$i], '/') . '<\/a/is', 'class="mimeStatusWarning" $0', $data);
-                            $phish_warn = true;
-                        }
-                    }
-                }
-            }
-        }
-
-        /* Try to derefer all external references. */
-        $data = preg_replace_callback('/href\s*=\s*(["\'])?((?(1)[^\1]*?|[^\s>]+))(?(1)\1|)/i', array($this, '_dereferCallback'), $data);
-
-        /* Get phishing warning. */
-        $status = array();
-        if ($inline && $phish_warn) {
-            $warning = array(
-                sprintf(_("%s: This message may not be from whom it claims to be. Beware of following any links in it or of providing the sender with any personal information."), _("Warning")),
-                _("The links that caused this warning have this background color:") . ' <span class="mimeStatusWarning">' . _("EXAMPLE") . '.</span>'
-            );
-
-            if (!$inline) {
-                $temp = array();
-                foreach ($phish_warning as $val) {
-                    $temp[] = String::convertCharset($val, NLS::getCharset(), $this->_mimepart->getCharset());
-                }
-                $warning = $temp;
-            }
-
-            $status[] = array(
-                'class' => 'mimestatuswarning',
-                'text' => $warning
-            );
-        }
-
-        return array('html' => $data, 'status' => $status);
-    }
-
-    /**
-     * TODO
-     *
-     * @param string $m  TODO
-     *
-     * @return string  TODO
-     */
-    protected function _dereferCallback($m)
-    {
-        return 'href="' . Horde::externalUrl($m[2]) . '"';
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/images.php b/framework/Mime/lib/Horde/Mime/Viewer/images.php
deleted file mode 100644 (file)
index 2dcde0e..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_images class allows images to be displayed.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_images extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_mimepart->getContents(),
-                'status' => array(),
-                'type' => $this->_getType()
-            )
-        );
-    }
-
-    /**
-     * Return the content-type to use for the image.
-     *
-     * @return string  The content-type of the image.
-     */
-    protected function _getType()
-    {
-        $type = $this->_mimepart->getType();
-
-        switch ($type) {
-        case 'image/pjpeg':
-            /* image/jpeg and image/pjpeg *appear* to be the same entity, but
-             * Mozilla (for one) don't seem to want to accept the latter. */
-            return 'image/jpeg';
-
-        case 'image/x-png':
-            /* image/x-png == image/png. */
-            return 'image/png';
-
-        default:
-            return $type;
-        }
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/msexcel.php b/framework/Mime/lib/Horde/Mime/Viewer/msexcel.php
deleted file mode 100644 (file)
index 56b8f34..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_msexcel class renders out Microsoft Excel
- * documents in HTML format by using the Gnumeric package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_msexcel extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        $tmp_xls = Horde::getTempFile('horde_msexcel');
-        $tmp_out = Horde::getTempFile('horde_msexcel');
-
-        file_put_contents($tmp_xls, $this->_mimepart->getContents());
-        $args = ' -E Gnumeric_Excel:excel_dsf -T Gnumeric_html:html40 ' . $tmp_xls . ' ' . $tmp_out;
-
-        exec($this->_conf['location'] . $args);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => file_get_contents($tmp_out),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/mspowerpoint.php b/framework/Mime/lib/Horde/Mime/Viewer/mspowerpoint.php
deleted file mode 100644 (file)
index f72c455..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_mspowerpoint class renders out Microsoft Powerpoint
- * documents in HTML format by using the xlHtml package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_mspowerpoint extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        $data = '';
-        $tmp_ppt = Horde::getTempFile('horde_mspowerpoint');
-
-        file_put_contents($tmp_ppt, $this->_mimepart->getContents());
-
-        $fh = popen($this->_conf['location'] . " $tmp_ppt 2>&1", 'r');
-        while (($rc = fgets($fh, 8192))) {
-            $data .= $rc;
-        }
-        pclose($fh);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $data,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/msword.php b/framework/Mime/lib/Horde/Mime/Viewer/msword.php
deleted file mode 100644 (file)
index 945ee9b..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_msword class renders out Microsoft Word documents
- * in HTML format by using the AbiWord package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_msword extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        $tmp_word = Horde::getTempFile('msword');
-        $tmp_output = Horde::getTempFile('msword');
-        $tmp_file = str_replace(Horde::getTempDir() . '/', '', $tmp_output);
-
-        file_put_contents($tmp_word, $this->_mimepart->getContents());
-        $args = ' --to=html --to-name=' . $tmp_output . ' ' . $tmp_word;
-
-        exec($this->_conf['location'] . $args);
-
-        if (file_exists($tmp_output)) {
-            $data = file_get_contents($tmp_output);
-            $type = 'text/html';
-        } else {
-            $data = _("Unable to translate this Word document");
-            $type = 'text/plain';
-        }
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $data,
-                'status' => array(),
-                'type' => $type . '; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo.php b/framework/Mime/lib/Horde/Mime/Viewer/ooo.php
deleted file mode 100644 (file)
index 8554b38..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_ooo class renders out OpenOffice.org documents in
- * HTML format.
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Marko Djukic <marko@oblo.com>
- * @author  Jan Schneider <jan@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_ooo extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $has_xslt = Util::extensionExists('xslt');
-        $has_ssfile = function_exists('domxml_xslt_stylesheet_file');
-        if (($use_xslt = $has_xslt || $has_ssfile)) {
-            $tmpdir = Util::createTempDir(true);
-        }
-
-        $fnames = array('content.xml', 'styles.xml', 'meta.xml');
-        $tags = array(
-            'text:p' => 'p',
-            'table:table' => 'table border="0" cellspacing="1" cellpadding="0" ',
-            'table:table-row' => 'tr bgcolor="#cccccc"',
-            'table:table-cell' => 'td',
-            'table:number-columns-spanned=' => 'colspan='
-        );
-
-        require_once 'Horde/Compress.php';
-        $zip = &Horde_Compress::singleton('zip');
-        $list = $zip->decompress($this->_mimepart->getContents(), array('action' => HORDE_COMPRESS_ZIP_LIST));
-
-        foreach ($list as $key => $file) {
-            if (in_array($file['name'], $fnames)) {
-                $content = $zip->decompress($this->_mimepart->getContents(), array(
-                    'action' => HORDE_COMPRESS_ZIP_DATA,
-                    'info' => $list,
-                    'key' => $key
-                ));
-
-                if ($use_xslt) {
-                    file_put_contents($tmpdir . $file['name'], $content);
-                } elseif ($file['name'] == 'content.xml') {
-                    return array(
-                        $this->_mimepart->getMimeId() => array(
-                            'data' => str_replace(array_keys($tags), array_values($tags), $content),
-                            'status' => array(),
-                            'type' => 'text/html; charset=UTF-8'
-                        )
-                    );
-                }
-            }
-        }
-
-        if (!Util::extensionExists('xslt')) {
-            return array();
-        }
-
-        $xsl_file = dirname(__FILE__) . '/ooo/main_html.xsl';
-
-        if ($has_ssfile) {
-            /* Use DOMXML */
-            $xslt = domxml_xslt_stylesheet_file($xsl_file);
-            $dom  = domxml_open_file($tmpdir . 'content.xml');
-            $result = @$xslt->process($dom, array(
-                'metaFileURL' => $tmpdir . 'meta.xml',
-                'stylesFileURL' => $tmpdir . 'styles.xml',
-                'disableJava' => true)
-            );
-            $result = $xslt->result_dump_mem($result);
-        } else {
-            // Use XSLT
-            $xslt = xslt_create();
-            $result = @xslt_process($xslt, $tmpdir . 'content.xml', $xsl_file, null, null, array(
-                'metaFileURL' => $tmpdir . 'meta.xml',
-                'stylesFileURL' => $tmpdir . 'styles.xml',
-                'disableJava' => true)
-            );
-            if (!$result) {
-                $result = xslt_error($xslt);
-            }
-            xslt_free($xslt);
-        }
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $result,
-                'status' => array(),
-                'type' => 'text/html; charset=UTF-8'
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/common.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/common.xsl
deleted file mode 100644 (file)
index 943a5b9..0000000
+++ /dev/null
@@ -1,1165 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                extension-element-prefixes="xt"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-
-    <!-- ************ -->
-    <!-- *** body *** -->
-    <!-- ************ -->
-
-
-    <xsl:template match="/*/office:body">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!-- isDebugMode-START: only isDebugMode purpose: shows the inlined style attributes of the temporary variable -->
-        <xsl:if test="$isDebugMode and not($outputType = 'CSS_HEADER')">
-            <xsl:element name="debug_tree_of_styles"><xsl:text>
-            </xsl:text><xsl:for-each select="$collectedGlobalData/allstyles/*">
-<xsl:text>                      </xsl:text><xsl:value-of select="name()"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
-            </xsl:text>
-                    </xsl:for-each>
-            </xsl:element>
-        </xsl:if>
-    <!-- isDebugMode-END -->
-
-
-               <!-- not using of 'apply-styles-and-content' as the content table information migth have been added to 'collectedGlobalData' variable -->
-        <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-
-
-        <!-- Usability feature, a link to the Content talbe above all level 1 header -->
-        <xsl:if test="$contentTableHeadings">
-            <xsl:call-template name="add-child-document-usability-links"/>
-        </xsl:if>
-
-
-               <xsl:choose>
-               <xsl:when test="not($outputType = 'WML') and not($outputType = 'PALM')">
-                       <xsl:choose>
-                               <!--If the input document is a global document and embed child documents (links) the transformation of the children will be started as well.
-                                   This is necessary as child documents do not know anything about their embedding into a global document. Chapters of childs
-                                   always start to count by zero instead of continously numbering.
-                                   For this, the chapter numbers of the current document (as a sequence of a global document) is dependent
-                                   of the number of chapter of the same level in preceding documents.
-                                   In case of multiple children, for usability reasons some linking is gonna be offered and the URLs of the content-table,
-                                   preceding and following file have to be given for the transformation.
-                                   -->
-                           <xsl:when test="/*/@office:class='text-global' and /*/office:body/text:section/text:section-source/@xlink:href">
-                                               <!-- the children will be called later with a modified 'collectedGlobalData' variable -->
-                               <xsl:call-template name="transform-global-document-and-children">
-                                   <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                               </xsl:call-template>
-                           </xsl:when>
-                                       <xsl:otherwise>
-                                       <xsl:apply-templates>
-                                           <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                       </xsl:apply-templates>
-                                       </xsl:otherwise>
-                               </xsl:choose>
-               </xsl:when>
-                       <xsl:otherwise>
-                       <xsl:apply-templates>
-                           <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                       </xsl:apply-templates>
-                       </xsl:otherwise>
-               </xsl:choose>
-
-
-
-        <!-- Usability feature, a link to the Content talbe above all level 1 header -->
-        <xsl:if test="$contentTableHeadings">
-            <xsl:call-template name="add-child-document-usability-links"/>
-        </xsl:if>
-
-
-    </xsl:template>
-
-
-
-
-    <!-- deactivating default template -->
-    <xsl:template match="*"/>
-
-
-    <!-- allowing all matched text nodes -->
-    <xsl:template match="text()">
-<!-- WML         <xsl:value-of select="normalize-space(.)"/> -->
-        <xsl:value-of select="."/>
-    </xsl:template>
-
-
-
-    <!-- ################### -->
-    <!-- ### INLINE-TEXT ### -->
-    <!-- ################### -->
-
-
-    <!-- ****************** -->
-    <!-- *** Whitespace *** -->
-    <!-- ****************** -->
-
-
-    <xsl:template match="text:s">
-        <xsl:call-template name="write-breakable-whitespace">
-            <xsl:with-param name="whitespaces" select="@text:c"/>
-        </xsl:call-template>
-    </xsl:template>
-
-
-    <!--write the number of 'whitespaces' -->
-    <xsl:template name="write-breakable-whitespace">
-        <xsl:param name="whitespaces"/>
-
-        <!--write two space chars as the normal white space character will be stripped
-            and the other is able to break -->
-        <xsl:text>&#160;</xsl:text>
-        <xsl:if test="$whitespaces >= 2">
-            <xsl:call-template name="write-breakable-whitespace-2">
-                <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
-            </xsl:call-template>
-        </xsl:if>
-    </xsl:template>
-
-
-    <!--write the number of 'whitespaces' -->
-    <xsl:template name="write-breakable-whitespace-2">
-        <xsl:param name="whitespaces"/>
-        <!--write two space chars as the normal white space character will be stripped
-            and the other is able to break -->
-        <xsl:text> </xsl:text>
-        <xsl:if test="$whitespaces >= 2">
-            <xsl:call-template name="write-breakable-whitespace">
-                <xsl:with-param name="whitespaces" select="$whitespaces - 1"/>
-            </xsl:call-template>
-        </xsl:if>
-    </xsl:template>
-
-
-
-
-    <!-- *************** -->
-    <!-- *** Textbox *** -->
-    <!-- *************** -->
-
-    <xsl:template match="draw:text-box">
-        <xsl:param name="collectedGlobalData"/>
-
-            <xsl:choose>
-                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-                <!--                or                  -->
-                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
-                    <xsl:element name="span">
-                        <xsl:if test="@fo:min-height | @svg:width">
-                            <xsl:attribute name="style">
-                                <xsl:choose>
-                                    <xsl:when test="not(@svg:width)">
-                                        <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
-                                    </xsl:when>
-                                    <xsl:when test="not(@fo:min-height)">
-                                        <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
-                                    </xsl:when>
-                                    <xsl:otherwise>
-                                        <xsl:text>height: </xsl:text><xsl:value-of select="@fo:min-height"/><xsl:text>; </xsl:text>
-                                        <xsl:text>width: </xsl:text><xsl:value-of select="@svg:width"/><xsl:text>; </xsl:text>
-                                    </xsl:otherwise>
-                                </xsl:choose>
-                            </xsl:attribute>
-                        </xsl:if>
-                        <xsl:apply-templates select="@draw:name"/>
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!-- 2DO prove best usage for PALM -->
-                <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'PALM'">
-                    <xsl:element name="span">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!-- 2DO prove best usage for WML -->
-                <!--+++++ WML / WAP  +++++-->
-                <xsl:otherwise>
-                    <!-- no nested p tags in wml1.1 allowed -->
-                    <xsl:choose>
-                        <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                            <xsl:call-template name="apply-styles-and-content">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:call-template>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:element name="p">
-                                <xsl:call-template name="apply-styles-and-content">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                             </xsl:element>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:otherwise>
-            </xsl:choose>
-    </xsl:template>
-
-    <!-- ID / NAME of text-box -->
-    <xsl:template match="@draw:name">
-
-        <xsl:attribute name="id">
-            <xsl:value-of select="."/>
-        </xsl:attribute>
-    </xsl:template>
-
-
-
-    <!-- ****************** -->
-    <!-- *** Paragraphs *** -->
-    <!-- ****************** -->
-
-    <xsl:template match="text:p | draw:page">
-        <xsl:param name="collectedGlobalData"/>
-
-            <xsl:choose>
-                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-                <xsl:when test="$outputType = 'CSS_HEADER'">
-                    <xsl:element name="p">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-
-                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'CSS_INLINED'">
-                    <xsl:element name="p">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'PALM'">
-                    <xsl:choose>
-                        <!-- in palm paragraphs children of text:list-items are better shown without 'p' tag-->
-                        <xsl:when test="name(parent::*) = 'text:list-item'">
-                            <xsl:call-template name="apply-styles-and-content">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:call-template>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:element name="p">
-                                <xsl:call-template name="apply-styles-and-content">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:element>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:when>
-                <!--+++++ WML / WAP  +++++-->
-                <xsl:otherwise>
-                    <!-- no nested p tags in wml1.1 allowed -->
-                    <xsl:choose>
-                        <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                            <xsl:call-template name="apply-styles-and-content">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:call-template>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:element name="p">
-                                <xsl:call-template name="apply-styles-and-content">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                             </xsl:element>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:otherwise>
-            </xsl:choose>
-    </xsl:template>
-
-
-
-    <!-- ***************** -->
-    <!-- *** Text Span *** -->
-    <!-- ***************** -->
-
-    <xsl:template match="text:span">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER'">
-                <xsl:element name="span">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'CSS_INLINED'">
-                <xsl:element name="span">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-            <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'PALM'">
-                <xsl:call-template name="apply-styles-and-content">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-            <!--+++++ WML / WAP  +++++-->
-            <xsl:otherwise>
-                <!-- no nested p tags in wml1.1 allowed -->
-                <xsl:choose>
-                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:element name="p">
-                            <xsl:call-template name="apply-styles-and-content">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:call-template>
-                        </xsl:element>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <!-- **************** -->
-    <!-- *** Headings *** -->
-    <!-- **************** -->
-
-    <xsl:template match="text:h">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!-- Every heading element will get an unique anchor for its file, from its hiearchy level and name:
-            For example:  The heading title 'My favorite heading' might get <a name="1+2+2+My+favorite+heading"/> -->
-        <xsl:choose>
-            <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
-            <!-- The URL linking of an table-of-content is due to a bug (cmp. bug id# 102311) not mapped as URL in the XML.
-                 Linking of the table-of-content can therefore only be archieved by a work-around in HTML -->
-                <xsl:call-template name="create-heading">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-           </xsl:when>
-           <xsl:otherwise>
-                <!-- necessary as anchor for the content table -->
-                <xsl:call-template name="create-heading-anchor">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-
-                <!-- no embedding the orginal header, as an explicit anchor might be already set -->
-                <xsl:call-template name="create-heading">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- default matching for header elements -->
-    <xsl:template name="create-heading">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER'">
-
-                <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
-                <xsl:element name="{$headertyp}">
-
-                    <!-- outline style 'text:min-label-width' is interpreted as a CSS 'margin-left' attribute -->
-                    <xsl:variable name="min-label" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/style:properties/@text:min-label-width"/>
-                    <xsl:if test="$min-label">
-                        <xsl:attribute name="style"><xsl:text>margin-left:</xsl:text><xsl:value-of select="$min-label"/><xsl:text>;</xsl:text></xsl:attribute>
-                    </xsl:if>
-
-
-                    <xsl:attribute name="class"><xsl:value-of select="translate(@text:style-name, '. %()/\', '')"/></xsl:attribute>
-
-                    <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
-                    <xsl:if test="string-length($office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@style:num-format) != 0">
-
-                        <xsl:choose>
-                            <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled or not($outputType = 'CSS_HEADER')">
-                                <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level',
-                                     furthermore when the current document is referenced by a global document - as part of a whole sequence of documents -,
-                                     the chapter no. is dependent of the amount of started headers in preceding documents.
-                                     If the 'text:start-value is not set the default value of '1' has to be taken. -->
-                                <xsl:variable name="startValue" select="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
-                                <xsl:choose>
-                                    <xsl:when test="$startValue">
-                                        <xsl:choose>
-                                            <xsl:when test="@text:level='1'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel1
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='2'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel2
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='3'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel3
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='4'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel4
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='5'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel5
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='6'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel6
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='7'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel7
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='8'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel8
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='9'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel9
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='10'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel10
-                                                            + $startValue"/>
-                                            </xsl:when>
-                                        </xsl:choose>
-                                    </xsl:when>
-                                    <xsl:otherwise>
-                                        <xsl:choose>
-                                            <xsl:when test="@text:level='1'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel1
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='2'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel2
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='3'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel3
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='4'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel4
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='5'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel5
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='6'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel6
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='7'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel7
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='8'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel8
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='9'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel9
-                                                            + 1"/>
-                                            </xsl:when>
-                                            <xsl:when test="@text:level='10'">
-                                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                            + $precedingChapterLevel10
-                                                            + 1"/>
-                                            </xsl:when>
-                                        </xsl:choose>
-                                    </xsl:otherwise>
-                                </xsl:choose>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:call-template name="get-absolute-chapter-no">
-                                    <xsl:with-param name="precedingChapterLevel1"    select="$precedingChapterLevel1"/>
-                                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                        <xsl:text> &#160; &#160;</xsl:text>
-                    </xsl:if>
-                    <xsl:apply-templates>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:apply-templates>
-
-                </xsl:element>
-            </xsl:when>
-
-
-            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'CSS_INLINED'">
-                <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
-                <xsl:element name="{$headertyp}">
-
-                    <xsl:apply-templates select="@text:style-name">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:apply-templates>
-
-                    <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
-                    <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
-
-                        <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
-                        <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                            + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
-                        <xsl:text> &#160; &#160;</xsl:text>
-                    </xsl:if>
-
-                </xsl:element>
-            </xsl:when>
-
-            <!-- 2DO: add Chapter No. for PALM and WML <-> problem nested apply-templates -->
-
-            <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'PALM'">
-                <xsl:variable name="headertyp" select="concat('h', @text:level)"/>
-                <xsl:element name="{$headertyp}">
-
-
-                    <!-- All children content have to be nested in the styles (e.g. <i><b>ANY CONTENT</b></i>)
-                         for this xsl:apply-templates will be called later / implicit -->
-                    <xsl:call-template name="create-attribute-ALIGN">
-                        <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
-                        <xsl:with-param name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/@text:style-name]"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ WML / WAP  +++++-->
-            <xsl:otherwise>
-                <!-- no nested p tags in wml1.1 allowed -->
-                <xsl:choose>
-                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                        <!-- since no header styles exist, an emphasis is used -->
-                        <xsl:element name="em">
-
-                            <!-- writing out a chapter number if desired (noticable when a corresponding 'text:outline-style' exist -->
-                            <xsl:if test="$office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:style-name">
-
-                                <!-- the chapter number is the sum of 'text:start-value' and preceding siblings of 'text:h' with the same 'text:level' -->
-                                <xsl:value-of select="count(preceding-sibling::text:h[@text:level = current()/@text:level])
-                                                    + $office:styles/text:outline-style/text:outline-level-style[@text:level = current()/@text:level]/@text:start-value"/>
-                                <xsl:text> &#160; &#160;</xsl:text>
-                            </xsl:if>
-
-                            <xsl:apply-templates select="@text:style-name">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:apply-templates>
-
-                        </xsl:element>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:element name="p">
-                            <!-- since no header styles exist, an emphasis is used -->
-                            <xsl:element name="em">
-                                <xsl:call-template name="apply-styles-and-content">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:element>
-                        </xsl:element>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <!-- ************* -->
-    <!-- *** Link  *** -->
-    <!-- ************* -->
-
-    <xsl:template match="text:a | draw:a">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:call-template name="create-common-link">
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:call-template>
-    </xsl:template>
-
-
-    <xsl:template name="create-common-link">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <xsl:when test="not($outputType = 'WML')">
-                <xsl:element name="a">
-                    <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                    <!--<xsl:attribute name="class">ContentLink</xsl:attribute>-->
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-            <xsl:otherwise>
-                <!-- no nested p tags in wml1.1 allowed -->
-                <xsl:choose>
-                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                        <xsl:element name="a">
-                            <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                            <xsl:apply-templates select="descendant::text()"/>
-                        </xsl:element>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:element name="p">
-                            <xsl:element name="a">
-                                <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                                <xsl:apply-templates select="descendant::text()"/>
-                            </xsl:element>
-                        </xsl:element>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-
-
-    <!-- ******************* -->
-    <!-- *** Image Link  *** -->
-    <!-- ******************* -->
-
-    <xsl:template match="draw:image">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!-- NO IMAGES SUPPLIED FOR WAP OR PALM -->
-        <xsl:if test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
-
-            <xsl:element name="img">
-                <xsl:if test="@svg:width">
-                    <xsl:attribute name="width">
-                        <xsl:call-template name="convert2pixel">
-                            <xsl:with-param name="value" select="@svg:width"/>
-                        </xsl:call-template>
-                    </xsl:attribute>
-                </xsl:if>
-                <xsl:if test="@svg:height">
-                    <xsl:attribute name="height">
-                        <xsl:call-template name="convert2pixel">
-                            <xsl:with-param name="value" select="@svg:height"/>
-                        </xsl:call-template>
-                    </xsl:attribute>
-                </xsl:if>
-                <xsl:if test="svg:desc">
-                    <xsl:attribute name="alt">
-                        <xsl:value-of select="svg:desc"/>
-                    </xsl:attribute>
-                </xsl:if>
-                <xsl:choose>
-                     <!-- for images jared in open office document -->
-                    <xsl:when test="contains(@xlink:href, '#Pictures/')">
-                        <!-- creating an absolute http URL to the packed image file -->
-                        <xsl:attribute name="src"><xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after(@xlink:href, '#Pictures/'), $optionalURLSuffix)"/></xsl:attribute>
-                    </xsl:when>
-<!--                    Due to a XT bug no DOS ':' before DRIVE letter is allowed, it would result in a unkown protoco exception, but a file URL for a DOS
-                                               path needs the DRIVE letter, therefore all relative URLs remain relativ
-
-                                       <xsl:when test="contains(@xlink:href,'//') or (substring(@xlink:href,2,1) = ':') or starts-with(@xlink:href, '/')">
-                        <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <!~~ creating a absolute path/URL for the referenced resource ~~>
-                        <xsl:attribute name="src"><xsl:value-of select="concat($absoluteSourceDirRef, @xlink:href, $optionalURLSuffix)"/></xsl:attribute>
-                    </xsl:otherwise>
--->
-                                       <xsl:otherwise>
-                        <xsl:attribute name="src"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                    </xsl:otherwise>
-                </xsl:choose>
-
-                <xsl:call-template name="apply-styles-and-content">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:element>
-            <!-- adding a line break to make the presentation more even with the OOo view -->
-            <xsl:element name="br"/>
-        </xsl:if>
-    </xsl:template>
-
-
-
-    <!-- ******************** -->
-    <!-- *** ordered list *** -->
-    <!-- ******************** -->
-
-    <xsl:template match="text:ordered-list">
-        <xsl:param name="collectedGlobalData"/>
-
-            <xsl:choose>
-                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-                <xsl:when test="$outputType = 'CSS_HEADER'">
-                    <xsl:element name="ol">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'CSS_INLINED'">
-                    <xsl:element name="ol">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'PALM'">
-                    <xsl:element name="ol">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!--+++++ WML / WAP  +++++-->
-                <xsl:otherwise>
-                    <xsl:choose>
-                        <!-- simulating content break of capsulated list elements -->
-                        <xsl:when test="ancestor::text:list-item">
-                            <xsl:choose>
-                                <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                                    <!-- simulating content break of capsulated list elements -->
-                                    <xsl:element name="br"></xsl:element>
-                                    <xsl:call-template name="apply-styles-and-content">
-                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    </xsl:call-template>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:element name="p">
-                                        <!-- simulating content break of capsulated list elements -->
-                                        <xsl:element name="br"></xsl:element>
-                                        <xsl:call-template name="apply-styles-and-content">
-                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                        </xsl:call-template>
-                                    </xsl:element>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:call-template name="apply-styles-and-content">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:call-template>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:otherwise>
-            </xsl:choose>
-    </xsl:template>
-
-
-
-    <!-- ********************** -->
-    <!-- *** unordered list *** -->
-    <!-- ********************** -->
-
-    <xsl:template match="text:unordered-list">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER'">
-                <xsl:element name="ul">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'CSS_INLINED'">
-                <xsl:element name="ul">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'PALM'">
-                <xsl:element name="ul">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ WML / WAP  +++++-->
-            <xsl:otherwise>
-                <xsl:choose>
-                    <!-- simulating content break of capsulated list elements -->
-                    <xsl:when test="ancestor::text:list-item">
-                        <xsl:choose>
-                            <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                                <!-- simulating content break of capsulated list elements -->
-                                <xsl:element name="br"></xsl:element>
-                                <xsl:call-template name="apply-styles-and-content">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:element name="p">
-                                    <!-- simulating content break of capsulated list elements -->
-                                    <xsl:element name="br"></xsl:element>
-                                    <xsl:call-template name="apply-styles-and-content">
-                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    </xsl:call-template>
-                                </xsl:element>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <!-- ****************** -->
-    <!-- *** list item  *** -->
-    <!-- ****************** -->
-
-    <xsl:template match="text:list-item">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER'">
-                <xsl:element name="li">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'CSS_INLINED'">
-                <xsl:element name="li">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ PALM 3.2 SUBSET AND WAP INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'PALM'">
-                <xsl:element name="li">
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ WML / WAP  +++++-->
-            <xsl:otherwise>
-                <xsl:choose>
-                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                        <!-- simulating list elements -->
-                        <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
-                        <xsl:text>* </xsl:text>
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                        <!-- list item break simulation (not in a table)-->
-                        <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
-                            <xsl:element name="br"/>
-                        </xsl:if>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:element name="p">
-                            <!-- simulating list elements -->
-                            <xsl:for-each select="ancestor::text:list-item">*</xsl:for-each>
-                            <xsl:text>* </xsl:text>
-                            <xsl:call-template name="apply-styles-and-content">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:call-template>
-                            <!-- list item break simulation (not in a table)-->
-                            <xsl:if test="not(ancestor::table:table-cell) or following-sibling::text:list-item">
-                                <xsl:element name="br"/>
-                            </xsl:if>
-                        </xsl:element>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <!-- ********************************************** -->
-    <!-- *** Text Section (contains: draw:text-box) *** -->
-    <!-- ********************************************** -->
-
-        <xsl:template match="text:section">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:if test="not(contains(@text:display, 'none'))">
-            <xsl:choose>
-                <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-                <xsl:when test="$outputType = 'CSS_HEADER'">
-                    <xsl:element name="span">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'CSS_INLINED'">
-                    <xsl:element name="span">
-                        <xsl:call-template name="apply-styles-and-content">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:element>
-                </xsl:when>
-                <!--+++++ PALM 3.2 SUBSET INLINED WAY  +++++-->
-                <xsl:when test="$outputType = 'PALM'">
-                    <xsl:choose>
-                        <xsl:when test="name(parent::*) = 'text:list-item'">
-                                        <xsl:call-template name="apply-styles-and-content">
-                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                        </xsl:call-template>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:element name="p">
-                                <xsl:call-template name="apply-styles-and-content">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:element>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:when>
-                <!--+++++ WML / WAP  +++++-->
-                <xsl:otherwise>
-                    <xsl:choose>
-                        <xsl:when test="not($outputType = 'WML')">
-                            <xsl:element name="a">
-                                <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                                <xsl:call-template name="apply-styles-and-content">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:element>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <!-- no nested p tags in wml1.1 allowed -->
-                            <xsl:choose>
-                                <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                                    <xsl:call-template name="apply-styles-and-content">
-                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    </xsl:call-template>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:element name="p">
-                                        <xsl:call-template name="apply-styles-and-content">
-                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                        </xsl:call-template>
-                                    </xsl:element>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:if>
-    </xsl:template>
-
-
-
-    <xsl:template match="text:line-break">
-        <xsl:element name="br"/>
-    </xsl:template>
-
-
-<!--
-    TABHANDLING PROBLEM: Tabs are possible to be shown in the HTML text file, but will be later stripped as whitespaces.
-        To prevent this one way would be the PRE tag which unfortunately ALWAYS result into a line-break. No surrounding NOBR tags help.
-
-    <xsl:template match="text:tab-stop">
-        <xsl:if test="not(preceding-sibling::text:tab-stop)">
-            <xsl:element name="pre"><xsl:text>&#9;</xsl:text><xsl:for-each select="following-sibling::text:tab-stop"><xsl:text>&#9;</xsl:text></xsl:for-each></xsl:element>
-        </xsl:if>
-     </xsl:template>
-
-    <xsl:template match="text:tab-stop"><xsl:text>&#9;</xsl:text></xsl:template>
--->
-    <!-- HOTFIX: 8 non-breakable-spaces instead of a TAB is a hack sometimes less Tabs are needed and the code more difficult to read -->
-    <xsl:template match="text:tab-stop">
-        <xsl:call-template name="write-breakable-whitespace">
-            <xsl:with-param name="whitespaces" select="8"/>
-        </xsl:call-template>
-    </xsl:template>
-
-    <!-- currently there have to be an explicit call of the style attribute nodes, maybe the attributes nodes have no priority only order relevant-->
-    <!-- STRANGE: checked with biorythm.sxc a simple xsl:apply-templates did not recognice the styles. Maybe caused by the template match order?  -->
-    <xsl:template name="apply-styles-and-content">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:apply-templates select="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name -->
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-
-        <xsl:apply-templates>
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-    </xsl:template>
-
-
-    <xsl:template match="@text:style-name | @draw:style-name | @draw:text-style-name | @table:style-name"><!-- | @presentation:style-name-->
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER'">
-                <xsl:attribute name="class"><xsl:value-of select="translate(., '. %()/\', '')"/></xsl:attribute>
-            </xsl:when>
-
-            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'CSS_INLINED'">
-                <xsl:attribute name="style"><xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/.]"/></xsl:attribute>
-            </xsl:when>
-
-            <!--+++++ PALM 3.2 SUBSET INLINED WAY  and  WML / WAP   +++++-->
-            <xsl:when test="$outputType = 'PALM' or $outputType = 'WML'">
-                <!-- getting the css styles for the style name (mapped by style-mapping.xsl) -->
-                <xsl:variable name="styleProperties" select="$collectedGlobalData/allstyles/*[name()=current()/.]"/>
-                <!-- changing the context node -->
-                <xsl:for-each select="parent::*">
-                    <xsl:call-template name="create-nested-format-tags">
-                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:for-each>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <xsl:template match="text:sequence">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:apply-templates>
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-    </xsl:template>
-
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/global_document.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/global_document.xsl
deleted file mode 100644 (file)
index fc4579e..0000000
+++ /dev/null
@@ -1,1674 +0,0 @@
- <!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                extension-element-prefixes="xt"
-                xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
-                xmlns:sxghelper="http://www.jclark.com/xt/java/com.sun.star.xslt.helper.SxgChildTransformer"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-
-
-    <!-- ********************************************** -->
-    <!-- *** Global Document -  Table of Content    *** -->
-    <!-- ********************************************** -->
-
-
-
-    <xsl:template match="text:table-of-content">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:apply-templates>
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-    </xsl:template>
-
-
-
-    <xsl:template match="text:index-body">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:apply-templates mode="content-table">
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-    </xsl:template>
-
-
-
-    <xsl:template match="text:index-title" mode="content-table">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:apply-templates>
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-    </xsl:template>
-
-    <xsl:template match="text:reference-ref">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!-- Java is needed as we have to encode the relative links (bug#102311) -->
-        <xsl:if test="not($isJavaDisabled)">
-            <xsl:element name="a">
-                <xsl:attribute name="href">
-                    <xsl:text>#</xsl:text>
-                    <xsl:call-template name="encode-string">
-                        <!-- the space has to be normalized,
-                            otherwise an illegal argument exception will be thrown for XT-->
-                         <xsl:with-param name="textToBeEncoded" select="@text:ref-name"/>
-                    </xsl:call-template>
-                </xsl:attribute>
-
-                <xsl:apply-templates>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:apply-templates>
-
-            </xsl:element>
-        </xsl:if>
-    </xsl:template>
-
-    <xsl:template match="text:reference-mark">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!-- Java is needed as we have to encode the relative links (bug#102311) -->
-        <xsl:if test="not($isJavaDisabled)">
-            <xsl:element name="a">
-                <xsl:attribute name="name">
-                    <xsl:call-template name="encode-string">
-                        <!-- the space has to be normalized,
-                            otherwise an illegal argument exception will be thrown for XT-->
-                        <xsl:with-param name="textToBeEncoded" select="@text:name"/>
-                    </xsl:call-template>
-                </xsl:attribute>
-
-                <xsl:apply-templates>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:apply-templates>
-
-            </xsl:element>
-        </xsl:if>
-    </xsl:template>
-
-
-
-    <xsl:template match="text:reference-mark-start">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!-- Java is needed as we have to encode the relative links (bug#102311) -->
-        <xsl:if test="not($isJavaDisabled)">
-            <xsl:element name="a">
-                <xsl:attribute name="name">
-                    <xsl:call-template name="encode-string">
-                        <!-- the space has to be normalized,
-                            otherwise an illegal argument exception will be thrown for XT-->
-                        <xsl:with-param name="textToBeEncoded" select="@text:name"/>
-                    </xsl:call-template>
-                </xsl:attribute>
-
-                <xsl:variable name="endOfReference">
-                    <xsl:for-each select="text:reference-mark-end[@name=current()/@text:name]">
-                        <xsl:value-of select="position()"/>
-                    </xsl:for-each>
-                </xsl:variable>
-
-                <xsl:for-each select="following-sibling::*[position() &lt; $endOfReference]">
-                    <xsl:apply-templates>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:apply-templates>
-                </xsl:for-each>
-            </xsl:element>
-       </xsl:if>
-    </xsl:template>
-
-
-
-
-     <!-- content table link  -->
-    <xsl:template match="text:a" mode="content-table">
-        <xsl:param name="collectedGlobalData"/>
-
-
-        <!-- For anchors in content-headers a bug exists (cp. bug id# 102311) and they have to be worked out separately.
-            Currently the link used in the content-table of an Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
-            is not a valid URL (cp. bug id# 102311). No file destination is specified nor exist any anchor element for these
-            links in the Office XML, nor is the chapter no. known in the linked files.
-            A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
-            can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
-            All header titles gonna be encoding to be usable in a relative URL. -->
-        <xsl:choose>
-            <xsl:when test="$disableLinkedTableOfContent or $isJavaDisabled">
-                <xsl:call-template name="create-common-link">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:call-template name="create-content-table-link">
-                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <xsl:template name="get-absolute-chapter-no">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="precedingChapterLevel1"/>
-
-        <xsl:choose>
-            <xsl:when test="$globalDocumentRefToCurrentFile">
-
-                <xsl:variable name="currentFileHeadingNo">
-                    <xsl:call-template name="get-current-file-heading-no"/>
-                </xsl:variable>
-                <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
-
-                <xsl:call-template name="get-global-heading-no">
-                    <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
-                    <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
-                </xsl:call-template>
-
-           </xsl:when>
-           <xsl:otherwise>
-                <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
-                    work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
-                <xsl:variable name="currentFileHeadingNo">
-                    <xsl:call-template name="get-current-file-heading-no"/>
-                </xsl:variable>
-                <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
-
-                <xsl:call-template name="get-global-heading-no">
-                    <xsl:with-param name="currentFileHeadingNo" select="translate($testResult/@absolute-chapter-level, '+', '.')"/>
-                    <xsl:with-param name="precedingChapterLevel1" select="$precedingChapterLevel1"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <xsl:template name="get-current-file-heading-no">
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:get-current-child-heading-no')">
-                <xsl:value-of select="sxghelper:get-current-child-heading-no()"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo')">
-                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildHeadingNo()"/>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <xsl:template name="get-next-current-file-heading-no">
-        <xsl:param name="file"/>
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:get-next-current-child-heading-no')">
-                <xsl:value-of select="sxghelper:get-next-current-child-heading-no($file)"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo')">
-                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNextCurrentChildHeadingNo($file)"/>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <xsl:template name="get-global-heading-no">
-        <xsl:param name="currentFileHeadingNo"/>
-        <xsl:param name="precedingChapterLevel1"/>
-
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:get-global-heading-no')">
-                <xsl:value-of select="sxghelper:get-global-heading-no(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo')">
-                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getGlobalHeadingNo(string($currentFileHeadingNo), number($precedingChapterLevel1))"/>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-
-    <!-- necessary as anchor for the content table -->
-    <xsl:template name="create-heading-anchor">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!--
-        Currently the link used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
-        is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
-        links in the Office XML.
-        Here we are creating an anchor with the space normalized text of this header as potential jump address of the content table -->
-
-        <xsl:choose>
-            <xsl:when test="$globalDocumentRefToCurrentFile">
-
-                <xsl:variable name="currentFileHeadingNo">
-                    <xsl:call-template name="get-next-current-file-heading-no">
-                         <xsl:with-param name="file" select="$globalDocumentRefToCurrentFile"/>
-                    </xsl:call-template>
-                </xsl:variable>
-
-
-                <xsl:variable name="testResult" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][number($currentFileHeadingNo)]"/>
-                <xsl:if test="$isDebugMode">
-                    <xsl:message>Matching child document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
-                    <xsl:message>absolute-chapter-level:         <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
-                    <xsl:message>encodedTitle:                   <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
-                    <xsl:message>globalDocumentRefToCurrentFile: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
-                    <xsl:message>*** </xsl:message>
-                </xsl:if>
-
-                <xsl:element name="a">
-                    <xsl:attribute name="name">
-                        <xsl:value-of select="$testResult/@absolute-chapter-level"/>
-                        <xsl:text>+</xsl:text>
-                        <xsl:value-of select="$testResult/@encoded-title"/>
-                    </xsl:attribute>
-                </xsl:element>
-           </xsl:when>
-
-           <xsl:otherwise>
-                <!-- When the chapter is in the global document itself the link has to be relative (e.g. #index) a absolute href does not
-                    work with the browser. In case of chapter in the global document, the output URL of the global document was taken. -->
-                <xsl:variable name="currentFileHeadingNo">
-                    <xsl:call-template name="get-next-current-file-heading-no">
-                         <xsl:with-param name="file" select="$contentTableURL"/>
-                    </xsl:call-template>
-                </xsl:variable>
-
-
-                <xsl:variable name="testResult" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][number($currentFileHeadingNo)]"/>
-
-                <xsl:if test="$isDebugMode">
-                    <xsl:message>Matching global document header No. <xsl:value-of select="$currentFileHeadingNo"/></xsl:message>
-                    <xsl:message>absolute-chapter-level:  <xsl:value-of select="$testResult/@absolute-chapter-level"/></xsl:message>
-                    <xsl:message>encodedTitle:            <xsl:value-of select="$testResult/@encoded-title"/></xsl:message>
-                    <xsl:message>contentTableURL:         <xsl:value-of select="$contentTableURL"/></xsl:message>
-                    <xsl:message>*** </xsl:message>
-                </xsl:if>
-
-                <xsl:element name="a">
-                    <xsl:attribute name="name">
-                        <xsl:value-of select="$testResult/@absolute-chapter-level"/>
-                        <xsl:text>+</xsl:text>
-                        <xsl:value-of select="$testResult/@encoded-title"/>
-                    </xsl:attribute>
-                </xsl:element>
-
-            </xsl:otherwise>
-        </xsl:choose>
-
-
-
-<!--
-
-        <xsl:variable name="title" select="normalize-space(.)"/>
-        <!~~DON'T WORK    <xsl:variable name="title" select="normalize-space(descendant::text())"/>        ~~>
-         <xsl:choose>
-            <xsl:when test="$globalDocumentRefToCurrentFile">
-                <xsl:variable name="testResults" select="$contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url][$title = @title][current()/@text:level = @level]"/>
-                <xsl:if test="1 &lt; count($testResults)">
-                    <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
-                    <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
-                </xsl:if>
-
-                 <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
-                 <xsl:choose>
-                     <xsl:when test="$encodedTitle">
-                         <xsl:element name="a">
-                            <xsl:attribute name="name">
-                                <xsl:value-of select="$encodedTitle"/>
-                            </xsl:attribute>
-                         </xsl:element>
-                     </xsl:when>
-                     <xsl:otherwise>
-                        <!~~ even when it is not ~~>
-                        <xsl:variable name="newEncodedTitle">
-                            <xsl:call-template name="encode-string">
-                                <!~~ the space has to be normalized,
-                                    otherwise an illegal argument exception will be thrown for XT~~>
-                                 <xsl:with-param name="textToBeEncoded" select="$title"/>
-                            </xsl:call-template>
-                        </xsl:variable>
-                         <xsl:element name="a">
-                            <xsl:attribute name="name">
-                                <xsl:value-of select="$newEncodedTitle"/>
-                            </xsl:attribute>
-                         </xsl:element>
-                     </xsl:otherwise>
-                 </xsl:choose>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:variable name="testResults" select="$collectedGlobalData/content-table-headings/heading[$contentTableURL = @file-url][$title = @title][current()/@text:level = @level]"/>
-                <xsl:if test="1 &lt; count($testResults)">
-                    <xsl:message> *** CAUTION: Multiple chapter headings with similar names: </xsl:message>
-                    <xsl:message> *** Title: <xsl:value-of select="$title"/> Level: <xsl:value-of select="@text:level"/></xsl:message>
-                    <xsl:message> *** </xsl:message>
-                </xsl:if>
-
-                <xsl:variable name="encodedTitle" select="$testResults/@encoded-title"/>
-                <xsl:choose>
-                     <xsl:when test="$encodedTitle">
-                         <xsl:element name="a">
-                            <xsl:attribute name="name">
-                                <xsl:value-of select="$encodedTitle"/>
-                            </xsl:attribute>
-                         </xsl:element>
-                     </xsl:when>
-                     <xsl:otherwise>
-                        <!~~ even when it is not ~~>
-                        <xsl:variable name="newEncodedTitle">
-                            <xsl:call-template name="encode-string">
-                                <!~~ the space has to be normalized,
-                                    otherwise an illegal argument exception will be thrown for XT~~>
-                                 <xsl:with-param name="textToBeEncoded" select="$title"/>
-                            </xsl:call-template>
-                        </xsl:variable>
-                         <xsl:element name="a">
-                            <xsl:attribute name="name">
-                                <xsl:value-of select="$newEncodedTitle"/>
-                            </xsl:attribute>
-                         </xsl:element>
-                     </xsl:otherwise>
-                 </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-
--->
-
-    </xsl:template>
-
-
-
-
-    <!-- ************************************** -->
-    <!--    CREATION OF A CONTENT TABLE LINK    -->
-    <!-- ************************************** -->
-
-
-    <!-- a special behavior of text:a
-        (called from the 'text:a' template) -->
-
-    <xsl:template name="create-content-table-link">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <xsl:when test="not($outputType = 'WML')">
-                <xsl:element name="a">
-                    <xsl:attribute name="href">
-                        <xsl:choose>
-                            <xsl:when test="starts-with(@xlink:href, '#')">
-                                <xsl:variable name="correctHeading" select="$collectedGlobalData/content-table-headings/heading[current()/@xlink:href = @content-table-id]"/>
-
-                                <xsl:value-of select="$correctHeading/@out-file-url"/>
-                                <xsl:text>#</xsl:text>
-                                <xsl:value-of select="$correctHeading/@absolute-chapter-level"/>
-                                <xsl:text>+</xsl:text>
-                                <xsl:value-of select="$correctHeading/@encoded-title"/>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:call-template name="create-common-link">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                    </xsl:attribute>
-
-                    <xsl:call-template name="apply-styles-and-content">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-            <xsl:otherwise>
-                <!-- 2DO: currently no WML support
-
-                <!~~ no nested p tags in wml1.1 allowed ~~>
-                <xsl:choose>
-                    <xsl:when test="ancestor::*[contains($wap-paragraph-elements, name())]">
-                        <xsl:element name="a">
-                            <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                            <xsl:apply-templates select="."/>
-                        </xsl:element>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:element name="p">
-                            <xsl:element name="a">
-                                <xsl:attribute name="href"><xsl:value-of select="@xlink:href"/></xsl:attribute>
-                                <xsl:apply-templates select="."/>
-                            </xsl:element>
-                        </xsl:element>
-                    </xsl:otherwise>
-                </xsl:choose>  -->
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-       <!--
-           CREATION OF A HELPER VARIABLE AS WORKAROUND FOR THE CONTENT TABLE ULR BUG
-
-
-        As no valid URL from the content table to the child documents exist in the content table,
-        a work-around is done:
-
-        First two helper variables are being created.
-
-        One containing the list of all references of the global document:
-        containg all their title,
-        for example:
-
-               <chapter-ref title="aTitle 1"/>
-               <chapter-ref title="aTitle 2"/>
-               <chapter-ref title="aTitle 2/>
-               <chapter-ref title="aTitle 3/>
-
-        The other containing all heading from the child documents linked from the global document.
-        The variable 'childrenHeadings' contains their title and the number of preceding similar titles,
-        for example:
-
-
-               <child file-url="aURL">
-                       <heading title="aTitle1" level="1">
-                       <heading title="aTitle2" level="2">
-                       <heading title="aTitle3" level="1">
-            </child>
-
-        For each chapter reference from the content table the
-
-         by encoding the chapter names of the child document with the java URLEncoder and
-        use this as a part of a link. Furthermore for all heading elements a encoded anchor will be created from the heading.
-        Last the workaround parses all children documents for this anhor, as there is no distinction of files from the content table entries.
-
-        The new added node set to the collectedGlobalData variable concering the content table is written as
-
-
-               <content-table-headings content-table-url="aURL_ToTheGeneratedContentTable">
-               <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
-               <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
-               <heading file-url="aFileURLToTheGeneratedHeading1" level="1">
-               <heading file-url="aFileURLToTheGeneratedHeading2" level="2">
-               </content-table-headings>
-
-
-        Preconditions:
-               The correct sequence of child documents according to the Content Table is necessary, granted by the office.
-       -->
-       <xsl:template name="Create-helper-variables-for-Content-Table">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the content table....</xsl:message></xsl:if>
-
-        <!-- Here a helper variable of the content table is created, of all chapter-references which point to a child document.
-             an 'chapter-ref' element will be created, containg their title and the number of preceding similar titles,
-             for example:
-
-               <chapter-ref title="aTitle 1"/>
-               <chapter-ref title="aTitle 2"/>
-               <chapter-ref title="aTitle 2"/>
-               <chapter-ref title="aTitle 3"/>
-            -->
-        <xsl:variable name="chapterRefs-RTF">
-            <!-- '/*/' as the flat and the zipped XML file format have different root elements -->
-            <xsl:for-each select="/*/office:body/text:table-of-content/text:index-body/text:p/text:a">
-                <xsl:variable name="currentTitle" select="normalize-space(string(.))"/>
-                <xsl:element name="chapter-ref">
-                    <xsl:attribute name="title">
-                        <xsl:value-of select="$currentTitle"/>
-                    </xsl:attribute>
-                    <xsl:attribute name="content-table-id">
-                        <xsl:value-of select="@xlink:href"/>
-                    </xsl:attribute>
-               </xsl:element>
-            </xsl:for-each>
-        </xsl:variable>
-        <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the content table!</xsl:message></xsl:if>
-
-
-
-
-        <xsl:if test="$isDebugMode"><xsl:message>Creation of global document helper variable for the child documents....</xsl:message></xsl:if>
-        <!-- Here a helper variable of created from the children documents.
-             Containg all heading elements from the child documents. Some or all of them are
-             chapters referenced by the Global Document.
-             The variable contains their title, the level of the heading and the file URL of the child,
-             for example:
-
-                       <heading title="aTitle1" level="1" file-url="aURL1">
-                       <heading title="aTitle2" level="2" file-url="aURL1">
-                       <heading title="aTitle3" level="1" file-url="aURL1">
-                       <heading title="aTitle4" level="1" file-url="aURL2">
-                       <heading title="aTitle5" level="2" file-url="aURL2">
-                       <heading title="aTitle2" level="3" file-url="aURL2">
-                       <heading title="aTitle6" level="3" file-url="aURL2">
-                <heading-count>7</heading-count>
-            -->
-        <xsl:variable name="childrenHeadings-RTF">
-            <!-- all headers from children documents will be added -->
-            <xsl:apply-templates select="/*/office:body/text:section" mode="creation-of-variable"/>
-        </xsl:variable>
-        <xsl:if test="$isDebugMode"><xsl:message>Finished the Creation of global document helper variable for the child documents!</xsl:message></xsl:if>
-
-
-        <xsl:choose>
-            <xsl:when test="function-available('xt:node-set')">
-                <xsl:call-template name="Create-global-variable-for-Content-Table">
-                    <xsl:with-param name="chapterRefs"     select="xt:node-set($chapterRefs-RTF)"/>
-                    <xsl:with-param name="childrenHeadings"     select="xt:node-set($childrenHeadings-RTF)"/>
-                    <xsl:with-param name="collectedGlobalData"  select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="function-available('xalan:nodeset')">
-                <xsl:call-template name="Create-global-variable-for-Content-Table">
-                    <xsl:with-param name="chapterRefs"     select="xalan:nodeset($chapterRefs-RTF)"/>
-                    <xsl:with-param name="childrenHeadings"     select="xalan:nodeset($childrenHeadings-RTF)"/>
-                    <xsl:with-param name="collectedGlobalData"  select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-
-    <xsl:template name="Create-global-variable-for-Content-Table">
-        <xsl:param name="chapterRefs"/>
-        <xsl:param name="childrenHeadings"/>
-        <xsl:param name="collectedGlobalData"/>
-
-
-        <xsl:if test="$isDebugMode">
-            <!-- helper variable collecting all headings from the global document file children-->
-            <xsl:for-each select="$childrenHeadings/heading">
-                <xsl:message>#              <xsl:value-of select="position()"/></xsl:message>
-                <xsl:message>level:         <xsl:value-of select="@level"/></xsl:message>
-                <xsl:message>title:         <xsl:value-of select="@title"/></xsl:message>
-                <xsl:message>encoded-title: <xsl:value-of select="@encoded-title"/></xsl:message>
-                <xsl:message>file-url:      <xsl:value-of select="@file-url"/></xsl:message>
-                <xsl:message>header-no:     <xsl:value-of select="@header-no"/></xsl:message>
-                <xsl:message>**</xsl:message>
-            </xsl:for-each>
-            <xsl:message>**</xsl:message>
-            <xsl:message>**</xsl:message>
-
-            <!-- helper variable collecting all heading references from the content table of the the global document -->
-            <xsl:message>childrenHeadings/heading-count: <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
-            <xsl:for-each select="$chapterRefs/chapter-ref">
-                <xsl:message># <xsl:value-of select="position()"/></xsl:message>
-                <xsl:message>title: <xsl:value-of select="@title"/></xsl:message>
-                <xsl:message>**</xsl:message>
-            </xsl:for-each>
-        </xsl:if>
-
-
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:set-heading-no')">
-                    <xsl:value-of select="sxghelper:set-heading-no(1)"/>
-                    <xsl:value-of select="sxghelper:set-current-child-no(1)"/>
-                    <xsl:value-of select="sxghelper:set-current-child-url(string($childrenHeadings/heading/@file-url))"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
-                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo(1)"/>
-                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo(1)"/>
-                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl(string($childrenHeadings/heading/@file-ur))"/>
-            </xsl:when>
-        </xsl:choose>
-
-        <xsl:if test="$isDebugMode"><xsl:message>Creating global document variable for chapter relations....</xsl:message></xsl:if>
-        <xsl:variable name="contentTableHeadingsGlobalData-RTF">
-            <xsl:element name="content-table-headings">
-                <!-- all headings are linked from the current global document input file -->
-                <xsl:attribute name="content-table-url">
-                    <xsl:value-of select="$contentTableURL"/>
-                </xsl:attribute>
-
-                <!-- had to use a for loop, as a recursion ends with an stackoverflow exception after about 600 recursive calls -->
-                <xsl:choose>
-                    <xsl:when test="function-available('sxghelper:get-heading-no')">
-                         <xsl:for-each select="$chapterRefs/chapter-ref">
-                            <xsl:call-template name="searchHeadingInChildDocument">
-                                <xsl:with-param name="chapterRefs"         select="$chapterRefs"/>
-                                <xsl:with-param name="childrenHeadings"    select="$childrenHeadings"/>
-                                <xsl:with-param name="currentChapterRefNo" select="position()"/>
-                                <xsl:with-param name="currentHeadingNo"    select="sxghelper:get-heading-no()"/>
-                                <xsl:with-param name="currentChildURL"     select="sxghelper:get-current-child-url()"/>
-                                <xsl:with-param name="currentChildNo"      select="sxghelper:get-current-child-no()"/>
-                            </xsl:call-template>
-                        </xsl:for-each>
-                     </xsl:when>
-                    <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo')">
-                         <xsl:for-each select="$chapterRefs/chapter-ref">
-                            <xsl:call-template name="searchHeadingInChildDocument">
-                                <xsl:with-param name="chapterRefs"         select="$chapterRefs"/>
-                                <xsl:with-param name="childrenHeadings"    select="$childrenHeadings"/>
-                                <xsl:with-param name="currentChapterRefNo" select="position()"/>
-                                <xsl:with-param name="currentHeadingNo"    select="java:com.sun.star.xslt.helper.SxgChildTransformer.getHeadingNo()"/>
-                                <xsl:with-param name="currentChildURL"     select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildUrl()"/>
-                                <xsl:with-param name="currentChildNo"      select="java:com.sun.star.xslt.helper.SxgChildTransformer.getCurrentChildNo()"/>
-                            </xsl:call-template>
-                        </xsl:for-each>
-                    </xsl:when>
-                </xsl:choose>
-            </xsl:element>
-
-            <!-- adding the already exisiting global data environment -->
-            <xsl:copy-of select="$collectedGlobalData"/>
-        </xsl:variable>
-        <xsl:if test="$isDebugMode"><xsl:message>Finished global document variable for chapter relations!</xsl:message></xsl:if>
-
-        <xsl:choose>
-            <xsl:when test="function-available('xt:node-set')">
-                <xsl:call-template name="start-self-and-children-transformation">
-                    <xsl:with-param name="collectedGlobalData"       select="xt:node-set($contentTableHeadingsGlobalData-RTF)"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="function-available('xalan:nodeset')">
-                <xsl:call-template name="start-self-and-children-transformation">
-                    <xsl:with-param name="collectedGlobalData"       select="xalan:nodeset($contentTableHeadingsGlobalData-RTF)"/>
-                </xsl:call-template>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <xsl:template name="searchHeadingInChildDocument">
-        <xsl:param name="chapterRefs"/>
-        <xsl:param name="childrenHeadings"/>
-        <xsl:param name="currentChapterRefNo"/>
-        <xsl:param name="currentHeadingNo"/>
-        <xsl:param name="currentChildURL"/>
-        <xsl:param name="currentChildNo"/>
-
-
-        <xsl:variable name="currentChapterRef"      select="$chapterRefs/chapter-ref[$currentChapterRefNo]"/>
-        <xsl:variable name="currentChapterID"       select="$currentChapterRef/@content-table-id"/>
-        <xsl:variable name="currentChapterTitle"    select="$currentChapterRef/@title"/>
-
-        <xsl:variable name="currentChildHeading"    select="$childrenHeadings/heading[$currentHeadingNo]"/>
-        <xsl:variable name="headingTitle"           select="$currentChildHeading/@title"/>
-        <xsl:variable name="headingLevel"           select="$currentChildHeading/@level"/>
-        <xsl:variable name="headingNo"              select="$currentChildHeading/@header-no"/>
-        <xsl:variable name="newChildURL"            select="$currentChildHeading/@file-url"/>
-
-        <xsl:if test="$isDebugMode">
-            <xsl:message>*** new heading </xsl:message>
-            <xsl:message>currentChapterID:    <xsl:value-of select="$currentChapterID"/></xsl:message>
-            <xsl:message>currentChapterTitle: <xsl:value-of select="$currentChapterTitle"/></xsl:message>
-            <xsl:message>currentChapterID:    <xsl:value-of select="$currentChapterID"/></xsl:message>
-            <xsl:message>currentHeadingNo:    <xsl:value-of select="$currentHeadingNo"/></xsl:message>
-            <xsl:message>headingTitle:        <xsl:value-of select="$headingTitle"/></xsl:message>
-            <xsl:message>headingLevel:        <xsl:value-of select="$headingLevel"/></xsl:message>
-            <xsl:message>headingNo:           <xsl:value-of select="$headingNo"/></xsl:message>
-            <xsl:message>newChildURL:         <xsl:value-of select="$newChildURL"/></xsl:message>
-        </xsl:if>
-
-        <xsl:variable name="outFileURL">
-            <xsl:choose>
-                 <xsl:when test="substring-before($newChildURL,'.xml')">
-                    <xsl:value-of select="concat(substring-before($newChildURL,'.xml'),'.htm')"/>
-                 </xsl:when>
-                 <xsl:when test="substring-before($newChildURL,'.sx')">
-                    <xsl:value-of select="concat(substring-before($newChildURL,'.sx'),'.htm')"/>
-                 </xsl:when>
-            </xsl:choose>
-        </xsl:variable>
-        <xsl:variable name="isChapterHeading" select="$headingTitle = $currentChapterTitle"/>
-        <xsl:variable name="isNewFile" select="string($newChildURL) != string($currentChildURL)"/>
-
-
-
-
-        <xsl:if test="$isNewFile">
-            <!-- reset of the already collected child headers -->
-            <xsl:call-template name="calc-chapter-numbers">
-                 <xsl:with-param name="level" select="0"/>
-            </xsl:call-template>
-        </xsl:if>
-        <xsl:variable name="absoluteChapterLevel">
-            <xsl:call-template name="calc-chapter-numbers">
-                 <xsl:with-param name="level" select="number($headingLevel)"/>
-            </xsl:call-template>
-        </xsl:variable>
-
-
-        <xsl:element name="heading">
-            <!-- necessary to as ID from the content table to get the correct heading element (the buggy URL used as ID)-->
-            <xsl:attribute name="content-table-id">
-                <xsl:choose>
-                    <xsl:when test="$isChapterHeading">
-                        <xsl:value-of select="$currentChapterID"/>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:text>only a heading, but not a chapter</xsl:text>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:attribute>
-            <!-- no of the used child, necessary for quick finding of chapters of next file  -->
-            <xsl:attribute name="child-document-no">
-                <xsl:choose>
-                    <xsl:when test="$isNewFile">
-                        <xsl:value-of select="$currentChildNo + 1"/>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:value-of select="$currentChildNo"/>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:attribute>
-            <!-- the URL of the child document source, containing the heading -->
-            <xsl:attribute name="file-url">
-                <xsl:value-of select="$newChildURL"/>
-            </xsl:attribute>
-            <xsl:attribute name="out-file-url">
-                <xsl:value-of select="$outFileURL"/>
-            </xsl:attribute>
-            <xsl:attribute name="level">
-                <xsl:value-of select="$headingLevel"/>
-            </xsl:attribute>
-            <xsl:attribute name="title">
-                <xsl:value-of select="$headingTitle"/>
-            </xsl:attribute>
-            <xsl:attribute name="encoded-title">
-                <xsl:value-of select="$currentChildHeading/@encoded-title"/>
-            </xsl:attribute>
-            <xsl:attribute name="absolute-chapter-level">
-                <xsl:value-of select="$absoluteChapterLevel"/>
-            </xsl:attribute>
-        </xsl:element>
-
-
-        <xsl:choose>
-            <xsl:when test="$childrenHeadings/heading-count != $currentHeadingNo">
-                <!-- procede as long the list of children isn'nt worked through -->
-                <xsl:choose>
-                    <xsl:when test="$isChapterHeading">
-                        <!-- global variables have to be set, so the for-each loop can access them -->
-                        <xsl:choose>
-                            <xsl:when test="function-available('sxghelper:set-heading-no')">
-                                <xsl:value-of select="sxghelper:set-heading-no($currentHeadingNo + 1)"/>
-                                <xsl:if test="$isNewFile">
-                                    <xsl:value-of select="sxghelper:set-current-child-no($currentChildNo + 1)"/>
-                                    <xsl:value-of select="sxghelper:set-current-child-url(string($newChildURL))"/>
-                                </xsl:if>
-                             </xsl:when>
-                            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo')">
-                                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setHeadingNo($currentHeadingNo + 1)"/>
-                                <xsl:if test="$isNewFile">
-                                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildNo($currentChildNo + 1)"/>
-                                    <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.setCurrentChildUrl($newChildURL)"/>
-                                </xsl:if>
-                            </xsl:when>
-                        </xsl:choose>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <!-- not a chapter heading, call itself until a chapter ref is found or the end of headings is reached -->
-                        <xsl:call-template name="searchHeadingInChildDocument">
-                            <xsl:with-param name="chapterRefs"         select="$chapterRefs"/>
-                            <xsl:with-param name="childrenHeadings"    select="$childrenHeadings"/>
-                            <xsl:with-param name="currentChapterRefNo" select="$currentChapterRefNo"/>
-                            <xsl:with-param name="currentHeadingNo"    select="$currentHeadingNo + 1"/>
-                            <xsl:with-param name="currentChildURL"     select="$currentChildURL"/>
-                            <xsl:with-param name="currentChildNo"      select="$currentChildNo"/>
-                        </xsl:call-template>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:if test="$isDebugMode">
-                    <xsl:message>All child documents have been walked through without finding the chapter name!</xsl:message>
-                    <xsl:message>       childrenHeadings/heading-count:    <xsl:value-of select="$childrenHeadings/heading-count"/></xsl:message>
-                    <xsl:message>       currentHeadingNo:                  <xsl:value-of select="$currentHeadingNo"/></xsl:message>
-                </xsl:if>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-
-
-       <!-- Chapters from the Content Table have currently no anchor to child documents in OOo XML.
-                As solution, whenever a a global document  every header of the HTML output gets get's an anchor in the Therefore-->
-    <xsl:template name="encode-string">
-        <xsl:param name="encoding" select="'UTF-8'"/>
-        <xsl:param name="textToBeEncoded"/>
-
-        <xsl:choose>
-            <xsl:when test="function-available('urlencoder:encode')">
-                <xsl:value-of select="urlencoder:encode(normalize-space($textToBeEncoded),$encoding)"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:java.net.URLEncoder.encode')">
-                <xsl:value-of select="java:java.net.URLEncoder.encode(string(normalize-space($textToBeEncoded)),string($encoding))"/>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-
-
-    <!-- ******************************************************************************************************** -->
-    <!-- ***  TRANSFORMATION OF ALL CHILD DOCUMENTS OF THE GLOBAL DOCUMENTS BY USING A EXTERNAL HELPER CLASS  *** -->
-    <!-- ******************************************************************************************************** -->
-
-
-       <!-- a new element 'contentTableHeadings' will be added to the helper variable the first time a child will be transformed -->
-    <xsl:template name="transform-global-document-and-children">
-        <xsl:param name="collectedGlobalData"/>
-
-
-        <xsl:choose>
-            <xsl:when test="$collectedGlobalData/content-table-headings">
-                <xsl:call-template name="start-child-transformation">
-                    <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:otherwise>
-                   <!-- The necessary auxiliary variable hasn't build yet.
-                   This variable gonna store all headers (with chapter numbers) and the URL of their files -->
-
-                <xsl:call-template name="Create-helper-variables-for-Content-Table">
-                    <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
-                </xsl:call-template>
-
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-       <xsl:template name="start-self-and-children-transformation">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:if test="$isDebugMode">
-            <xsl:call-template name="debug-content-table-headings-variable">
-                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-            </xsl:call-template>
-
-            <xsl:message>Parsing the global document...</xsl:message>
-        </xsl:if>
-
-        <xsl:apply-templates>
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:apply-templates>
-
-
-        <xsl:if test="$isDebugMode"><xsl:message>Parsing the child documents...</xsl:message></xsl:if>
-        <xsl:call-template name="start-child-transformation">
-            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-        </xsl:call-template>
-
-       </xsl:template>
-
-
-
-
-    <xsl:template name="start-child-transformation">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:if test="$isDebugMode"><xsl:message>Starting the child transformations...</xsl:message></xsl:if>
-
-        <!-- As the childs of a global document (with suffix .sxg) do not know anything about their global parent,
-            the transformation of global documents children have to be done implizit.
-            Otherwise the chapter number of the children will always start with zero, as they do not know anything about the
-            proceding chapters.
-            Furthermore, they don't have any links about preceeding and following documents and no linking for usability reasons
-            could be done. Therefore the children have to be transformed during the transformation of a global (sxg) document -->
-               <xsl:if test="$isDebugMode">
-            <xsl:choose>
-                <xsl:when test="$collectedGlobalData/content-table-headings">
-                    <xsl:message>Contentable data exists as global data!</xsl:message>
-                </xsl:when>
-                <xsl:otherwise>
-                    <xsl:message>No Contentable global data exists!</xsl:message>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:if>
-
-        <!-- currently this function only works with node-sets from XT -->
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:transform-children')">
-                <xsl:message>
-                    <xsl:value-of select="sxghelper:transform-children( $collectedGlobalData/content-table-headings,
-                                                                        string($jaredRootURL),
-                                                                        string($absoluteSourceDirRef),
-                                                                        string($optionalURLSuffix),
-                                                                        string($dpi),
-                                                                        string($outputType),
-                                                                        $isDebugMode)"/>
-                </xsl:message>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:message>Java method transformChildren to transform all children of a global document could not be found. Be sure to use the XT processor.</xsl:message>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-
-
-    <!-- ******************************************************************************* -->
-    <!-- ***  Creation of helper variable of the headings of all children documents  *** -->
-    <!-- ******************************************************************************* -->
-
-
-    <xsl:template match="/*/office:body/text:section" mode="creation-of-variable">
-        <xsl:call-template name="getChildRootNode"/>
-
-        <!-- after the last child document the global document will be parsed -->
-        <xsl:if test="position() = last()">
-            <!-- search the global document after all child documents have been searched
-
-ODK PATCH NO INDEX ELEMENT WANTED !! - null pointer exception
-            <xsl:call-template name="getPreviousHeaderNo">
-                <xsl:with-param name="fileURL"                  select="$contentTableURL"/>
-                <xsl:with-param name="amountOfCurrentHeading"   select="count(following-sibling::text:h)"/>
-                <xsl:with-param name="nodeToSearchForHeading"   select="following-sibling::text:h"/>
-            </xsl:call-template>
--->
-           <!-- get the overall No of Headers -->
-           <xsl:call-template name="getAllHeaderNo"/>
-        </xsl:if>
-    </xsl:template>
-
-
-    <xsl:template name="getChildRootNode">
-        <xsl:variable name="fileURL"    select="text:section-source/@xlink:href"/>
-
-        <xsl:choose>
-               <!-- if absolute URL or absolute DOS PATH or absolute Unix path -->
-                       <xsl:when test="contains($fileURL,'//') or (substring($fileURL,2,1) = ':') or starts-with($fileURL, '/')">
-                       <xsl:variable name="childRootNode" select="document($fileURL)"/>
-                <xsl:call-template name="getPreviousHeaderNo">
-                    <xsl:with-param name="fileURL"                select="$fileURL"/>
-                       <!-- NO absolute source path will be added as prefix -->
-                    <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
-                    <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:otherwise>
-                       <xsl:variable name="childRootNode" select="document(concat($absoluteSourceDirRef,'/',$fileURL))"/>
-                <xsl:call-template name="getPreviousHeaderNo">
-                    <xsl:with-param name="fileURL"                select="$fileURL"/>
-                       <!-- the absolute source path will be added as prefix -->
-                    <xsl:with-param name="amountOfCurrentHeading" select="count($childRootNode/*/office:body/descendant::text:h)"/>
-                    <xsl:with-param name="nodeToSearchForHeading" select="$childRootNode/*/office:body/descendant::text:h"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <xsl:template name="getPreviousHeaderNo">
-        <xsl:param name="fileURL"/>
-        <xsl:param name="nodeToSearchForHeading"/>
-        <xsl:param name="amountOfCurrentHeading"/>
-
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:get-previous-child-documents-heading-count')">
-                <xsl:call-template name="addHeadingInfo">
-                    <xsl:with-param name="nodeToSearchForHeading"   select="$nodeToSearchForHeading"/>
-                    <xsl:with-param name="fileURL"                  select="$fileURL"/>
-                    <xsl:with-param name="previousHeader"           select="sxghelper:get-previous-child-documents-heading-count($amountOfCurrentHeading)"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount')">
-                <xsl:call-template name="addHeadingInfo">
-                    <xsl:with-param name="nodeToSearchForHeading"   select="$nodeToSearchForHeading"/>
-                    <xsl:with-param name="fileURL"                  select="$fileURL"/>
-                    <xsl:with-param name="previousHeader"           select="java:com.sun.star.xslt.helper.SxgChildTransformer.getPreviousChildDocumentsHeadingCount($amountOfCurrentHeading)"/>
-                </xsl:call-template>
-            </xsl:when>
-        </xsl:choose>
-
-    </xsl:template>
-
-
-    <xsl:template name="addHeadingInfo">
-        <xsl:param name="fileURL"/>
-        <xsl:param name="previousHeader"/>
-        <xsl:param name="nodeToSearchForHeading"/>
-
-        <xsl:variable name="previousHeader2" select="number($previousHeader)"/>
-        <xsl:for-each select="$nodeToSearchForHeading">
-
-            <xsl:variable name="title" select="normalize-space(.)"/>
-
-            <xsl:variable name="encodedTitle">
-                <xsl:call-template name="encode-string">
-                    <!-- the space has to be normalized,
-                        otherwise an illegal argument exception will be thrown for XT-->
-                     <xsl:with-param name="textToBeEncoded" select="$title"/>
-                </xsl:call-template>
-            </xsl:variable>
-
-            <xsl:element name="heading">
-                <!-- odd but 'descendant:text()' didn't work, but '.', to get all text nodes of the header -->
-                <xsl:attribute name="title"><xsl:value-of select="$title"/></xsl:attribute>
-                <xsl:attribute name="encoded-title"><xsl:value-of select="$encodedTitle"/></xsl:attribute>
-                <xsl:attribute name="level"><xsl:value-of select="@text:level"/></xsl:attribute>
-                <xsl:attribute name="file-url"><xsl:value-of select="$fileURL"/></xsl:attribute>
-                <xsl:attribute name="header-no"><xsl:value-of select="position() + $previousHeader2"/></xsl:attribute>
-            </xsl:element>
-        </xsl:for-each>
-
-    </xsl:template>
-
-
-    <xsl:template name="getAllHeaderNo">
-
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:get-all-child-documents-heading-count')">
-                <xsl:call-template name="addAllHeaderNoElement">
-                    <xsl:with-param name="allHeader"   select="sxghelper:get-all-child-documents-heading-count()"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount')">
-                <xsl:call-template name="addAllHeaderNoElement">
-                    <xsl:with-param name="allHeader"   select="java:com.sun.star.xslt.helper.SxgChildTransformer.getAllChildDocumentsHeadingCount()"/>
-                </xsl:call-template>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-    <xsl:template name="addAllHeaderNoElement">
-        <xsl:param name="allHeader"/>
-
-        <xsl:element name="heading-count">
-            <xsl:value-of select="$allHeader"/>
-        </xsl:element>
-
-    </xsl:template>
-
-
-    <!-- ******************************************************************************************************* -->
-    <!-- ***  Creation of a line of links at the beginning and end of a child document to enhance usability  *** -->
-    <!-- ******************************************************************************************************* -->
-
-    <xsl:template name="add-child-document-usability-links">
-        <xsl:element name="center">
-            <xsl:element name="small">
-                <xsl:text>[ </xsl:text>
-
-
-                <xsl:variable name="globalDocumentDir" select="sxghelper:get-global-document-dir()"/>
-                <xsl:variable name="currentChildNo" select="number($contentTableHeadings/heading[$globalDocumentRefToCurrentFile = @file-url]/@child-document-no)"/>
-                <xsl:variable name="earlierDocURL" select="$contentTableHeadings/heading[($currentChildNo - 1) = @child-document-no]/@out-file-url"/>
-<!--
-<xsl:message>from: <xsl:value-of select="$globalDocumentRefToCurrentFile"/></xsl:message>
-<xsl:message>to: <xsl:value-of select="$earlierDocURL"/></xsl:message>
-<xsl:message>Is: <xsl:call-template name="get-relative-file-ref">
-                    <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
-                    <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
-                 </xsl:call-template>
-</xsl:message>-->
-
-
-                <xsl:if test="$earlierDocURL">
-                    <xsl:element name="a">
-                        <xsl:attribute name="href">
-                            <!-- when the links starts with a '#' it's a link to the Content Table-->
-                            <xsl:choose>
-                                <xsl:when test="starts-with($earlierDocURL, '#')">
-
-                                    <xsl:call-template name="get-relative-file-ref">
-                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
-                                        <xsl:with-param name="targetFileRef" select="."/>
-                                    </xsl:call-template>
-<!--        <xsl:value-of select="concat($contentTableURL, $earlierDocURL)"/>-->
-                                </xsl:when>
-                                <xsl:otherwise>
-
-                                    <xsl:call-template name="get-relative-file-ref">
-                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
-                                        <xsl:with-param name="targetFileRef" select="$earlierDocURL"/>
-                                    </xsl:call-template>
-<!--
-
-                                    <xsl:value-of select="concat($globalDocumentDir, $earlierDocURL)"/>-->
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:attribute>
-                        <xsl:text>Previous document</xsl:text>
-                    </xsl:element>
-
-                    <xsl:text> | </xsl:text>
-                </xsl:if>
-
-                <xsl:element name="a">
-                    <xsl:attribute name="href">
-                        <!-- when globalDocumentRefToCurrentFile is unset the current file is the Content Table-->
-                        <xsl:choose>
-                            <xsl:when test="$globalDocumentRefToCurrentFile">
-                                <xsl:variable name="contentTableDir">
-                                    <xsl:call-template name="get-name-of-table-of-content-document"/>
-                                </xsl:variable>
-
-                                <xsl:call-template name="get-relative-file-ref">
-                                    <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
-                                    <xsl:with-param name="targetFileRef" select="$contentTableDir"/>
-                                </xsl:call-template>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:text>#</xsl:text>
-                            </xsl:otherwise>
-                        </xsl:choose>
-
-<!--                    <xsl:value-of select="$contentTableURL"/>-->
-                    </xsl:attribute>
-                    <xsl:text>Content Table</xsl:text>
-                </xsl:element>
-
-
-                <xsl:variable name="nextDocURL" select="$contentTableHeadings/heading[($currentChildNo + 1) = @child-document-no]/@out-file-url"/>
-                <xsl:if test="$nextDocURL">
-                    <xsl:text> | </xsl:text>
-                    <xsl:element name="a">
-                        <xsl:attribute name="href">
-                            <!-- when the links starts with a '#' it's a link to the Content Table-->
-                            <xsl:choose>
-                                <xsl:when test="starts-with($nextDocURL, '#')">
-                                    <xsl:call-template name="get-relative-file-ref">
-                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
-                                        <xsl:with-param name="targetFileRef" select="."/>
-                                    </xsl:call-template>
-<!--                                <xsl:value-of select="concat($contentTableURL, $nextDocURL)"/>-->
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:call-template name="get-relative-file-ref">
-                                        <xsl:with-param name="sourceFileRef" select="$globalDocumentRefToCurrentFile"/>
-                                        <xsl:with-param name="targetFileRef" select="$nextDocURL"/>
-                                    </xsl:call-template>
-<!--                                 <xsl:value-of select="concat($globalDocumentDir, $nextDocURL)"/>-->
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:attribute>
-                        <xsl:text>Next document</xsl:text>
-                    </xsl:element>
-                </xsl:if>
-                <xsl:text> ]</xsl:text>
-            </xsl:element>
-        </xsl:element>
-    </xsl:template>
-
-
-    <xsl:template name="get-relative-file-ref">
-        <xsl:param name="sourceFileRef"/>
-        <xsl:param name="targetFileRef"/>
-
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:get-relative-file-ref')">
-                <xsl:value-of select="sxghelper:get-relative-file-ref(string($sourceFileRef), string($targetFileRef))"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef')">
-                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getRelativeFileRef(string($sourceFileRef), string($targetFileRef))"/>
-            </xsl:when>
-        </xsl:choose>
-
-    </xsl:template>
-
-
-    <xsl:template name="get-name-of-table-of-content-document">
-
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:get-name-of-table-of-content-document')">
-                <xsl:value-of select="sxghelper:get-name-of-table-of-content-document()"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument')">
-                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.getNameOfTableOfContentDocument()"/>
-            </xsl:when>
-        </xsl:choose>
-
-    </xsl:template>
-
-
-       <xsl:template name="debug-content-table-headings-variable">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:message><xsl:text>**** THE HEADING VARIABLE **** </xsl:text></xsl:message>
-        <xsl:message>content-table-url: <xsl:value-of select="collectedGlobalData/content-table-headings/content-table-url"/></xsl:message>
-
-        <xsl:for-each select="$collectedGlobalData/content-table-headings/heading">
-            <xsl:message><xsl:text>**** new heading:        </xsl:text></xsl:message>
-            <xsl:message>content-table-id:      <xsl:value-of select="@content-table-id"/></xsl:message>
-            <xsl:message>child-document-no:     <xsl:value-of select="@child-document-no"/></xsl:message>
-            <xsl:message>file-url:              <xsl:value-of select="@file-url"/></xsl:message>
-            <xsl:message>out-file-url:          <xsl:value-of select="@out-file-url"/></xsl:message>
-            <xsl:message>level:                 <xsl:value-of select="@level"/></xsl:message>
-            <xsl:message>title:                 <xsl:value-of select="@title"/></xsl:message>
-            <xsl:message>encoded-title:         <xsl:value-of select="@encoded-title"/></xsl:message>
-            <xsl:message>absolute-chapter-level:<xsl:value-of select="@absolute-chapter-level"/></xsl:message>
-        </xsl:for-each>
-
-       </xsl:template>
-
-
-       <!-- To make the headings unique, the absolute heading is added to them
-            E.g. The level 1.2.3.4. would result into a 1+2+3+4 string -->
-    <xsl:template name="calc-chapter-numbers">
-        <xsl:param name="level"/>
-
-        <xsl:choose>
-            <xsl:when test="function-available('sxghelper:calc-chapter-numbers')">
-                <xsl:value-of select="sxghelper:calc-chapter-numbers($level)"/>
-            </xsl:when>
-            <xsl:when test="function-available('java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers')">
-                <xsl:value-of select="java:com.sun.star.xslt.helper.SxgChildTransformer.calcChapterNumbers($level)"/>
-            </xsl:when>
-        </xsl:choose>
-
-    </xsl:template>
-
-
-
-
-    <xsl:template match="text:p" mode="content-table">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:variable name="allTabStopStyles" select="$office:automatic-styles/style:style[@style:name = current()/@text:style-name]/style:properties/style:tab-stops"/>
-
-        <xsl:element name="table">
-            <xsl:attribute name="border">0</xsl:attribute>
-            <xsl:attribute name="class"><xsl:value-of select="@text:style-name"/></xsl:attribute>
-<!--
-<xsl:message>*********</xsl:message>
-<xsl:message>Stylename:<xsl:value-of select="@text:style-name"/></xsl:message>
-<xsl:message>position: <xsl:value-of select="count($allTabStopStyles/style:tab-stop)"/></xsl:message>
--->
-
-            <xsl:element name="colgroup">
-                <xsl:call-template name="create-col-element">
-                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                </xsl:call-template>
-            </xsl:element>
-
-
-            <!-- all elements before the first tabStop -->
-            <xsl:variable name="testNo-RTF">
-                <xsl:apply-templates select="node()" mode="cell-content"/>
-            </xsl:variable>
-
-
-        <xsl:choose>
-            <xsl:when test="function-available('xt:node-set')">
-                <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
-                       <xsl:element name="tr">
-                        <xsl:call-template name="create-td-elements">
-                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
-                    <xsl:with-param name="position"         select="1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:element>
-
-            </xsl:when>
-            <xsl:when test="function-available('xalan:nodeset')">
-                <xsl:variable name="tabNodePositions" select="xalan:nodeset($testNo-RTF)"/>
-                       <xsl:element name="tr">
-                        <xsl:call-template name="create-td-elements">
-                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
-                    <xsl:with-param name="position"         select="1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:element>
-
-            </xsl:when>
-        </xsl:choose>
-
-           <!-- <xsl:variable name="tabNodePositions" select="xt:node-set($testNo-RTF)"/>
-
-            <xsl:element name="tr">
-                <xsl:call-template name="create-td-elements">
-                    <xsl:with-param name="lastNodePosition" select="count($allTabStopStyles/style:tab-stop)"/>
-                    <xsl:with-param name="position"         select="1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:element>-->
-
-
-        </xsl:element>
-    </xsl:template>
-
-
-    <xsl:template name="create-col-element">
-        <xsl:param name="lastNodePosition"/>
-        <xsl:param name="allTabStopStyles"/>
-
-        <xsl:for-each select="$allTabStopStyles/style:tab-stop">
-            <xsl:element name="col">
-                <xsl:attribute name="style">
-                    <xsl:text>width: </xsl:text>
-                    <xsl:call-template name="grap-cell-width">
-                        <xsl:with-param name="position"         select="position()"/>
-                        <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                    </xsl:call-template>
-                </xsl:attribute>
-            </xsl:element>
-        </xsl:for-each>
-
-    </xsl:template>
-<!--
-Scenarios tabstops
-
-1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
- -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.
-
-2) style:type is 'right' and earlier tabStop is right
- -> following text-nodes, will be put into a right aligned TD
-
-3) style:type is 'non-right' and earlier tabStop 'non-right' as well
- -> put the preceding tab stops into a TD (left aligned is default)
-
-4) first style:type would have no right precedign tabStop
- -> works well with first sceanrios 1 and 3
-
-5) last style:type would be a special case, if it would be left aligned, but this won't happen in our case.. :D
-
-Scenarios unmatched:
-- text:styleposition 'center' will not be matched in our case (effort for nothing), there will be only 'right' and not 'right'
-- If the last tabStop is not from text:stylepostion 'right', the length of the last cell is undefined and a document length must be found.
-  Not happens in our global document case. Also the algorithm below would have to be expanded (cp. scenario 5).
-
--->
-    <xsl:template name="create-td-elements">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="lastNodePosition"/>
-        <xsl:param name="position"/>
-        <xsl:param name="allTabStopStyles"/>
-        <xsl:param name="tabNodePositions"/>
-<!--
-<xsl:message>++++++++</xsl:message>
-<xsl:message>Position: <xsl:value-of select="$position"/></xsl:message>
-<xsl:message>lastNodePosition: <xsl:value-of select="$lastNodePosition"/></xsl:message>
--->
-
-        <xsl:variable name="currentStyleType" select="$allTabStopStyles/style:tab-stop[$position]/@style:type"/>
-        <xsl:variable name="earlierStyleType" select="$allTabStopStyles/style:tab-stop[$position - 1]/@style:type"/>
-        <xsl:choose>
-            <xsl:when test="$currentStyleType = 'right'">
-                <xsl:choose>
-                    <xsl:when test="$earlierStyleType = 'right'">
-                        <!--
-                        2) style:type is 'right' and earlier tabStop is right
-                            -> following text-nodes, will be put into a right aligned TD -->
-                        <xsl:element name="td">
-                            <xsl:attribute name="style">
-                                <xsl:text>align: right</xsl:text>
-                            </xsl:attribute>
-                            <xsl:call-template name="grap-cell-content-before-tab-stop">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                <xsl:with-param name="endingTabStopPosition"  select="$position + 1"/>
-                                <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
-                                <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                            </xsl:call-template>
-                        </xsl:element>
-                    </xsl:when>
-                    <xsl:otherwise>
-                    <!--
-                        1) style:type of style:tab-stop is 'right' and earlier tabStop is not right
-                         -> Earlier text-nodes and following text-nodes, will be put into an inner table, with two TD first aligned left, with proceding textnodes, the latter aligned right.-->
-<!-- valid HTML but browsers make a line break (border=0 and paragraphstyle also missing):
-                        <xsl:element name="table">
-                            <xsl:element name="td">
-                                <xsl:call-template name="grap-cell-content-before-tab-stop">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    <xsl:with-param name="endingTabStopPosition"  select="$position"/>
-                                    <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
-                                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                                </xsl:call-template>
-                            </xsl:element>
-                            <xsl:element name="td">
-                                <xsl:attribute name="style">
-                                    <xsl:text>align: right</xsl:text>
-                                </xsl:attribute>
-                                <xsl:call-template name="grap-cell-content-before-tab-stop">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    <xsl:with-param name="endingTabStopPosition"  select="$position + 1"/>
-                                    <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
-                                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                                </xsl:call-template>
-                            </xsl:element>
-                        </xsl:element>
--->
-                            <xsl:element name="td">
-                                <xsl:call-template name="grap-cell-content-before-tab-stop">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    <xsl:with-param name="endingTabStopPosition"  select="$position"/>
-                                    <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
-                                    <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                                </xsl:call-template>
-<!-- ODK FEATURE NO PAGES
-                                <xsl:element name="td">
-                                    <xsl:attribute name="style">
-                                        <xsl:text>align: right</xsl:text>
-                                    </xsl:attribute>
-                                    <xsl:call-template name="grap-cell-content-before-tab-stop">
-                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                        <xsl:with-param name="endingTabStopPosition"  select="$position + 1"/>
-                                        <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
-                                        <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                                    </xsl:call-template>
-                                </xsl:element>          -->
-                            </xsl:element>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:choose>
-                    <xsl:when test="$earlierStyleType = 'right'">
-                    </xsl:when>
-                    <xsl:otherwise>
-                    <!--
-                       3) style:type is 'non-right' and earlier tabStop 'non-right' as well
-                            -> put the preceding tab stops into a TD (left aligned is default) -->
-                        <xsl:element name="td">
-                            <xsl:call-template name="grap-cell-content-before-tab-stop">
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                <xsl:with-param name="endingTabStopPosition"  select="$position"/>
-                                <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
-                                <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-                            </xsl:call-template>
-                        </xsl:element>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-
-        <xsl:if test="$position != $lastNodePosition">
-            <xsl:call-template name="create-td-elements">
-                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                <xsl:with-param name="lastNodePosition" select="$lastNodePosition"/>
-                <xsl:with-param name="position"         select="$position + 1"/>
-                <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                <xsl:with-param name="tabNodePositions" select="$tabNodePositions"/>
-            </xsl:call-template>
-        </xsl:if>
-    </xsl:template>
-
-
-    <xsl:template name="grap-cell-content-before-tab-stop">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="endingTabStopPosition"/>
-        <xsl:param name="tabNodePositions"/>
-        <xsl:param name="lastNodePosition"/>
-
-        <xsl:choose>
-            <xsl:when test="$endingTabStopPosition = 1">
-                <xsl:apply-templates mode="content-table" select="node()[position() &lt; $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]]">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:apply-templates>
-            </xsl:when>
-            <xsl:when test="$endingTabStopPosition > $lastNodePosition">
-                <xsl:apply-templates mode="content-table" select="node()[position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:apply-templates>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:apply-templates mode="content-table" select="node()[position() &lt; $tabNodePositions/tab-stop-node-position[$endingTabStopPosition]][position() > $tabNodePositions/tab-stop-node-position[$endingTabStopPosition - 1]]">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:apply-templates>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-    <xsl:template mode="content-table" match="text:s">
-        <xsl:call-template name="write-breakable-whitespace">
-            <xsl:with-param name="whitespaces" select="@text:c"/>
-        </xsl:call-template>
-    </xsl:template>
-
-
-    <xsl:template match="*" mode="cell-content">
-
-        <xsl:if test="name() = 'text:tab-stop' or *[name() = 'text:tab-stop']">
-            <xsl:element name="tab-stop-node-position">
-                <xsl:value-of select="position()"/>
-            </xsl:element>
-        </xsl:if>
-    </xsl:template>
-
-
-    <xsl:template name="grap-cell-width">
-        <xsl:param name="position"/>
-        <xsl:param name="allTabStopStyles"/>
-
-        <xsl:variable name="tabStopPosition" select="$allTabStopStyles/style:tab-stop[$position]/@style:position"/>
-        <xsl:choose>
-            <xsl:when test="contains($tabStopPosition, 'cm')">
-                <xsl:call-template name="create-cell-width">
-                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'cm'))"/>
-                    <xsl:with-param name="unit"     select="'cm'"/>
-                    <xsl:with-param name="position" select="$position - 1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="contains($tabStopPosition, 'in')">
-                <xsl:call-template name="create-cell-width">
-                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'in'))"/>
-                    <xsl:with-param name="unit"     select="'in'"/>
-                    <xsl:with-param name="position" select="$position - 1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="contains($tabStopPosition, 'ch')">
-                <xsl:call-template name="create-cell-width">
-                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'ch'))"/>
-                    <xsl:with-param name="unit"     select="'ch'"/>
-                    <xsl:with-param name="position" select="$position - 1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="contains($tabStopPosition, 'pt')">
-                <xsl:call-template name="create-cell-width">
-                    <xsl:with-param name="width"    select="number(substring-before($tabStopPosition,'pt'))"/>
-                    <xsl:with-param name="unit"     select="'pt'"/>
-                    <xsl:with-param name="position" select="$position - 1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                </xsl:call-template>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-    <xsl:template name="create-cell-width">
-        <xsl:param name="width"/>
-        <xsl:param name="unit"/>
-        <xsl:param name="position"/>
-        <xsl:param name="allTabStopStyles"/>
-
-        <xsl:choose>
-            <xsl:when test="$position > 1">
-                <xsl:call-template name="create-cell-width">
-                    <xsl:with-param name="width"    select="$width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit))"/>
-                    <xsl:with-param name="unit"     select="$unit"/>
-                    <xsl:with-param name="position" select="$position - 1"/>
-                    <xsl:with-param name="allTabStopStyles" select="$allTabStopStyles"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="$position = 1">
-                <xsl:value-of select="concat($width - number(substring-before($allTabStopStyles/style:tab-stop[$position]/@style:position,$unit)), $unit)"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="concat($width, $unit)"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-</xsl:stylesheet>
\ No newline at end of file
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/main_html.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/main_html.xsl
deleted file mode 100644 (file)
index 443182a..0000000
+++ /dev/null
@@ -1,462 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:urlencoder="http://www.jclark.com/xt/java/java.net.URLEncoder"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-    <xsl:output method      ="xml"
-                encoding    ="UTF-8"
-                indent      ="yes"/>
-
-
-
-    <!--+++++ INCLUDED XSL MODULES +++++-->
-    <!-- inherited style properties will be collected and written in a CSS header (CSS) -->
-    <xsl:include href="style_header.xsl"/>
-
-    <!-- inherited style properties will be collected and written as html properties in a temporary variable (HTML4, PALM) -->
-    <xsl:include href="style_inlined.xsl"/>
-
-    <!-- our xml style properties will be mapped to CSS and HTML4.x properties -->
-    <xsl:include href="style_mapping.xsl"/>
-
-    <!-- common element handling -->
-    <xsl:include href="common.xsl"/>
-
-    <!-- table handling -->
-    <xsl:include href="table.xsl"/>
-
-    <!-- palm handling -->
-    <xsl:include href="palm.xsl"/>
-
-    <!-- global document handling -->
-    <xsl:include href="global_document.xsl"/>
-
-
-
-
-
-
-
-    <!--+++++ PARAMETER FROM THE APPLICATION AND GLOBAL VARIABLES +++++-->
-
-    <!-- MANDATORY: URL of meta stream -->
-    <xsl:param name="metaFileURL"/>
-
-    <!-- MANDATORY: URL of styles stream -->
-    <xsl:param name="stylesFileURL"/>
-
-    <!-- MANDATORY: for resolving relative links
-        For resolving realtive links to the packed SO document, i.e. the path/URL of the jared sxw file (e.g. meta.xml, styles.xml, links to graphics in a relative directory) -->
-    <xsl:param name="absoluteSourceDirRef"/>
-
-    <!-- OPTIONAL (mandatory, when when source is compressed): Necessary for the in the packed OO document embedded files (mostly graphics from the compressed /Picture dir).
-         When the OpenOffice (OO) file has been unpacked the absoluteSoureDirRef can be taken,
-         Otherwise, a JAR URL could be choosen or when working with OpenOffice a so called Package-URL encoded over HTTP can be used to
-         access the jared contents of the the jared document. . -->
-    <xsl:param name="jaredRootURL" select="$absoluteSourceDirRef"/>
-
-    <!-- OPTIONAL (mandatory, when used in session based environment)
-         Useful for WebApplications: if a HTTP session is not cookie based, URL rewriting is beeing used (the session is appended to the URL).
-         This URL session is used when creating links to graphics by XSLT. Otherwise the user havt to log again in for every graphic he would like to see. -->
-    <xsl:param name="optionalURLSuffix"/>
-
-    <!-- OPTIONAL: DPI (dots per inch) the standard solution of given pictures (necessary for the conversion of 'cm' into 'pixel')-->
-    <!-- Although many pictures have the 96 dpi resolution, a higher resoltion give better results for common browsers -->
-    <xsl:param name="dpi" select="96"/>
-
-    <!-- OPTIONAL: in case of using a different processor than a JAVA XSLT, you can unable the Java functionality
-         (i.e. debugging time and encoding chapter names for the content-table as href and anchors ) -->
-    <xsl:param name="disableJava"    select="false"/>
-    <xsl:param name="isJavaDisabled" select="boolean($disableJava)"/>
-
-    <!-- OPTIONAL: user-agent will be differntiated by this parameter given by application (e.g. java servlet)-->
-    <xsl:param name="outputType" select="'CSS_HEADER'"/>
-    <!-- set of possible deviceTyps (WML is set in its own startfile main_wml.xsl):
-    <xsl:param name="outputType" select="'CSS_HEADER'"/>
-    <xsl:param name="outputType" select="'CSS_INLINED'"/>
-    <xsl:param name="outputType" select="'PALM'"/> -->
-
-    <!-- OPTIONAL: for activating the debug mode set the variable here to 'true()' or give any value from outside -->
-    <xsl:param name="debug"         select="false"/>
-    <xsl:param name="isDebugMode"   select="boolean($debug)"/>
-
-<!-- *************************************************************************
-    OPTIONAL: NEEDED IN CONNECTION WITH A GLOBAL DOCUMENT -->
-
-    <!--SUMMARY:
-         following parameter triggers a (quite time consuming) enabling of bookmarks in the table-of-content.
-        IN DETAIL:
-         Currently some links used in the Office XML (e.g. in the content table as '#7.Some%20Example%20Headline%7Outline')
-         is not a valid URL (cmp. bug id# 102311). No file destination is specified nor exist any anchor element for these
-         links in the Office XML.
-         A workaround for this transformation therefore had to be made. This time-consuming mechanism is disabled by default and
-         can be activated by a parameter (i.e. 'disableLinkedTableOfContent'). A creation of an anchor is made for each header element.
-         All header titles gonna be encoding to be usable in a relative URL.    -->
-    <xsl:param name="disableLinkedTableOfContent" select="false()"/>
-
-    <!-- The chapter numbers of the current document (as a sequence of a global document) is dependent of the number
-        of chapter of the same level in preceding documents. -->
-    <xsl:param name="precedingChapterLevel1"  select="0"/>
-    <xsl:param name="precedingChapterLevel2"  select="0"/>
-    <xsl:param name="precedingChapterLevel3"  select="0"/>
-    <xsl:param name="precedingChapterLevel4"  select="0"/>
-    <xsl:param name="precedingChapterLevel5"  select="0"/>
-    <xsl:param name="precedingChapterLevel6"  select="0"/>
-    <xsl:param name="precedingChapterLevel7"  select="0"/>
-    <xsl:param name="precedingChapterLevel8"  select="0"/>
-    <xsl:param name="precedingChapterLevel9"  select="0"/>
-    <xsl:param name="precedingChapterLevel10" select="0"/>
-
-    <!-- XML documents containing a table of contents,
-        gonna link for usability reason above each chapter to the preceding and following document and the content table -->
-    <xsl:param name="contentTableURL"/>
-
-    <!-- Needed for the bug workaround of missing content table links
-        by this ambigous HTML references from the content table can be evoided-->
-    <xsl:param name="globalDocumentRefToCurrentFile"/>
-
-    <!-- Needed for the bug workaround of missing content table links
-        by this node-set the relation between content-table link and children document header can be unambigous established -->
-    <xsl:param name="contentTableHeadings"/>
-
-
-<!-- END OF GLOBAL DOCUMENT SECTION
-*************************************************************************-->
-
-
-
-    <!-- works for normal separated zipped xml files as for flat filter single xml file format as well -->
-    <xsl:variable name="office:meta-file"           select="document($metaFileURL)"/>
-    <xsl:variable name="office:styles-file"         select="document($stylesFileURL)"/>
-    <xsl:variable name="office:font-decls"          select="$office:styles-file/*/office:font-decls"/>
-    <xsl:variable name="office:styles"              select="$office:styles-file/*/office:styles"/>
-    <!-- office:automatic-styles may occure in two different files (i.d. content.xml and styles.xml). Furthermore the top level tag is different in a flat xml file -->
-    <xsl:variable name="office:automatic-styles"    select="/*/office:automatic-styles"/>
-
-    <!-- simple declaration of WML used to avoid parser errors -->
-    <xsl:variable name="wap-paragraph-elements-without-table-row"/>
-    <xsl:variable name="wap-paragraph-elements"/>
-    <xsl:template name="wml-repeat-write-row"/>
-
-
-    <!-- ************************************* -->
-    <!-- *** build the propriate HTML file *** -->
-    <!-- ************************************* -->
-
-    <xsl:template match="/">
-
-        <!--<xsl:message>
-
-
-        Entered the styleSheets, transformation begins... </xsl:message>-->
-
-        <xsl:choose>
-            <xsl:when test="$isDebugMode">
-                <xsl:call-template name="check-parameter"/>
-
-                <xsl:if test="not($isJavaDisabled)">
-                    <xsl:call-template name="debug-style-collecting-time"/>
-                </xsl:if>
-            </xsl:when>
-            <xsl:otherwise>
-                <!-- to access the variable like a node-set it is necessary to convert it
-                     from a result-tree-fragment (RTF) to a node set using the James Clark extension -->
-                <xsl:variable name="collectedGlobalData-RTF">
-                    <xsl:call-template name='create-all-inline-styles'/>
-                </xsl:variable>
-
-                <xsl:choose>
-                    <xsl:when test="function-available('xt:node-set')">
-                        <xsl:call-template name="start">
-                            <xsl:with-param name="collectedGlobalData" select="xt:node-set($collectedGlobalData-RTF)"/>
-                        </xsl:call-template>
-                    </xsl:when>
-                    <xsl:when test="function-available('xalan:nodeset')">
-                        <xsl:call-template name="start">
-                            <xsl:with-param name="collectedGlobalData" select="xalan:nodeset($collectedGlobalData-RTF)"/>
-                        </xsl:call-template>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:element name="NodeSetFunctionNotAvailable"/>
-                        <xsl:call-template name="start"/>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-    <xsl:template name="start">
-        <xsl:param name="collectedGlobalData"/>
-
-        <xsl:choose>
-            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER'">
-                <xsl:element name="html">
-                    <xsl:element name="head">
-                        <xsl:if test="$isDebugMode"><xsl:message>CSS helper variable will be created....</xsl:message></xsl:if>
-                        <xsl:call-template name='common-header-properties'/>
-                        <xsl:if test="$isDebugMode"><xsl:message>CSS variable ready, header will be created....</xsl:message></xsl:if>
-                        <!-- constructing the css header simulating inheritance of style-families by style order -->
-                        <xsl:call-template name='create-css-styleheader'/>
-                        <xsl:if test="$isDebugMode"><xsl:message>CSS header creation finished!</xsl:message></xsl:if>
-                    </xsl:element>
-
-
-
-                    <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
-                    <xsl:element name="body">
-                        <!-- background image -->
-                        <xsl:if test="$backgroundImageURL">
-                            <xsl:attribute name="background">
-                                <xsl:choose>
-                                    <!-- for images jared in open office document -->
-                                    <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
-                                        <!-- creating an absolute http URL to the contained/packed image file -->
-                                        <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
-                                    </xsl:when>
-                                    <xsl:otherwise>
-                                        <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
-                                    </xsl:otherwise>
-                                </xsl:choose>
-                            </xsl:attribute>
-                        </xsl:if>
-
-                        <!-- processing the content of the xml file -->
-                        <xsl:apply-templates select="/*/office:body">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:apply-templates>
-                    </xsl:element>
-
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ HTML 4.0 INLINING  +++++-->
-            <xsl:when test="$outputType = 'CSS_INLINED'">
-                <xsl:element name="html">
-                    <xsl:element name="head">
-                        <xsl:call-template name='common-header-properties'/>
-                    </xsl:element>
-
-                    <xsl:variable name="backgroundImageURL" select="$office:automatic-styles/style:page-master/style:properties/style:background-image/@xlink:href"/>
-                    <xsl:element name="body">
-                        <!-- background image -->
-                        <xsl:if test="$backgroundImageURL">
-                            <xsl:attribute name="background">
-                                <xsl:choose>
-                                    <!-- for images jared in open office document -->
-                                    <xsl:when test="contains($backgroundImageURL, '#Pictures/')">
-                                        <!-- creating an absolute http URL to the contained/packed image file -->
-                                        <xsl:value-of select="concat($jaredRootURL, '/Pictures/', substring-after($backgroundImageURL, '#Pictures/'), $optionalURLSuffix)"/>
-                                    </xsl:when>
-                                    <xsl:otherwise>
-                                        <xsl:attribute name="src"><xsl:value-of select="$backgroundImageURL"/></xsl:attribute>
-                                    </xsl:otherwise>
-                                </xsl:choose>
-                            </xsl:attribute>
-                        </xsl:if>
-                        <xsl:apply-templates select="/*/office:body">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:apply-templates>
-                    </xsl:element>
-                </xsl:element>
-            </xsl:when>
-
-            <!--+++++ PALM-VII (3.2 HTML SUBSET)  +++++-->
-            <xsl:when test="$outputType = 'PALM'">
-                <!-- the proxy will convert the html file later to PQA -->
-                <xsl:element name="html">
-                    <xsl:element name="head">
-                        <xsl:call-template name='palm-header-properties'/>
-                    </xsl:element>
-
-                    <xsl:element name="body">
-                        <!-- processing the content of the xml file -->
-                        <xsl:apply-templates select="/*/office:body">
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:apply-templates>
-                    </xsl:element>
-                </xsl:element>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <!-- ********************************************* -->
-    <!-- *** Header for CSS_INLINED and CSS_HEADER *** -->
-    <!-- ********************************************* -->
-
-    <xsl:template name='common-header-properties'>
-        <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:title"/>
-        <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:description"/>
-<!--2DO add further header elements..
-        <xsl:apply-templates select="$office:meta-file/*/office:meta/dc:subject"/>
-        <xsl:apply-templates select="$office:meta-file/*/office:meta/meta:keywords[postition()=1]"/>-->
-    </xsl:template>
-
-    <xsl:template match="dc:title">
-        <xsl:element name="title">
-            <xsl:value-of select="."/>
-        </xsl:element>
-    </xsl:template>
-
-    <xsl:template match="dc:description">
-        <xsl:element name="meta">
-            <xsl:attribute name="name">
-                <xsl:text>description</xsl:text>
-            </xsl:attribute>
-            <xsl:attribute name="content">
-                <xsl:value-of select="."/>
-            </xsl:attribute>
-        </xsl:element>
-    </xsl:template>
-
-
-    <!-- ********************************************* -->
-    <!-- *** Measuring the time for style creating *** -->
-    <!-- ********************************************* -->
-
-
-    <xsl:template name="debug-style-collecting-time">
-
-        <xsl:variable name="startTime-RTF">
-            <xsl:choose>
-                <xsl:when test="function-available('system:current-time-millis')">
-                    <xsl:value-of select="system:current-time-millis()"/>
-                </xsl:when>
-                <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
-                    <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
-                </xsl:when>
-            </xsl:choose>
-        </xsl:variable>
-
-
-
-        <xsl:variable name="collectedGlobalData-RTF">
-            <xsl:call-template name='create-all-inline-styles'/>
-        </xsl:variable>
-
-
-        <xsl:choose>
-            <xsl:when test="function-available('xt:node-set')">
-                <xsl:message>Creating the inline styles....</xsl:message>
-                <xsl:variable name="startTime"              select="number(xt:node-set($startTime-RTF))"/>
-                <xsl:variable name="collectedGlobalData"    select="xt:node-set($collectedGlobalData-RTF)"/>
-                <xsl:variable name="endTime"                select="system:current-time-millis()"/>
-
-                <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
-                <xsl:call-template name="start">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="function-available('xalan:nodeset')">
-                <xsl:message>Creating the inline styles....</xsl:message>
-                <xsl:variable name="startTime"              select="number(xalan:nodeset($startTime-RTF))"/>
-                <xsl:variable name="endTime"                select="java:java.lang.System.currentTimeMillis()"/>
-                <xsl:variable name="collectedGlobalData"    select="xalan:nodeset($collectedGlobalData-RTF)"/>
-
-                <xsl:message>Time for instantiating style variable: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
-                <xsl:call-template name="start">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-        </xsl:choose>
-
-    </xsl:template>
-
-    <!-- DEBUG purpose only: checking the parameters of this template-->
-    <xsl:template name="check-parameter">
-        <xsl:message>Parameter dpi: <xsl:value-of select="$dpi"/></xsl:message>
-        <xsl:message>Parameter metaFileURL: <xsl:value-of select="$metaFileURL"/></xsl:message>
-        <xsl:message>Parameter stylesFileURL: <xsl:value-of select="$stylesFileURL"/></xsl:message>
-        <xsl:message>Parameter absoluteSourceDirRef: <xsl:value-of select="$absoluteSourceDirRef"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel1 : <xsl:value-of select="$precedingChapterLevel1"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel2 : <xsl:value-of select="$precedingChapterLevel2"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel3 : <xsl:value-of select="$precedingChapterLevel3"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel4 : <xsl:value-of select="$precedingChapterLevel4"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel5 : <xsl:value-of select="$precedingChapterLevel5"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel6 : <xsl:value-of select="$precedingChapterLevel6"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel7 : <xsl:value-of select="$precedingChapterLevel7"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel8 : <xsl:value-of select="$precedingChapterLevel8"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel9 : <xsl:value-of select="$precedingChapterLevel9"/></xsl:message>
-        <xsl:message>Parameter precedingChapterLevel10: <xsl:value-of select="$precedingChapterLevel10"/></xsl:message>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/palm.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/palm.xsl
deleted file mode 100644 (file)
index 212edb1..0000000
+++ /dev/null
@@ -1,404 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-    <xsl:output cdata-section-elements="meta"/>
-
-
-    <!-- **************************** -->
-    <!-- *** specific palm header *** -->
-    <!-- **************************** -->
-
-    <xsl:template name='palm-header-properties'>
-        <xsl:element name="meta">
-            <xsl:attribute name="name">PalmComputingPlatform</xsl:attribute>
-            <xsl:attribute name="content">true</xsl:attribute>
-        </xsl:element>
-        <xsl:element name="meta">
-            <xsl:attribute name="name">HandheldFriendly</xsl:attribute>
-            <xsl:attribute name="content">true</xsl:attribute>
-        </xsl:element>
-        <xsl:element name="meta">
-            <xsl:attribute name="name">HistoryListText</xsl:attribute>
-            <xsl:attribute name="content">Dateimanager&#10;: &amp;date &amp;time</xsl:attribute>
-        </xsl:element>
-        <xsl:element name="meta">
-            <xsl:attribute name="name">description</xsl:attribute>
-            <xsl:attribute name="content">StarPortal</xsl:attribute>
-        </xsl:element>
-        <xsl:element name="meta">
-            <xsl:attribute name="name">keywords</xsl:attribute>
-            <xsl:attribute name="content">starportal, staroffice, software</xsl:attribute>
-        </xsl:element>
-        <xsl:element name="meta">
-            <xsl:attribute name="http-equiv">Content-Type</xsl:attribute>
-            <xsl:attribute name="content">text/html; charset=iso-8859-1</xsl:attribute>
-        </xsl:element>
-    </xsl:template>
-
-
-    <!-- ********************************* -->
-    <!-- *** creating table attributes *** -->
-    <!-- ********************************* -->
-
-    <!-- table data (td) and table header (th) attributes -->
-    <xsl:template name="create-attribute-ALIGN">
-        <xsl:param name="styleProperties"/>
-
-        <xsl:if test="contains($styleProperties, 'align')">
-            <xsl:attribute name="align">
-                 <xsl:choose>
-                    <xsl:when test="contains($styleProperties, 'align:left')">
-                        <xsl:text>left</xsl:text>
-                    </xsl:when>
-                    <xsl:when test="contains($styleProperties, 'align:right')">
-                        <xsl:text>right</xsl:text>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:text>center</xsl:text>
-                    </xsl:otherwise>
-                 </xsl:choose>
-            </xsl:attribute>
-        </xsl:if>
-    </xsl:template>
-
-
-    <!-- ********************************* -->
-    <!-- *** creating List attributes  *** -->
-    <!-- ********************************* -->
-<!--
-    <xsl:template name="create-list-attributes">
-        <xsl:param name="styleProperties"/>
-
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-2 be implemented
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-
-    </xsl:template>
--->
-
-    <!-- ************************************************ -->
-    <!-- *** creating nested format tags (PALM & WML) *** -->
-    <!-- ************************************************ -->
-
-    <!-- Italic -->
-    <xsl:template name="create-nested-format-tags">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="styleProperties"/>
-        <xsl:choose>
-            <xsl:when test="contains($styleProperties, 'italic')">
-                <xsl:element name="i">
-                    <xsl:call-template name="bold">
-                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:call-template name="bold">
-                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- Bold -->
-    <xsl:template name="bold">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="styleProperties"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($styleProperties, 'bold')">
-                <xsl:element name="b">
-                    <xsl:call-template name="underline">
-                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:call-template name="underline">
-                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- Underline : last format attribute, which is also used from WML - WML ends here! -->
-    <xsl:template name="underline">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="styleProperties"/>
-
-        <xsl:choose>
-            <xsl:when test="$outputType = 'PALM'">
-                <xsl:choose>
-                    <xsl:when test="contains($styleProperties, 'underline')">
-                        <xsl:element name="u">
-                            <xsl:call-template name="strikethrough">
-                                <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:call-template>
-                        </xsl:element>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:call-template name="strikethrough">
-                            <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:call-template>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:choose>
-                    <xsl:when test="contains($styleProperties, 'underline')">
-                        <xsl:element name="u">
-                            <xsl:apply-templates>
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:apply-templates>
-                        </xsl:element>
-                    </xsl:when>
-                    <xsl:otherwise>
-                        <xsl:apply-templates>
-                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        </xsl:apply-templates>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- strikethrough -->
-    <xsl:template name="strikethrough">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="styleProperties"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($styleProperties, 'strike')">
-                <xsl:element name="strike">
-                    <xsl:call-template name="align">
-                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:call-template name="align">
-                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- Alignment -->
-    <xsl:template name="align">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="styleProperties"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($styleProperties, 'align')">
-                <xsl:element name="div">
-                    <xsl:attribute name="align">
-                         <xsl:choose>
-                            <xsl:when test="contains($styleProperties, 'align:left')">
-                                <xsl:text>left</xsl:text>
-                            </xsl:when>
-                            <xsl:when test="contains($styleProperties, 'align:right')">
-                                <xsl:text>right</xsl:text>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:text>center</xsl:text>
-                            </xsl:otherwise>
-                         </xsl:choose>
-                    </xsl:attribute>
-                    <xsl:call-template name="font_combined">
-                        <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:call-template>
-                </xsl:element>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:call-template name="font_combined">
-                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- Both size and Color for font -->
-    <xsl:template name="font_combined">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="styleProperties"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($styleProperties, 'color') and contains($styleProperties, 'size')">
-                <xsl:element name="font">
-
-                    <xsl:attribute name="color">
-                         <xsl:choose>
-                            <xsl:when test="contains($styleProperties, 'color:#000000')">
-                                <xsl:text>#000000</xsl:text>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:text>#FFFFFF</xsl:text>
-                            </xsl:otherwise>
-                         </xsl:choose>
-                    </xsl:attribute>
-
-                    <xsl:attribute name="size">
-                        <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
-                    </xsl:attribute>
-
-                    <!-- get the embedded content -->
-                    <xsl:apply-templates>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:apply-templates>
-                </xsl:element>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:call-template name="font_simple">
-                    <xsl:with-param name="styleProperties" select="$styleProperties"/>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- size or Color for font -->
-    <xsl:template name="font_simple">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="styleProperties"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($styleProperties, 'color')">
-                <xsl:element name="font">
-                    <xsl:attribute name="color">
-                         <xsl:choose>
-                            <xsl:when test="contains($styleProperties, 'color:#000000')">
-                                <xsl:text>#000000</xsl:text>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:text>#FFFFFF</xsl:text>
-                            </xsl:otherwise>
-                         </xsl:choose>
-                    </xsl:attribute>
-
-                    <!-- get the embedded content -->
-                    <xsl:apply-templates>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:apply-templates>
-                </xsl:element>
-            </xsl:when>
-
-            <xsl:when test="contains($styleProperties, 'size')">
-                <xsl:element name="font">
-                    <xsl:attribute name="size">
-                        <xsl:value-of select="substring-after(substring-before($styleProperties ,':size'), 'size:')"/>
-                    </xsl:attribute>
-
-                    <!-- get the embedded content -->
-                    <xsl:apply-templates>
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    </xsl:apply-templates>
-                </xsl:element>
-            </xsl:when>
-
-            <xsl:otherwise>
-                <!-- get the embedded content -->
-                <xsl:apply-templates>
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                </xsl:apply-templates>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/style_header.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/style_header.xsl
deleted file mode 100644 (file)
index eeb0c20..0000000
+++ /dev/null
@@ -1,379 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-
-    <!-- ****************************** -->
-    <!-- *** style sheet processing *** -->
-    <!-- ****************************** -->
-
-
-    <xsl:template name='create-css-styleheader'>
-        <xsl:comment>
-            <xsl:text>The CSS style header method for setting styles</xsl:text>
-        </xsl:comment>
-        <xsl:element name="style">
-            <xsl:attribute name="type">text/css</xsl:attribute>
-            <xsl:comment>
-                <xsl:text>
-
-        </xsl:text>
-                <xsl:call-template name="write-default-styles"/>
-
-                <!-- THE STYLE PROPERTIES OF THE FIRST WRITTEN STYLE (PARENT) IS GIVEN OUT -->
-
-                <!-- 1) styles from office:styles are possible parent from all (itself or office:automatic-styles).
-                     Therefore they are created first.
-                     Beginning with the top-level parents (the styles without any parent). -->
-                <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
-
-                    <xsl:call-template name="write-styleproperty-line"/>
-                    <xsl:call-template name="write-styleproperty-lines-for-children"/>
-                </xsl:for-each>
-
-                <xsl:text> </xsl:text>
-
-                <!-- 2) styles from office:automatic-styles can only be parent of styles from the office:automatic-styles section.
-                     Beginning with top-level styles, again, all children style will be recursivly traversed -->
-                <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
-                    <xsl:call-template name="write-styleproperty-line">
-                        <xsl:with-param name="searchOnlyInAutomaticStyles" select="true()"/>
-                    </xsl:call-template>
-                    <xsl:call-template name="write-styleproperty-lines-for-children">
-                        <xsl:with-param name="searchOnlyInAutomaticStyles"/>
-                    </xsl:call-template>
-                </xsl:for-each>
-            //</xsl:comment>
-        </xsl:element>
-    </xsl:template>
-
-
-    <xsl:template name='write-styleproperty-line'>
-        <xsl:param name="searchOnlyInAutomaticStyles"/>
-
-        <xsl:variable name="styleProperties">
-            <xsl:call-template name="write-style-properties">
-                <xsl:with-param name="styleAttributePath"   select="current()/style:properties/@*"/>
-            </xsl:call-template>
-        </xsl:variable>
-
-        <!-- do not write styles with no css property -->
-        <xsl:if test="not(string-length($styleProperties) = 0)">
-            <!-- write out the name of the current (parent) style in the CSS headersection (e.g. "span.myStyle") -->
-            <xsl:call-template name="write-style-name">
-                <xsl:with-param name="is-parent-style" select="true()"/>
-            </xsl:call-template>
-
-            <!-- the names of all styles children will be written out(office:style AND office:automatic-style) -->
-            <xsl:call-template name="write-children-style-names">
-                <xsl:with-param name="parentStyleName"          select="@style:name"/>
-                <xsl:with-param name="parentStyleFamily"        select="@style:family"/>
-                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
-            </xsl:call-template>
-
-        <!-- the style properties of the first written style (parent) is given out -->
-        <xsl:text> {
-                </xsl:text>
-                <xsl:value-of select="$styleProperties"/>
-        <xsl:text>}
-        </xsl:text>
-
-        </xsl:if>
-
-
-
-    </xsl:template>
-
-
-
-
-    <!-- RECURSION WITH ENDCONDITON: adding style classes for all existing childs -->
-    <xsl:template name='write-styleproperty-lines-for-children'>
-        <xsl:param name="searchOnlyInAutomaticStyles"/>
-
-        <xsl:variable name="parentStyleName"    select="@style:name"/>
-        <xsl:variable name="parentStyleFamily"  select="@style:family"/>
-
-        <xsl:if test="not(searchOnlyInAutomaticStyles)">
-            <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
-                <xsl:call-template name="write-styleproperty-line"/>
-                <xsl:call-template name="write-styleproperty-lines-for-children"/>
-            </xsl:for-each>
-        </xsl:if>
-        <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
-            <xsl:call-template name="write-styleproperty-line">
-                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
-            </xsl:call-template>
-            <xsl:call-template name="write-styleproperty-lines-for-children">
-                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
-            </xsl:call-template>
-        </xsl:for-each>
-    </xsl:template>
-
-
-    <xsl:template name="write-default-styles">
-
-        <!-- some default attributes in xml have to be explicitly set in HTML (e.g. margin-top="0") -->
-        <xsl:text>*.OOo_defaults</xsl:text>
-
-                <xsl:for-each select="$office:styles/style:style">
-                    <xsl:text>, </xsl:text>
-                    <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
-                </xsl:for-each>
-
-                <xsl:for-each select="$office:automatic-styles/style:style">
-                    <xsl:text>, </xsl:text>
-                    <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
-                </xsl:for-each>
-        <!-- 2DO: the defaults might be better collected and written in a separated (XML) file -->
-<xsl:text> {
-                margin-top:0cm; margin-bottom:0cm; }
-        </xsl:text>
-
-        <xsl:for-each select="$office:styles/style:default-style">
-            <xsl:call-template name="write-default-style"/>
-        </xsl:for-each>
-
-        <xsl:for-each select="$office:automatic-styles/style:default-style">
-            <xsl:call-template name="write-default-style"/>
-        </xsl:for-each>
-
-    </xsl:template>
-
-
-
-    <xsl:template name="write-default-style">
-        <xsl:variable name="family-style" select="@style:family"/>
-
-        <!-- some default attributes for format families (e.g. graphics, paragraphs, etc.) written as style:default-style -->
-        <xsl:value-of select="concat('*.', translate($family-style, '. %()/\', ''), '_defaults')"/>
-
-        <xsl:for-each select="$office:styles/style:style[@style:family = $family-style]">
-            <xsl:text>, </xsl:text>
-            <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
-        </xsl:for-each>
-
-        <xsl:for-each select="$office:automatic-styles/style:style[@style:family = $family-style]">
-            <xsl:text>, </xsl:text>
-            <xsl:value-of select="concat('*.', translate(@style:name, '. %()/\', ''))"/>
-        </xsl:for-each>
-
-
-        <xsl:variable name="styleProperties">
-            <xsl:call-template name="write-style-properties">
-                <xsl:with-param name="styleAttributePath"   select="current()/style:properties/@*"/>
-            </xsl:call-template>
-        </xsl:variable>
-
-        <!-- do not write styles with no css property -->
-        <xsl:if test="not(string-length($styleProperties) = 0)">
-        <!-- the style properties of the first written style (parent) is given out -->
-        <xsl:text> {
-                </xsl:text>
-                <xsl:value-of select="$styleProperties"/>
-        <xsl:text>}
-        </xsl:text>
-        </xsl:if>
-
-    </xsl:template>
-
-
-    <!--++
-          The parent style will be written out!
-          For each Style:family a prefix must be added
-            <!ENTITY % styleFamily
-            "(paragraph|text|section|table|table-column|table-row|table-cell|table-page|chart|graphics|default|drawing-page|presentation|control)">
-        ++-->
-    <xsl:template name="write-style-name">
-        <xsl:param name="is-parent-style"/>
-
-        <!-- This construct is for list elements. Whenever a paragraph element is being used as child of a list element the name paragraph style is been used for
-            the list item. This can be switched as the paragaph style-name and the list-style-name are in the same element.
-            Otherwise there would be formatting errors (e.g. margin-left will be used for the content in the list elment and not for the list element itself). -->
-        <xsl:variable name="style-name">
-            <xsl:choose>
-                <xsl:when test="@style:list-style-name">
-                    <xsl:value-of select="@style:list-style-name"/>
-                </xsl:when>
-                <xsl:otherwise>
-                    <xsl:value-of select="@style:name"/>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:variable>
-
-        <xsl:if test="not($is-parent-style)">
-            <xsl:text>, </xsl:text>
-        </xsl:if>
-
-        <xsl:choose>
-            <!-- normally 'p.' would be used as CSS element,
-                 but header (h1, h2,...) are also from the style:family paragraph -->
-            <xsl:when test="@style:family='paragraph'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='text'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='section'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='table'">
-                <xsl:value-of select="concat('table.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='table-column'">
-            <!-- as column styles have to be included as span styles AFTER the table (no two class attributes in TD allowed -->
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='table-row'">
-                <xsl:value-of select="concat('tr.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='table-cell'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='table-page'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='chart'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='graphics'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='default'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='drawing-page'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='presentation'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-            <xsl:when test="@style:family='control'">
-                <xsl:value-of select="concat('*.', translate($style-name, '. %()/\', ''))"/>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- finding all style child of a section and give their styleIdentifier to the output -->
-    <xsl:template name='write-children-style-names'>
-        <xsl:param name="parentStyleName" select="@style:name"/>
-        <xsl:param name="parentStyleFamily" select="@style:family"/>
-        <xsl:param name="searchOnlyInAutomaticStyles"/>
-
-
-        <!--** the names of all office:styles children will be written out
-            ** (a automatic style can only have children in the office:automatic-style section) -->
-
-        <!-- if NOT called from a office:automatic-style parent -->
-        <xsl:if test="not(searchOnlyInAutomaticStyles)">
-            <!-- for all children in the office:style section -->
-            <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
-                <!-- write the style name in the css header -->
-                <xsl:call-template name="write-style-name"/>
-
-                <!-- search for child styles -->
-                <xsl:call-template name="write-children-style-names">
-                    <xsl:with-param name="parentStyleName" select="@style:name"/>
-                    <xsl:with-param name="parentStyleFamily" select="@style:family"/>
-                </xsl:call-template>
-
-            </xsl:for-each>
-        </xsl:if>
-
-        <!--** the names of all office:automatic-styles children will be written out -->
-
-        <!-- for all children in the office:automatic-style section -->
-        <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
-            <!-- write the style name in the css header -->
-            <xsl:call-template name="write-style-name"/>
-
-            <!-- search for child styles -->
-            <xsl:call-template name="write-children-style-names">
-                <xsl:with-param name="parentStyleName" select="@style:name"/>
-                <xsl:with-param name="parentStyleFamily" select="@style:family"/>
-                <xsl:with-param name="searchOnlyInAutomaticStyles"/>
-            </xsl:call-template>
-
-        </xsl:for-each>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/style_inlined.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/style_inlined.xsl
deleted file mode 100644 (file)
index 1915995..0000000
+++ /dev/null
@@ -1,398 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-
-    <!-- ********************************************* -->
-    <!-- *** hard attributed (inlined) properties  *** -->
-    <!-- ********************************************* -->
-
-
-    <!-- RESTRICTIONS:
-            1)  As the styles-node-variables are NOT global, the style variables are not global, either!!
-            2)  As a list of elements can only be added to a variable as a result tree fragment the
-                extension is neccessary!!
-    -->
-
-    <!-- 2DO: Inline styles do not inherit from XML office defaults nor font:family defaults as the style header does
-              (cp. stylesheet 'style_header.xsl' and the 'write-default-styles' template) -->
-
-    <xsl:template name='create-all-inline-styles'>
-
-        <!--** traversee all style trees and their branches collecting style properties **-->
-        <xsl:element name="allstyles">
-        <!--** traversee all office:styles trees beginning with the top-level styles**-->
-            <xsl:for-each select="$office:styles/style:style[not(@style:parent-style-name)]">
-
-                <!--** give out the style properties of the parent node **-->
-                <xsl:call-template name='write-current-and-inherited-style-properties'>
-                    <xsl:with-param name="styles-node"                  select="$office:styles"/>
-                    <xsl:with-param name="style-family"                 select="@style:family"/>
-                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-                </xsl:call-template>
-
-                <!--** all office:styles children of the current top-level office:styles **-->
-                <xsl:call-template name='for-all-templates-child-styles'>
-                    <xsl:with-param name="parentStyleName"              select="@style:name"/>
-                    <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
-                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-                </xsl:call-template>
-
-                <!--** all office:automatic-styles children of the current top-level style **-->
-                <xsl:call-template name='for-all-automatic-child-styles'>
-                    <xsl:with-param name="parentStyleName"              select="@style:name"/>
-                    <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
-                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-                </xsl:call-template>
-            </xsl:for-each>
-
-        <!--** traversee all office:automatic-styles trees beginning with the top-level styles **-->
-            <xsl:for-each select="$office:automatic-styles/style:style[not(@style:parent-style-name)]">
-                <!--** give out the style properties of the parent node **-->
-                <xsl:call-template name='write-current-and-inherited-style-properties'>
-                    <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
-                    <xsl:with-param name="style-family"                 select="@style:family"/>
-                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-                </xsl:call-template>
-
-                <!--** all children of the top-level office:automatic-styless  **-->
-                <xsl:call-template name='for-all-automatic-child-styles'>
-                    <xsl:with-param name="parentStyleName"              select="@style:name"/>
-                    <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
-                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-                </xsl:call-template>
-            </xsl:for-each>
-        </xsl:element>
-    </xsl:template>
-
-
-
-    <xsl:template name='for-all-templates-child-styles'>
-        <xsl:param name="parentStyleName"/>
-        <xsl:param name="parentStyleFamily"/>
-        <xsl:param name="style-name-tokenized"/>
-
-        <xsl:for-each select="../style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
-            <!--** give out the style properties of the current node **-->
-            <xsl:element name="{$style-name-tokenized}">
-                <xsl:call-template name='write-current-and-inherited-style-properties'>
-                    <xsl:with-param name="styles-node"                  select="$office:styles"/>
-                    <xsl:with-param name="style-family"                 select="@style:family"/>
-                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-                </xsl:call-template>
-            </xsl:element>
-
-            <!--** for all template-children of the current office:styles  **-->
-            <xsl:call-template name='for-all-templates-child-styles'>
-                <xsl:with-param name="styles-node"                  select="$office:styles"/>
-                <xsl:with-param name="parentStyleName"              select="@style:name"/>
-                <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
-                <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-            </xsl:call-template>
-
-            <!--** for all automatic-children of the current office:styles  **-->
-            <xsl:call-template name='for-all-automatic-child-styles'>
-                <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
-                <xsl:with-param name="parentStyleName"              select="@style:name"/>
-                <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
-                <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-            </xsl:call-template>
-
-        </xsl:for-each>
-    </xsl:template>
-
-
-
-    <xsl:template name='for-all-automatic-child-styles'>
-        <xsl:param name="styles-node"/>
-        <xsl:param name="parentStyleName"/>
-        <xsl:param name="parentStyleFamily"/>
-        <xsl:param name="style-name-tokenized"/>
-
-        <xsl:for-each select="$office:automatic-styles/style:style[@style:family=$parentStyleFamily and @style:parent-style-name=$parentStyleName]">
-            <!--** give out the style properties of the current node **-->
-            <xsl:element name="{$style-name-tokenized}">
-                <xsl:call-template name='write-current-and-inherited-style-properties'>
-                    <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
-                    <xsl:with-param name="style-family"                 select="@style:family"/>
-                    <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-                </xsl:call-template>
-            </xsl:element>
-
-            <!--** for all automatic-children of the current office:automatic-styles  **-->
-            <xsl:call-template name='for-all-automatic-child-styles'>
-                <xsl:with-param name="styles-node"                  select="$office:automatic-styles"/>
-                <xsl:with-param name="parentStyleName"              select="@style:name"/>
-                <xsl:with-param name="parentStyleFamily"            select="@style:family"/>
-                <xsl:with-param name="style-name-tokenized"         select="translate(@style:name, '. %()/\', '')"/>
-            </xsl:call-template>
-        </xsl:for-each>
-    </xsl:template>
-
-
-    <xsl:template name='write-current-and-inherited-style-properties'>
-        <xsl:param name="style-family"/>
-        <xsl:param name="styles-node"/>
-        <xsl:param name="style-name-tokenized"/>
-
-        <xsl:element name="{$style-name-tokenized}">
-            <xsl:variable name="current-style-name" select="@style:name"/>
-            <xsl:variable name="parent-style-name" select="@style:parent-style-name"/>
-
-            <xsl:variable name="new-property-list">
-                <!--*** COLLECT STYLE ATTRIBUTES (only toplevel) ***-->
-                <xsl:call-template name="write-style-properties">
-                    <xsl:with-param name="styleAttributePath"   select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*"/>
-                </xsl:call-template>
-            </xsl:variable>
-            <xsl:choose>
-                <!--*** @End: GIVE OUT All COLLECTED STYLE ATTRIBUTES (only toplevel) ***-->
-                <xsl:when test="string-length($parent-style-name)=0">
-                <!--** if no styleParent is given, the properties are given out at once **-->
-                    <xsl:value-of select="normalize-space($new-property-list)"/>
-                </xsl:when>
-                <xsl:otherwise>
-                    <xsl:variable name="new-property-names">
-                        <xsl:for-each select="$styles-node/style:style[@style:family=$style-family and @style:name=$current-style-name]/style:properties/@*">
-                            <xsl:value-of select="name()"/>
-                        </xsl:for-each>
-                    </xsl:variable>
-                    <!--** further attributes of the parent style must be collected **-->
-                    <xsl:call-template name="add-parent-style-attributes">
-                        <xsl:with-param name="property-name-list"       select="$new-property-names"/>
-                        <xsl:with-param name="complete-property-list"   select="normalize-space($new-property-list)"/>
-                        <xsl:with-param name="current-style-name"       select="$current-style-name"/>
-                        <xsl:with-param name="parent-style-name"        select="$parent-style-name"/>
-                        <xsl:with-param name="style-family"             select="$style-family"/>
-                    </xsl:call-template>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:element>
-    </xsl:template>
-
-
-
-    <xsl:template name="add-parent-style-attributes">
-        <xsl:param name="property-name-list"/>
-        <xsl:param name="complete-property-list"/>
-        <xsl:param name="current-style-name"/>
-        <xsl:param name="parent-style-name"/>
-        <xsl:param name="style-family"/>
-
-        <!--*** New two be added property names will be collected (only one variable per template) ***-->
-        <xsl:variable name="new-property-names">
-            <xsl:call-template name="get-new-style-names">
-                <xsl:with-param name="property-name-list"       select="$property-name-list"/>
-                <xsl:with-param name="parent-style-name"        select="$parent-style-name"/>
-                <xsl:with-param name="current-style-name"       select="$current-style-name"/>
-            </xsl:call-template>
-        </xsl:variable>
-
-        <xsl:choose>
-            <!--*** check if the new parent style exist in the office:automatic-styles section (defined by name and family) ***-->
-            <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$current-style-name]">
-                <!--*** RECURSION: adding new parent style attributes to the current style ***-->
-                <xsl:variable name="new-property-attributes">
-                    <xsl:call-template name="get-new-style-attributes">
-                        <xsl:with-param name="new-property-names"           select="$new-property-names"/>
-                        <xsl:with-param name="current-style-name"           select="$current-style-name"/>
-                        <xsl:with-param name="parent-style-name"            select="$parent-style-name"/>
-                    </xsl:call-template>
-                </xsl:variable>
-                <!--*** End CONDITION: the last style parent has already been executed ***-->
-                <xsl:variable name="new-parent-style-name"  select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
-                <xsl:choose>
-                    <xsl:when test="string-length($new-parent-style-name)=0">
-                    <!--** no further parent is found, the given parameter property-node is the final style -->
-                        <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
-                    </xsl:when>
-                    <xsl:otherwise>
-                    <!--** further attributes of the parent style must be collected **-->
-                        <xsl:call-template name="add-parent-style-attributes">
-                            <xsl:with-param name="property-name-list"       select="concat($property-name-list, $new-property-names)"/>
-                            <xsl:with-param name="complete-property-list"   select="concat($complete-property-list,$new-property-attributes)"/>
-                            <xsl:with-param name="current-style-name"       select="$parent-style-name"/>
-                            <xsl:with-param name="parent-style-name"        select="$new-parent-style-name"/>
-                            <xsl:with-param name="style-family"             select="$style-family"/>
-                        </xsl:call-template>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:when>
-
-            <!--** the specific style (defined by name and family) must be found in the office:styles section -->
-            <xsl:otherwise>
-                <!--*** RECURSION: adding new parent style attributes to the current style ***-->
-                <!--*** adding new parent style attributes to the current style ***-->
-                <xsl:variable name="new-property-attributes">
-                    <xsl:call-template name="get-new-style-attributes">
-                        <xsl:with-param name="new-property-names"           select="$new-property-names"/>
-                        <xsl:with-param name="current-style-name"           select="$current-style-name"/>
-                        <xsl:with-param name="parent-style-name"            select="$parent-style-name"/>
-                    </xsl:call-template>
-                </xsl:variable>
-                <!--*** End CONDITION: the last style parent has already been executed ***-->
-                <xsl:variable name="new-parent-style-name"  select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/@style:parent-style-name"/>
-                <xsl:choose>
-                    <xsl:when test="string-length($new-parent-style-name)=0">
-                    <!--** no further parent is found, the given parameter property-node is the final style -->
-                        <xsl:value-of select="concat($complete-property-list,$new-property-attributes)"/>
-                    </xsl:when>
-                    <xsl:otherwise>
-                    <!--** further attributes of the parent style must be collected **  -->
-                        <xsl:call-template name="add-parent-style-attributes">
-                            <xsl:with-param name="property-name-list"       select="concat($property-name-list, $new-property-names)"/>
-                            <xsl:with-param name="complete-property-list"   select="concat($complete-property-list,$new-property-attributes)"/>
-                            <xsl:with-param name="current-style-name"       select="$parent-style-name"/>
-                            <xsl:with-param name="parent-style-name"        select="$new-parent-style-name"/>
-                            <xsl:with-param name="style-family"             select="$style-family"/>
-                        </xsl:call-template>
-                    </xsl:otherwise>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <xsl:template name="get-new-style-names">
-        <xsl:param name="property-name-list"/>
-        <xsl:param name="parent-style-name"/>
-        <xsl:param name="current-style-name"/>
-        <!--** where to find the specific style (defined by name and family) wheter in office:automatic-styles or office:styles section -->
-        <xsl:choose>
-            <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
-            <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
-                <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
-
-                <xsl:variable name="new-property-name-list">
-                    <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
-                        <xsl:value-of select="name()"/>
-                    </xsl:for-each>
-                </xsl:variable>
-                <xsl:value-of select="$new-property-name-list"/>
-            </xsl:when>
-            <!--** the specific style (defined by name and family) should be found in the office:styles section -->
-            <xsl:otherwise>
-                <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
-                <xsl:variable name="new-property-name-list">
-                    <xsl:for-each select="$parent-property-node/@*[not(contains($property-name-list, name()))]">
-                        <xsl:value-of select="name()"/>
-                    </xsl:for-each>
-                </xsl:variable>
-                <xsl:value-of select="$new-property-name-list"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <xsl:template name="get-new-style-attributes">
-        <xsl:param name="new-property-names"/>
-        <xsl:param name="current-style-name"/>
-        <xsl:param name="parent-style-name"/>
-
-        <!--** where to find the specific style (defined by name and family) whether in office:automatic-styles or office:styles section -->
-        <xsl:choose>
-            <!--** if the specific style (defined by name and family) can be found in the office:automatic-styles section -->
-            <xsl:when test="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]">
-                <xsl:variable name="parent-property-node" select="$office:automatic-styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
-                <xsl:variable name="new-property-name-list">
-                    <xsl:call-template name="write-style-properties">
-                        <xsl:with-param name="styleAttributePath"   select="$parent-property-node/@*[contains($new-property-names, name())]"/>
-                    </xsl:call-template>
-                </xsl:variable>
-                <xsl:value-of select="normalize-space($new-property-name-list)"/>
-            </xsl:when>
-            <!--** otherwise the specific style (defined by name and family) should be found in the office:styles section -->
-            <xsl:otherwise>
-                <xsl:variable name="parent-property-node" select="$office:styles/style:style[@style:family='paragraph' and @style:name=$parent-style-name]/style:properties"/>
-                <xsl:variable name="new-property-name-list">
-                    <xsl:call-template name="write-style-properties">
-                        <xsl:with-param name="styleAttributePath"   select="$parent-property-node/@*[contains($new-property-names, name())]"/>
-                    </xsl:call-template>
-                </xsl:variable>
-                <xsl:value-of select="normalize-space($new-property-name-list)"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/style_mapping.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/style_mapping.xsl
deleted file mode 100644 (file)
index a9a858d..0000000
+++ /dev/null
@@ -1,660 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-    <xsl:template name="write-style-properties">
-        <xsl:param name="styleAttributePath"/>
-
-        <xsl:choose>
-            <!--+++++ CSS PROPERTIES  +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER' or $outputType = 'CSS_INLINED'">
-
-                <xsl:for-each select="$styleAttributePath">
-                <!-- isDebugModeMESSAGE:
-                    <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message>      -->
-
-
-                    <!-- <!ATTLIST style:properties style:horizontal-pos (from-left|left|center|right|from-inside|inside|outside)#IMPLIED>-->
-                    <!-- 2DO: is inside/from-inside also better showable ? -->
-                    <!-- !!!! 2DO: Still there have to be placed a <br clear='all'/> to disable the flow!!!!-->
-                    <!--           The OOo attribute 'style:number-wrapped-paragraphs' is currently ignored -->
-                    <xsl:choose>
-                        <xsl:when test='name(.)="style:wrap"'>
-                            <xsl:choose>
-                                <xsl:when test='.="left"'>
-                                    <xsl:text>float: right; </xsl:text>
-                                </xsl:when>
-                                <xsl:when test='.="right"'>
-                                    <xsl:text>float: left; </xsl:text>
-                                </xsl:when>
-                            </xsl:choose>
-                        </xsl:when>
-
-                        <xsl:when test='name(.) = "style:horizontal-pos"'>
-                            <xsl:choose>
-                                <xsl:when test='.="left"'>
-                                    <xsl:text>align: left; </xsl:text>
-                                </xsl:when>
-                                <xsl:when test='.="right"'>
-                                    <xsl:text>align: right; </xsl:text>
-                                </xsl:when>
-                                <xsl:when test='.="center"'>
-                                    <xsl:text>align: center; </xsl:text>
-                                </xsl:when>
-                            </xsl:choose>
-                        </xsl:when>
-<!-- results into a bad view (overlapped) in Mozilla 1.0
-                        <xsl:when test='name(.) = "table:align"'>
-                            <xsl:choose>
-                                <xsl:when test='.="left"'>
-                                    <xsl:text>float: right; </xsl:text>
-                                </xsl:when>
-                                <xsl:when test='.="right"'>
-                                    <xsl:text>float: left; </xsl:text>
-                                </xsl:when>
-                            </xsl:choose>
-                        </xsl:when>
--->
-
-                        <!-- PADDING for all variations: fo:padding, fo:padding-top, fo:padding-bottom, fo:padding-left, fo:padding-right -->
-                        <xsl:when test='contains(name(.),"fo:padding")'>
-                            <xsl:text>padding: </xsl:text>
-                            <xsl:value-of select="."/>
-                            <xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <!--
-                        fo:border
-                        fo:border-top
-                        fo:border-bottom
-                        fo:border-left
-                        fo:border-right
-
-                            At present, all four borders must be set simultaneously by using either
-                            the fo:border property or by attaching all four of the other border
-                            properties to an item set element. In the latter case, if one or more
-                            of the properties is missing their values are assumed to be none. The
-                            only border styles supported are none or hidden, solid, and double. Any
-                            other border style specified is displayed as solid. Transparent borders
-                            are not supported and the border widths thin, medium, and thick are
-                            mapped to lengths. In addition, only some distinct border widths are
-                            supported. Unsupported widths are rounded up to the next supported
-                            width.
-                            If there are no padding properties specified within the same
-                            item set element, a default padding is used for sides that have a
-                            border. A value of 0cm is used for sides without a border.
-                            (cp. wd-so-xml-text.sdw)
-                        -->
-
-<!--2DO START: change measurement equally -->
-                        <xsl:when test='name(.)="fo:border"'>
-                            <xsl:choose>
-                                <!-- changing the distance measure: inch to in -->
-                                <xsl:when test="contains(., 'ch')">
-                                    <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,'ch ')"/><xsl:text>; </xsl:text>
-                                    <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
-                                    <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'ch '), ' ')"/><xsl:text>; </xsl:text>
-                                </xsl:when>
-                                <xsl:when test="contains(., 'cm')">
-                                    <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
-                                    <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
-                                    <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'cm '), ' ')"/><xsl:text>; </xsl:text>
-                                </xsl:when>
-                                <xsl:when test="contains(., 'pt')">
-                                    <xsl:text>border-width:</xsl:text><xsl:value-of select="substring-before(.,' ')"/><xsl:text>; </xsl:text>
-                                    <xsl:text>border-style:</xsl:text><xsl:value-of select="substring-before(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
-                                    <xsl:text>border-color:</xsl:text><xsl:value-of select="substring-after(substring-after(.,'pt '), ' ')"/><xsl:text>; </xsl:text>
-                                </xsl:when>
-                            </xsl:choose>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:border-top"'>
-                            <xsl:text>border-top: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:border-bottom"'>
-                            <xsl:text>border-bottom: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:border-left"'>
-                            <xsl:text>border-left: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:border-right"'>
-                            <xsl:text>border-right: </xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:column-width"'>
-                            <xsl:choose>
-                                <!-- changing the distance measure: inch to in -->
-                                <xsl:when test="contains(., 'ch')">
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:row-height"'>
-                            <xsl:choose>
-                                <!-- changing the distance measure: inch to in -->
-                                <xsl:when test="contains(., 'ch')">
-                                    <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:width"'>
-                            <xsl:choose>
-                                <!-- changing the distance measure: inch to in -->
-                                <xsl:when test="contains(., 'ch')">
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>; </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-<!--2DO END: change measurement equally -->
-                        <xsl:when test='name(.)="fo:font-style"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:font-name"'>
-                            <xsl:text>font-family:</xsl:text>
-                                <xsl:variable name="content" select="."/>
-                                <xsl:value-of select="$office:font-decls/style:font-decl[@style:name=$content]/@fo:font-family"/>
-                            <xsl:text>; </xsl:text>
-                            <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Italic')">
-                                <xsl:text>font-style:italic; </xsl:text>
-                            </xsl:if>
-                            <xsl:if test="contains($office:font-decls/style:font-decl[@style:name=$content]/@style:font-style-name, 'Bold')">
-                                <xsl:text>font-weight:bold; </xsl:text>
-                            </xsl:if>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:font-weight"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:font-size"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:font-family"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:color"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:margin-left"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:margin-right"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:margin-top"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:margin-bottom"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:line-height"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:text-align"'>
-                            <!-- IMPORTANT is necessary as table cell value alignment is decided by runtime over the valuetype
-                                 Otherwise a table cell style-class will ALWAYS be overwritten by the run-time value -->
-                             <xsl:choose>
-                                <xsl:when test="contains(., 'start')">
-                                    <xsl:text>text-align:left ! important; </xsl:text>
-                                </xsl:when>
-                                <xsl:when test="contains(., 'end')">
-                                    <xsl:text>text-align:right ! important; </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>text-align:</xsl:text><xsl:value-of select='.'/><xsl:text> ! important; </xsl:text>
-                                </xsl:otherwise>
-                             </xsl:choose>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:text-indent"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:text-background-color"'>
-                            <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="fo:background-color"'>
-                            <xsl:text>background-color:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:background-image"'>
-                            <xsl:text>background-image:url(</xsl:text><xsl:value-of select="@xlink:href"/><xsl:text>); </xsl:text>
-                            <xsl:choose>
-                                <xsl:when test="@style:repeat = 'repeat'">
-                                    <xsl:text>background-repeat:repeat; </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>background-repeat:no-repeat; </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-                        <!-- text-shadow is a CSS2 feature and yet not common used in user-agents -->
-                        <xsl:when test='name(.)="fo:text-shadow"'>
-                            <xsl:value-of select="substring-after(name(.), ':')"/><xsl:text>:</xsl:text><xsl:value-of select="."/><xsl:text>; </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:text-crossing-out"'>
-                            <xsl:if test='not(.="none")'>
-                                <xsl:text>text-decoration:line-through; </xsl:text>
-                            </xsl:if>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:text-underline"'>
-                            <xsl:if test='not(.="none")'>
-                                <xsl:text>text-decoration:underline; </xsl:text>
-                            </xsl:if>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:text-position"'>
-                            <xsl:if test='contains(., "sub")'>
-                                <xsl:text>vertical-align:sub; </xsl:text>
-                            </xsl:if>
-                            <xsl:if test='contains(., "sup")'>
-                                <xsl:text>vertical-align:sup; </xsl:text>
-                            </xsl:if>
-                        </xsl:when>
-                        <!-- isDebugModeMESSAGE:
-                        <xsl:otherwise>
-                                <xsl:message>No transformation implemented for attribute-typ <xsl:value-of select="name(.)"/></xsl:message>
-                        </xsl:otherwise>-->
-                    </xsl:choose>
-                </xsl:for-each>
-            </xsl:when>
-            <!--+++++ PALM 3.2 SUBSET AND WAP PROPERTIES  +++++-->
-            <xsl:otherwise>
-                <xsl:for-each select="$styleAttributePath">
-                    <!-- isDebugModeMESSAGE:
-                    <xsl:message> Name:<xsl:value-of select="name()"/> Value:<xsl:value-of select="."/></xsl:message>      -->
-
-                    <!-- BUG WORK AROUND:
-                    Due to a bug in the XT Processor, it is not possible to create serveral elements in variable and search over them,
-                    after explicit conversion to nodeset
-                    This generated sting identifier shall be later changed back to a set of elements
-                    -->
-                    <xsl:choose>
-                        <!--*** FORMAT ATTRIBUTES ***-->
-
-                        <!-- Italic -->
-                        <xsl:when test='name(.)="fo:font-style"'>
-                            <xsl:if test="contains(., 'italic') or contains(., 'oblique')">
-                                <xsl:text>italic, </xsl:text>
-                            </xsl:if>
-                        </xsl:when>
-
-                        <!-- Boldface -->
-                        <xsl:when test='name(.)="fo:font-weight"'>
-                            <xsl:if test="contains(., 'bold') or contains(., 'bolder')">
-                                <xsl:text>bold, </xsl:text>
-                            </xsl:if>
-                        </xsl:when>
-
-                        <!-- Underline -->
-                        <xsl:when test='name(.)="style:text-underline"'>
-                            <xsl:text>underline, </xsl:text>
-                        </xsl:when>
-
-                        <!-- Alignment -->
-                        <xsl:when test='name(.)="fo:text-align"'>
-                             <xsl:choose>
-                                <xsl:when test="contains(., 'start')">
-                                    <xsl:text>align:left, </xsl:text>
-                                </xsl:when>
-                                <xsl:when test="contains(., 'end')">
-                                    <xsl:text>align:right, </xsl:text>
-                                </xsl:when>
-                                <xsl:when test="contains(., 'center')">
-                                    <xsl:text>align:center, </xsl:text>
-                                </xsl:when>
-                             </xsl:choose>
-                        </xsl:when>
-
-                        <!-- strikethrough -->
-                        <xsl:when test='name(.)="style:text-crossing-out"'>
-                            <xsl:text>strike, </xsl:text>
-                        </xsl:when>
-
-                        <!-- Font - size (Palm: emulator transformed sizes to available set (e.g. 30 to (probably) 9)-->
-                        <xsl:when test='name(.)="fo:font-size"'>
-                            <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
-                        </xsl:when>
-
-                        <!-- Font - Color (PALM: but mostly only 2 available)
-                            black (#000000)
-                            gray (#808080)(rendered as dark gray)
-                            silver (#C0C0C0)(rendered as light gray)
-                            white (#FFFFFF)-->
-                        <xsl:when test='name(.)="fo:color"'>
-                            <xsl:choose>
-                                <xsl:when test="contains(. , '#FFFFFF') or contains(. , '#ffffff') or contains(. , 'white') or contains(. , 'WHITE')">
-                                    <xsl:text>color:#FFFFFF, </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>color:#000000, </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-
-
-                        <!--*** TABLE ATTRIBUTES ***-->
-                        <xsl:when test='name(.)="fo:font-size"'>
-                            <xsl:text>size:</xsl:text><xsl:value-of select="."/><xsl:text>:size, </xsl:text>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:column-width"'>
-                            <xsl:choose>
-                                <!-- changing the distance measure: inch to in -->
-                                <xsl:when test="contains(., 'ch')">
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width, </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:row-height"'>
-                            <xsl:choose>
-                                <!-- changing the distance measure: inch to in -->
-                                <xsl:when test="contains(., 'ch')">
-                                    <xsl:text>height:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:height; </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>height:</xsl:text><xsl:value-of select="."/><xsl:text>:height; </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-                        <xsl:when test='name(.)="style:width"'> <!--earlier fo:width-->
-                            <xsl:choose>
-                                <!-- changing the distance measure: inch to in -->
-                                <xsl:when test="contains(., 'ch')">
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="substring-before(.,'ch')"/><xsl:text>:width; </xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:text>width:</xsl:text><xsl:value-of select="."/><xsl:text>:width; </xsl:text>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:when>
-                    </xsl:choose>
-                </xsl:for-each>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-<!-- 2DO: NAMING CONVENTION variable are written with '-' instead of case-sensitive writing -->
-
-
-
-    <!-- ***** MEASUREMENT CONVERSIONS *****
-
-     * 1 centimeter = 10 mm
-
-     * 1 inch = 25.4 mm
-        While the English have already seen the light (read: the metric system), the US
-        remains loyal to this medieval system.
-
-     * 1 didot point = 0.376065 mm
-            The didot system originated in France but was used in most of Europe
-
-     * 1 pica point = 0.35146 mm
-            The Pica points system was developed in England and is used in Great-Britain and the US.
-
-     * 1 PostScript point = 0.35277138 mm
-            When Adobe created PostScript, they added their own system of points.
-            There are exactly 72 PostScript points in 1 inch.
-
-     * 1 pixel = 0.26458333.. mm   (by 96 dpi)
-            Most pictures have the 96 dpi resolution, but the dpi variable may vary by stylesheet parameter
-    -->
-
-
-    <!-- changing measure to mm -->
-    <xsl:template name="convert2mm">
-        <xsl:param name="value"/>
-
-        <xsl:param name="centimeter-in-mm"          select="10"/>
-        <xsl:param name="inch-in-mm"                select="25.4"/>
-        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
-        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($value, 'cm')">
-                <xsl:value-of select="round(number(substring-before($value,'cm' )) * $centimeter-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'in')">
-                <xsl:value-of select="round(number(substring-before($value,'in' )) * $inch-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'dpt')">
-                <xsl:value-of select="round(number(substring-before($value,'dpt')) * $didot-point-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'ppt')">
-                <xsl:value-of select="round(number(substring-before($value,'ppt')) * $pica-point-in-mm)"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="$value"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- changing measure to cm -->
-    <xsl:template name="convert2cm">
-        <xsl:param name="value"/>
-
-        <xsl:param name="centimeter-in-mm"          select="10"/>
-        <xsl:param name="inch-in-mm"                select="25.4"/>
-        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
-        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($value, 'mm')">
-                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $centimeter-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'in')">
-                <xsl:value-of select="round(number(substring-before($value, 'in')) div $centimeter-in-mm * $inch-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'dpt')">
-                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $centimeter-in-mm * $didot-point-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'ppt')">
-                <xsl:value-of select="round(number(substring-before($value,'ppt')) div $centimeter-in-mm * $pica-point-in-mm)"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="$value"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-    <!-- changing measure to inch (cp. section comment) -->
-    <xsl:template name="convert2inch">
-        <xsl:param name="value"/>
-
-        <xsl:param name="centimeter-in-mm"          select="10"/>
-        <xsl:param name="inch-in-mm"                select="25.4"/>
-        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
-        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($value, 'mm')">
-                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $inch-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'cm')">
-                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $inch-in-mm * $centimeter-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'dpt')">
-                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $inch-in-mm * $didot-point-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'ppt')">
-                <xsl:value-of select="round(number(substring-before($value,'ppt')) div $inch-in-mm * $pica-point-in-mm)"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="$value"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- changing measure to dpt (cp. section comment) -->
-    <xsl:template name="convert2dpt">
-        <xsl:param name="value"/>
-
-        <xsl:param name="centimeter-in-mm"          select="10"/>
-        <xsl:param name="inch-in-mm"                select="25.4"/>
-        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
-        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($value, 'mm')">
-                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $didot-point-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'cm')">
-                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $didot-point-in-mm * $centimeter-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'in')">
-                <xsl:value-of select="round(number(substring-before($value, 'in')) div $didot-point-in-mm * $inch-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'ppt')">
-                <xsl:value-of select="round(number(substring-before($value,'ppt')) div $didot-point-in-mm * $pica-point-in-mm)"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="$value"/>
-            </xsl:otherwise>
-        </xsl:choose>
-
-    </xsl:template>
-
-
-    <!-- changing measure to ppt (cp. section comment) -->
-    <xsl:template name="convert2ppt">
-        <xsl:param name="value"/>
-
-        <xsl:param name="centimeter-in-mm"          select="10"/>
-        <xsl:param name="inch-in-mm"                select="25.4"/>
-        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
-        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($value, 'mm')">
-                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pica-point-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'cm')">
-                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pica-point-in-mm * $centimeter-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'in')">
-                <xsl:value-of select="round(number(substring-before($value, 'in')) div $pica-point-in-mm * $inch-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'dpt')">
-                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pica-point-in-mm * $didot-point-in-mm)"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="$value"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- changing measure to pixel by via parameter provided dpi (dots per inch) standard factor (cp. section comment) -->
-    <xsl:template name="convert2pixel">
-        <xsl:param name="value"/>
-
-        <xsl:param name="centimeter-in-mm"          select="10"/>
-        <xsl:param name="inch-in-mm"                select="25.4"/>
-        <xsl:param name="didot-point-in-mm"         select="0.376065"/>
-        <xsl:param name="pica-point-in-mm"          select="0.35146"/>
-        <xsl:param name="pixel-in-mm"               select="$inch-in-mm div $dpi"/>
-
-        <xsl:choose>
-            <xsl:when test="contains($value, 'mm')">
-                <xsl:value-of select="round(number(substring-before($value, 'mm')) div $pixel-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'cm')">
-                <xsl:value-of select="round(number(substring-before($value, 'cm')) div $pixel-in-mm * $centimeter-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'in')">
-                <xsl:value-of select="round(number(substring-before($value, 'in')) div $pixel-in-mm * $inch-in-mm)"/>
-            </xsl:when>
-            <xsl:when test="contains($value, 'dpt')">
-                <xsl:value-of select="round(number(substring-before($value,'dpt')) div $pixel-in-mm * $didot-point-in-mm)"/>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:value-of select="$value"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/table.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/table.xsl
deleted file mode 100644 (file)
index 36339ed..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-    <!-- table row handling -->
-    <xsl:include href="table_rows.xsl"/>
-    <!-- table column handling -->
-    <xsl:include href="table_columns.xsl"/>
-    <!-- table cell handling -->
-    <xsl:include href="table_cells.xsl"/>
-
-
-
-    <!-- ******************* -->
-    <!-- *** main table  *** -->
-    <!-- ******************* -->
-
-    <xsl:template match="table:table | table:sub-table">
-        <xsl:param name="collectedGlobalData"/>
-
-        <!-- a table will only be created if the "scenario" is active -->
-        <xsl:if test="string-length(table:scenario/@table:is-active) = 0">
-            <!-- collecting all visible "table:table-row" elements of the table -->
-            <xsl:variable name="allVisibleTableRows" select="table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
-                    |    table:table-header-rows/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]
-                    |    table:table-row-group/descendant::table:table-row[not(@table:visibility = 'collapse' or @table:visibility = 'filter')]"/>
-            <xsl:choose>
-                <!-- for all but WAP/WML devices a table border check is done (cp. "check-for-table-border") -->
-                <xsl:when test="not($outputType = 'WML')">
-
-                    <!-- As the alignment of a table is by 'align' attribut is deprecated and as the CSS 'float' attribute not well displayed,
-                         we do a little trick by encapsulating the table with a aligned 'div' element-->
-                    <xsl:variable name="table-alignment" select="$office:automatic-styles/style:style[@style:name = current()/@table:style-name]/style:properties/@table:align"/>
-
-                    <xsl:choose>
-                        <xsl:when test="string-length($table-alignment) != 0">
-                            <xsl:element name="div">
-                                <xsl:attribute name="align">
-                                    <xsl:choose>
-                                        <xsl:when test='$table-alignment="left" or $table-alignment="margins"'>
-                                                <xsl:text>left</xsl:text>
-                                        </xsl:when>
-                                        <xsl:when test='$table-alignment="right"'>
-                                            <xsl:text>right</xsl:text>
-                                        </xsl:when>
-                                        <xsl:when test='$table-alignment="center"'>
-                                            <xsl:text>center</xsl:text>
-                                        </xsl:when>
-                                    </xsl:choose>
-                                </xsl:attribute>
-                                <xsl:element name="table">
-
-                                    <xsl:apply-templates select="@table:style-name">
-                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    </xsl:apply-templates>
-
-                                    <!-- workaround, set table border attribut if any cell-border exists
-                                    <xsl:call-template name="check-for-table-border">
-                                        <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
-                                    </xsl:call-template> -->
-                                    <xsl:call-template name="create-column-style-variable">
-                                        <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
-                                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                    </xsl:call-template>
-                                </xsl:element>
-                            </xsl:element>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:element name="table">
-                                <xsl:apply-templates select="@table:style-name">
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:apply-templates>
-
-                                <!-- workaround, set table border attribut if any cell-border exists
-                                <xsl:call-template name="check-for-table-border">
-                                    <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
-                                </xsl:call-template>  -->
-                                <xsl:call-template name="create-column-style-variable">
-                                    <xsl:with-param name="allVisibleTableRows" select="$allVisibleTableRows"/>
-                                     <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:call-template>
-                            </xsl:element>
-                        </xsl:otherwise>
-                    </xsl:choose>
-
-                </xsl:when>
-                <xsl:otherwise>
-                <!-- for WML devices only ASCII table are written as tables are not implemented widley.
-                     Beginning from 'repeat-write-row' the templates are handled by the table_wml.xsl stylesheet -->
-                    <xsl:call-template name="create-column-style-variable">
-                        <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
-                        <xsl:with-param name="allVisibleTableRows"  select="$allVisibleTableRows"/>
-                    </xsl:call-template>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:if>
-    </xsl:template>
-
-
-
-    <xsl:template name="create-column-style-variable">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allVisibleTableRows"/>
-
-        <!-- all columns of the table -->
-        <xsl:variable name="allTableColumns" select="table:table-column |
-                                                     table:table-column-group/descendant::table:table-column |
-                                                     table:table-header-columns/descendant::table:table-column"/>
-        <!-- allColumnStyleEntries: Containing all columns of the table, hidden and viewed.
-            - if a column is hidden, it contains the hidden attribute, otherwise the style-properties will be stored
-            - if a column is being repeated, each repeated column is explicitly written as entry in this variable.
-              Later (during template "write-cell") the style of the column will be mixed with the cell-style by using
-              the position() of the column entry and comparing it with the iterating cell number. -->
-        <xsl:variable name="allColumnStyleEntries-RTF">
-            <xsl:call-template name="adding-column-styles-entries">
-                <xsl:with-param name="collectedGlobalData"   select="$collectedGlobalData"/>
-                <xsl:with-param name="allTableColumns"      select="$allTableColumns"/>
-            </xsl:call-template>
-        </xsl:variable>
-
-        <xsl:choose>
-            <xsl:when test="function-available('xt:node-set')">
-                <xsl:call-template name="create-table">
-                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                    <xsl:with-param name="allVisibleTableRows"      select="$allVisibleTableRows"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="xt:node-set($allColumnStyleEntries-RTF)"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="function-available('xalan:nodeset')">
-                <xsl:call-template name="create-table">
-                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                    <xsl:with-param name="allVisibleTableRows"      select="$allVisibleTableRows"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="xalan:nodeset($allColumnStyleEntries-RTF)"/>
-                </xsl:call-template>
-            </xsl:when>
-        </xsl:choose>
-
-    </xsl:template>
-
-
-
-    <xsl:template name="create-table">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allVisibleTableRows"/>
-        <xsl:param name="allColumnStyleEntries"/>
-
-
-        <!-- Some Office Calc documents simulate a background by repeating the last cell until end of space
-             (The value of "table:number-columns-repeated" is enourmous). Writing out all these cells would be fatal.
-             Therefore, this global variable shows us the longest row with content.
-
-        Earlier only the viewable columns were listed, but it is easier to handle with all columns:
-        <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry[not(@column-hidden-flag)])"/> -->
-        <xsl:variable name="maxRowLength" select="count($allColumnStyleEntries/column-style-entry)"/>
-
-
-        <!--isDebugMode-START-->
-        <xsl:if test="$isDebugMode">
-            <xsl:message>maxRowLength: <xsl:value-of select="$maxRowLength"/></xsl:message>
-            <xsl:variable name="numberOfHiddenColumns" select="count($allColumnStyleEntries/column-style-entry[@column-hidden-flag])"/>
-            <xsl:message>numberOfHiddenColumns: <xsl:value-of select="$numberOfHiddenColumns"/></xsl:message>
-            <xsl:call-template name="table-debug-allColumnStyleEntries">
-                <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
-            </xsl:call-template>
-        </xsl:if>
-        <!--isDebugMode-END-->
-        <xsl:choose>
-            <xsl:when test="$outputType = 'WML'">
-                <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
-                     (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
-                     2DO:CHECK WITH XALAN-->
-                <xsl:for-each select="$allVisibleTableRows">
-                    <xsl:call-template name="wml-repeat-write-row">
-                        <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                        <xsl:with-param name="number-rows-repeated"     select="@table:number-rows-repeated"/>
-                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                    </xsl:call-template>
-                </xsl:for-each>
-            </xsl:when>
-            <xsl:otherwise>
-                <!-- matching all rows - we can not use xsl:apply-template with a node-set parameter as by a bug in XT (James Clark)
-                     (here: allColumnStyleEntries) will be interpreted as a result tree fragment, where no search expression (XPath) can be used
-                     2DO:CHECK WITH XALAN -->
-                <xsl:for-each select="$allVisibleTableRows">
-                    <xsl:call-template name="repeat-write-row">
-                        <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                        <xsl:with-param name="number-rows-repeated"     select="@table:number-rows-repeated"/>
-                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                    </xsl:call-template>
-                </xsl:for-each>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-
-
-    <!-- **************************** -->
-    <!-- *** HELPER: table border *** -->
-    <!-- **************************** -->
-
-    <!-- only one table border for HTML4 or CSS devices which contain one or more 'fo:border-top' attributes (pars pro toto, if one exist the other usually exist, too) -->
-    <!-- this was a work-around for the netscape 4.xx but not longer necessary for Mozilla -->
-    <xsl:template name="check-for-table-border">
-        <xsl:param name="allVisibleTableRows"/>
-
-        <xsl:variable name="startTime">
-            <xsl:if test="$isDebugMode and not($isJavaDisabled)">
-                <xsl:choose>
-                    <xsl:when test="function-available('system:current-time-millis')">
-                        <xsl:value-of select="system:current-time-millis()"/>
-                    </xsl:when>
-                    <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
-                        <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
-                    </xsl:when>
-                </xsl:choose>
-            </xsl:if>
-        </xsl:variable>
-
-        <!-- checks if one cell (table:table-cell) of the rows of this table (allVisibleTableRows) contains a border style (i.e. fo:border-top)
-             If only one single border element exist, the whole table will gets pre-defined borders (simple heuristic for better browser display) -->
-        <xsl:if test="$allVisibleTableRows/table:table-cell[@table:style-name=/*/*/style:style[style:properties/@fo:border-top]/@style:name]">
-            <xsl:attribute name="border">1</xsl:attribute>
-            <xsl:attribute name="bordercolor">#000000</xsl:attribute>
-            <xsl:attribute name="cellpadding">2</xsl:attribute>
-            <xsl:attribute name="cellspacing">0</xsl:attribute>
-            <xsl:attribute name="page-break-inside">page-break-inside:avoid</xsl:attribute>
-        </xsl:if>
-
-
-        <!-- check the time for borderchecking (debug)-->
-        <xsl:if test="$isDebugMode and not($isJavaDisabled)">
-            <xsl:variable name="endTime">
-                <xsl:choose>
-                    <xsl:when test="function-available('system:current-time-millis')">
-                        <xsl:value-of select="system:current-time-millis()"/>
-                    </xsl:when>
-                    <xsl:when test="function-available('java:java.lang.System.currentTimeMillis')">
-                        <xsl:value-of select="java:java.lang.System.currentTimeMillis()"/>
-                    </xsl:when>
-                </xsl:choose>
-            </xsl:variable>
-            <xsl:message>Time for checking BorderStyle: <xsl:value-of select="($endTime - $startTime)"/> ms</xsl:message>
-        </xsl:if>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/table_cells.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/table_cells.xsl
deleted file mode 100644 (file)
index 4671ea9..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-    <!-- *********************************** -->
-    <!-- *** write repeating table cells *** -->
-    <!-- *********************************** -->
-
-
-    <!-- matching cells to give out -> covered table cells are not written out -->
-    <xsl:template match="table:table-cell">
-        <xsl:param name="collectedGlobalData"/>
-        <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="maxRowLength"/>
-
-        <xsl:if test="$isDebugMode">
-            <xsl:message>
---------------> table:table-cell has been entered with node value: <xsl:value-of select="."/></xsl:message>
-            <xsl:message>table:number-columns-repeated: -<xsl:value-of select="@table:number-columns-repeated"/>-</xsl:message>
-        </xsl:if>
-
-        <xsl:call-template name="create-column-position-variable">
-            <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
-            <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-            <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-            <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-        </xsl:call-template>
-
-    </xsl:template>
-
-
-
-    <xsl:template name="create-column-position-variable">
-        <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="maxRowLength"/>
-
-        <!-- column position needed for styles, esp. for column-hidden-flag -->
-        <xsl:variable name="preceding-columns">
-            <xsl:for-each select="preceding-sibling::*">
-                <xsl:element name="quantity">
-                    <xsl:choose>
-                        <xsl:when test="string-length(@table:number-columns-repeated) = 0">1</xsl:when>
-                        <xsl:otherwise><xsl:value-of select="@table:number-columns-repeated"/></xsl:otherwise>
-                    </xsl:choose>
-                </xsl:element>
-            </xsl:for-each>
-        </xsl:variable>
-
-        <xsl:choose>
-            <xsl:when test="function-available('xt:node-set')">
-                <xsl:call-template name="create-table-cell">
-                    <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                    <xsl:with-param name="column-position"          select="sum(xt:node-set($preceding-columns)/quantity) + 1"/>
-                    <xsl:with-param name="collectedGlobalData"      select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:when test="function-available('xalan:nodeset')">
-                <xsl:call-template name="create-table-cell">
-                    <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                    <xsl:with-param name="column-position"          select="sum(xalan:nodeset($preceding-columns)/quantity) + 1"/>
-                    <xsl:with-param name="collectedGlobalData"      select="$collectedGlobalData"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:otherwise>
-                <xsl:element name="NodeSetFunctionNotAvailable"/>
-                <xsl:call-template name="create-table-cell"/>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <xsl:template name="create-table-cell">
-        <!-- position of the current input cell to get the correct colum style (hidden are also counted)-->
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="maxRowLength"/>
-        <xsl:param name="column-position"/>
-
-
-        <xsl:if test="$isDebugMode">
-            <xsl:message>NEW VALUE: column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
-        </xsl:if>
-
-
-        <!-- a hidden column will give out nothing -->
-        <xsl:if test="not($allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag)">
-            <xsl:choose>
-                <!-- when the columns are not repeated the next column-positions raises up to 1, otherwise up to the amount of repeated columns -->
-                <xsl:when test="@table:number-columns-repeated">
-                    <!-- writes multiple entries of a cell -->
-                    <xsl:call-template name="repeat-write-cell">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                        <xsl:with-param name="column-position"          select="$column-position"/>
-                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                        <xsl:with-param name="number-columns-repeated"  select="@table:number-columns-repeated"/>
-                    </xsl:call-template>
-                </xsl:when>
-                <xsl:otherwise>
-                    <!-- writes an entry of a cell -->
-                    <xsl:call-template name="write-cell">
-                        <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                        <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                        <xsl:with-param name="column-position"          select="$column-position"/>
-                        <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                    </xsl:call-template>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:if>
-
-    </xsl:template>
-
-
-
-    <xsl:template name="repeat-write-cell">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="column-position"/>
-        <xsl:param name="maxRowLength"/>
-        <xsl:param name="number-columns-repeated"/>
-
-        <xsl:choose>
-            <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
-            <xsl:when test="$number-columns-repeated > 1 and $maxRowLength > $column-position">
-
-                <xsl:if test="$isDebugMode">
-                    <xsl:message>+++++++++ starting cell writing +++++++++</xsl:message>
-                    <xsl:message>number-columns-repeated: -<xsl:value-of select="$number-columns-repeated"/>-</xsl:message>
-                    <xsl:message>maxRowLength: -<xsl:value-of select="$maxRowLength"/>-</xsl:message>
-                    <xsl:message>column-position: -<xsl:value-of select="$column-position"/>-</xsl:message>
-                </xsl:if>
-
-                <!-- writes an entry of a cell -->
-                <xsl:call-template name="write-cell">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="column-position"          select="$column-position"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                </xsl:call-template>
-                <!-- repeat calling this method until all elements written out -->
-                <xsl:if test="$isDebugMode">
-                    <xsl:message>+++++++++ cell repetition +++++++++</xsl:message>
-                </xsl:if>
-                <xsl:call-template name="repeat-write-cell">
-                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="column-position"          select="$column-position + 1"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                    <xsl:with-param name="number-columns-repeated"  select="$number-columns-repeated - 1"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:otherwise>
-                <!-- 2DO: This is the current workaround against the background simulation by an 'endless' repeating cell -->
-                <!--      When the maxRowLength is reached a last entry of a cell is written -->
-                <xsl:call-template name="write-cell">
-                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="column-position"          select="$column-position"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <xsl:template name="write-cell">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="column-position"/>
-        <xsl:param name="maxRowLength"/>
-
-
-        <xsl:if test="$isDebugMode">
-            <xsl:message>WriteTest -> If nothing between '-' write cell -<xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag"/>-</xsl:message>
-        </xsl:if>
-
-            <xsl:if test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
-                <xsl:if test="$isDebugMode">
-                    <xsl:message>TABLE COLUMN is hidden!</xsl:message>
-                </xsl:if>
-            </xsl:if>
-
-        <xsl:choose>
-            <!-- a hidden column will give out nothing -->
-            <xsl:when test="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@column-hidden-flag">
-                <xsl:if test="$isDebugMode">
-                    <xsl:message>TABLE COLUMN is hidden!</xsl:message>
-                </xsl:if>
-            </xsl:when>
-
-            <!-- NOT a hidden column -->
-            <xsl:otherwise>
-
-                <!-- a table is a table header, when it has a "table:table-header-rows" ancestor -->
-                <xsl:variable name="tableDataType">
-                    <xsl:choose>
-                        <xsl:when test="ancestor::table:table-header-rows">
-                            <xsl:text>th</xsl:text>
-                        </xsl:when>
-                        <xsl:otherwise>
-                            <xsl:text>td</xsl:text>
-                        </xsl:otherwise>
-                    </xsl:choose>
-                </xsl:variable>
-
-                <xsl:choose>
-                    <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-                    <xsl:when test="$outputType = 'CSS_HEADER'">
-                        <xsl:element name="{$tableDataType}">
-
-                            <xsl:if test="$isDebugMode">
-                                <xsl:message>
-*****************************************'<xsl:value-of select="$tableDataType"/>' element has been added!</xsl:message>
-                            </xsl:if>
-
-                            <xsl:if test="@table:number-columns-spanned">
-                                <xsl:attribute name="colspan">
-                                    <xsl:value-of select="@table:number-columns-spanned"/>
-                                </xsl:attribute>
-                            </xsl:if>
-                            <xsl:if test="@table:number-rows-spanned">
-                                <xsl:attribute name="rowspan">
-                                    <xsl:value-of select="@table:number-rows-spanned"/>
-                                </xsl:attribute>
-                            </xsl:if>
-
-
-
-                            <!-- *** the cell-style *** -->
-                            <!-- The cell style has no conclusion with the column style, so we switch the order/priorities due to browser issues
-
-                                The cell-style depends on two attributes:
-
-                                1) table:style-name - the style properties of cell. When they exist, a default alignement (cp. below) will be added for the
-                                                      case of no alignment in the style exist.
-
-                                2) table:value-type - the value type of the table-cell giving the default alignments.
-                                                      By default a string value is left aligned, all other are aligned:right.
-                            -->
-                            <xsl:choose>
-                                <xsl:when test="@table:style-name">
-                                    <xsl:attribute name="style">
-
-                                        <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
-                                        <xsl:variable name="cellStyle" select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
-                                        <xsl:choose>
-                                            <xsl:when test="string-length($cellStyle) > 0 and not(contains($cellStyle, 'text-align'))">
-                                                <!-- CELL-STYLE: alignment by table:value-type -->
-                                                <!-- no alignment in the cell style, the alignment based on the table:value-type will be added -->
-                                                <xsl:choose>
-                                                    <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
-                                                        <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:right; ')"/>
-                                                    </xsl:when>
-                                                    <xsl:otherwise>
-                                                        <xsl:value-of select="concat($collectedGlobalData/allstyles/*[name()=current()/@table:style-name], 'text-align:left; ')"/>
-                                                    </xsl:otherwise>
-                                                </xsl:choose>
-                                            </xsl:when>
-                                            <xsl:otherwise>
-                                                <!-- CELL-STYLE: alignment by table:value-type -->
-                                                <!-- no CSS style properties exist, only alignment from the table:value-type will be used -->
-                                                <xsl:choose>
-                                                    <xsl:when test="@table:value-type and not(@table:value-type = 'string')">text-align:right; </xsl:when>
-                                                    <xsl:otherwise>text-align:left; </xsl:otherwise>
-                                                </xsl:choose>
-                                            </xsl:otherwise>
-                                        </xsl:choose>
-
-                                         <!-- column-style (disjunct of cell style -->
-                                         <!-- 2DO: only absolut styles are supported, relative styles (i.e. 'style:rel-column-width' e.g. with value "8933*" are ignored.
-                                              Issue: browsers (not sure if CSS) does not support the '*' relationship, only the '%', where the sum is always '100'!
-                                              For this, it is easier to work on with the absolute values, instead of calculating the values for 100% -->
-                                         <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
-                                    </xsl:attribute>
-                                    <!-- CELL-STYLE: table:style-name -->
-                                    <xsl:attribute name="class">
-                                        <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
-                                    </xsl:attribute>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <xsl:attribute name="style">
-                                        <!-- CELL-STYLE: alignment by table:value-type (without existing table:style-name)-->
-                                        <!-- no table:style-name exist, only alignment from the table:value-type will be used -->
-                                        <xsl:choose>
-                                            <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
-                                                text-align:right;
-                                            </xsl:when>
-                                            <xsl:otherwise>
-                                                text-align:left;
-                                            </xsl:otherwise>
-                                        </xsl:choose>
-                                    </xsl:attribute>
-                                </xsl:otherwise>
-                            </xsl:choose>
-
-                            <xsl:choose>
-                                <!-- In case of no cell content a non-breakable space will be inserted
-                                     to make the browser show the table-cell grid -->
-                                <xsl:when test="not(child::text()) and not(child::*)">
-                                    <xsl:text> &#160;</xsl:text>
-                                </xsl:when>
-                                <xsl:otherwise>
-                                    <!-- *** the column-style *** -->
-                                    <!--  the column style has no conclusion with the cell style, so we switch the order/priorities due to browser issues-->
-                                    <xsl:element name="span">
-                                        <xsl:attribute name="class">
-                                            <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position() = $column-position]/@style-name"/>
-                                        </xsl:attribute>
-                                        <xsl:apply-templates>
-                                            <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                        </xsl:apply-templates>
-                                    </xsl:element>
-                                </xsl:otherwise>
-                            </xsl:choose>
-                        </xsl:element>
-                    </xsl:when>
-
-                    <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-                    <xsl:when test="$outputType = 'CSS_INLINED'">
-                        <xsl:element name="{$tableDataType}">
-
-                            <xsl:if test="@table:number-columns-spanned">
-                                <xsl:attribute name="colspan">
-                                    <xsl:value-of select="@table:number-columns-spanned"/>
-                                </xsl:attribute>
-                            </xsl:if>
-                            <xsl:if test="@table:number-rows-spanned">
-                                <xsl:attribute name="rowspan">
-                                    <xsl:value-of select="@table:number-rows-spanned"/>
-                                </xsl:attribute>
-                            </xsl:if>
-
-                            <xsl:attribute name="style">
-                                <!-- cell-style -->
-                                <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
-                                <!-- column-style -->
-                                <xsl:value-of select="$allColumnStyleEntries/column-style-entry[position()=$column-position]"/>
-                                <!-- TABLE:VALUE-TYPE - the value of a table-cell will be aligned left by default only exlicit non-string is aligned:right-->
-                                <xsl:choose>
-                                    <xsl:when test="@table:value-type and not(@table:value-type = 'string')">
-                                        <xsl:text>text-align:right;</xsl:text>
-                                    </xsl:when>
-                                    <xsl:otherwise>
-                                        <xsl:text>text-align:left;</xsl:text>
-                                    </xsl:otherwise>
-                                </xsl:choose>
-                            </xsl:attribute>
-
-                            <!-- &#160 is a non-breakable space, necessary to make to the browser show the table-cell grid -->
-                            <xsl:if test="not(child::text()) and not(child::*)"> &#160;</xsl:if>
-                            <xsl:apply-templates>
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:apply-templates>
-                        </xsl:element>
-                    </xsl:when>
-                    <!--+++++ PALM INLINED WAY  +++++-->
-                    <xsl:when test="$outputType = 'PALM'">
-                        <xsl:element name="{$tableDataType}">
-                            <xsl:if test="@table:number-columns-spanned">
-                                <xsl:attribute name="colspan">
-                                    <xsl:value-of select="@table:number-columns-spanned"/>
-                                </xsl:attribute>
-                            </xsl:if>
-
-                            <xsl:if test="@table:number-rows-spanned">
-                                <xsl:attribute name="rowspan">
-                                    <xsl:value-of select="@table:number-rows-spanned"/>
-                                </xsl:attribute>
-                            </xsl:if>
-                            <xsl:apply-templates>
-                                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                            </xsl:apply-templates>
-                        </xsl:element>
-                    </xsl:when>
-                    <!--+++++ WML WAY  +++++-->
-                    <xsl:when test="$outputType = 'WML'">
-                        <xsl:choose>
-                            <xsl:when test="not($allColumnStyleEntries/column-style-entry[last() = $column-position])">
-                                <xsl:apply-templates>
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:apply-templates>
-                                <xsl:text>, </xsl:text>
-                            </xsl:when>
-                            <xsl:otherwise>
-                                <xsl:apply-templates>
-                                    <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-                                </xsl:apply-templates>
-                                <xsl:text>; </xsl:text>
-                                <xsl:element name="br"/>
-                            </xsl:otherwise>
-                        </xsl:choose>
-                    </xsl:when>
-                </xsl:choose>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/table_columns.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/table_columns.xsl
deleted file mode 100644 (file)
index a9a907f..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-    <!-- ******************************************** -->
-    <!-- *** Create table columns style variable  *** -->
-    <!-- ******************************************** -->
-
-    <xsl:template name="adding-column-styles-entries">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allTableColumns"/>
-
-        <xsl:for-each select="$allTableColumns">
-
-            <xsl:variable name="column-style-entry" select="$collectedGlobalData/allstyles/*[name() = translate(current()/@table:style-name, '. %()/\', '')]"/>
-            <xsl:choose>
-                <xsl:when test="not(@table:number-columns-repeated)">
-                    <!-- writes an entry of a column in the columns-variable -->
-                    <xsl:call-template name="adding-column-style-entry">
-                        <xsl:with-param name="column-style-entry" select="$column-style-entry"/>
-                    </xsl:call-template>
-                </xsl:when>
-                <!-- No higher repetition of cells greater than 4 for the last and second last column -->
-                <!-- a hack for the sample document 'Waehrungsumrechner.sxc having 230 repeated columns in the second last column -->
-                <!-- ??? <xsl:when test="(position() = last() or (position() = (last() - 1)) and @table:number-columns-repeated &lt; 5)"> ???-->
-                <xsl:when test="position() = last() or position() = (last() - 1)">
-                    <xsl:if test="@table:number-columns-repeated &lt; 5">
-                        <!-- writes an entry of a column in the columns-variable -->
-                        <xsl:call-template name="repeat-adding-column-style-entry">
-                            <xsl:with-param name="column-style-entry"       select="$column-style-entry"/>
-                            <xsl:with-param name="number-columns-repeated"  select="1"/>
-                        </xsl:call-template>
-                    </xsl:if>
-                </xsl:when>
-                <xsl:otherwise>
-                    <!-- repeated colums will be written explicit several times in the variable-->
-                    <xsl:call-template name="repeat-adding-column-style-entry">
-                        <xsl:with-param name="column-style-entry"           select="$column-style-entry"/>
-                        <xsl:with-param name="number-columns-repeated"      select="@table:number-columns-repeated"/>
-                    </xsl:call-template>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:for-each>
-     </xsl:template>
-
-
-    <!-- WRITES THE REPEATED COLUMN STYLE EXPLICIT AS AN ELEMENT IN THE COLUMNS-VARIABLE -->
-    <xsl:template name="repeat-adding-column-style-entry">
-        <xsl:param name="column-style-entry"/>
-        <xsl:param name="number-columns-repeated"/>
-
-        <xsl:choose>
-            <xsl:when test="$number-columns-repeated > 1">
-                <!-- writes an entry of a column in the columns-variable -->
-                <xsl:call-template name="adding-column-style-entry">
-                    <xsl:with-param name="column-style-entry"   select="$column-style-entry"/>
-                </xsl:call-template>
-                <!-- repeat calling this method until all elements written out -->
-                <xsl:call-template name="repeat-adding-column-style-entry">
-                    <xsl:with-param name="column-style-entry"       select="$column-style-entry"/>
-                    <xsl:with-param name="number-columns-repeated"  select="$number-columns-repeated - 1"/>
-                </xsl:call-template>
-            </xsl:when>
-            <xsl:otherwise>
-                <!-- writes an entry of a column in the columns-variable -->
-                <xsl:call-template name="adding-column-style-entry">
-                    <xsl:with-param name="column-style-entry"   select="$column-style-entry"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-    <!-- THE COLUMN-STYLE WRITE-PATTERN FOR EACH COLUMN WRITTEN IN A VARIABLE -->
-    <xsl:template name="adding-column-style-entry">
-        <xsl:param name="column-style-entry"/>
-
-        <xsl:element name="column-style-entry">
-            <xsl:choose>
-                <xsl:when test="@table:visibility = 'collapse' or @table:visibility = 'filter'">
-                    <xsl:attribute name="column-hidden-flag">true</xsl:attribute>
-                </xsl:when>
-                <xsl:otherwise>
-                    <xsl:variable  name="table:style-name"         select="translate(@table:style-name, '. %()/\', '')"/>
-                    <xsl:attribute name="style-name"><xsl:value-of select="$table:style-name"/></xsl:attribute>
-                    <xsl:value-of select="$column-style-entry"/>
-                </xsl:otherwise>
-            </xsl:choose>
-        </xsl:element>
-    </xsl:template>
-
-
-
-    <!--isDebugMode-START-->
-    <!-- giving out the 'allColumnStyle' variable:
-        For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
-        In case of 'column-hidden-flag' attribute the text 'Column is hidden is given out.-->
-    <xsl:template name="table-debug-allColumnStyleEntries">
-        <xsl:param name="allColumnStyleEntries"/>
-
-        <!-- debug output as table summary attribut in html -->
-        <xsl:attribute name="summary">
-            <xsl:call-template name="table-debug-column-out">
-                <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
-            </xsl:call-template>
-        </xsl:attribute>
-        <!-- debug output to console -->
-        <xsl:message>
-            <xsl:call-template name="table-debug-column-out">
-                <xsl:with-param name="allColumnStyleEntries" select="$allColumnStyleEntries"/>
-            </xsl:call-template>
-        </xsl:message>
-    </xsl:template>
-
-
-    <xsl:template name="table-debug-column-out">
-        <xsl:param name="allColumnStyleEntries"/>
-            <xsl:text>
-            DebugInformation: For each 'column-style-entry' of the 'allColumnStyleEntries' variable the style-name is given out.
-                              In case of 'column-hidden-flag' attribute the text 'column is hidden' is given out.
-            </xsl:text>
-                <xsl:for-each select="$allColumnStyleEntries/column-style-entry">
-                <xsl:choose>
-                <xsl:when test="@column-hidden-flag">
-            <xsl:text>  </xsl:text><xsl:value-of select="@style-name"/><xsl:text>column is hidden</xsl:text><xsl:text>
-            </xsl:text>
-                </xsl:when>
-                <xsl:otherwise>
-            <xsl:text>  </xsl:text><xsl:value-of select="@style-name"/><xsl:text> = </xsl:text><xsl:value-of select="."/><xsl:text>
-            </xsl:text>
-                </xsl:otherwise>
-                </xsl:choose>
-                           </xsl:for-each>
-    </xsl:template>
-    <!--isDebugMode-END-->
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/ooo/table_rows.xsl b/framework/Mime/lib/Horde/Mime/Viewer/ooo/table_rows.xsl
deleted file mode 100644 (file)
index 6f7d17d..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-<!--
-
-   The Contents of this file are made available subject to the terms of
-   either of the following licenses
-
-          - GNU Lesser General Public License Version 2.1
-          - Sun Industry Standards Source License Version 1.1
-
-   Sun Microsystems Inc., October, 2000
-
-   GNU Lesser General Public License Version 2.1
-   =============================================
-   Copyright 2000 by Sun Microsystems, Inc.
-   901 San Antonio Road, Palo Alto, CA 94303, USA
-
-   This library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License version 2.1, as published by the Free Software Foundation.
-
-   This library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with this library; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place, Suite 330, Boston,
-   MA  02111-1307  USA
-
-
-   Sun Industry Standards Source License Version 1.1
-   =================================================
-   The contents of this file are subject to the Sun Industry Standards
-   Source License Version 1.1 (the "License"); You may not use this file
-   except in compliance with the License. You may obtain a copy of the
-   License at http://www.openoffice.org/license.html.
-
-   Software provided under this License is provided on an "AS IS" basis,
-   WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING,
-   WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
-   MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
-   See the License for the specific provisions governing your rights and
-   obligations concerning the Software.
-
-   The Initial Developer of the Original Code is: Sun Microsystems, Inc.
-
-   Copyright Â© 2002 by Sun Microsystems, Inc.
-
-   All Rights Reserved.
-
-   Contributor(s): _______________________________________
-
--->
-<xsl:stylesheet version="1.0"
-                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
-                xmlns:office="http://openoffice.org/2000/office"
-                xmlns:style="http://openoffice.org/2000/style"
-                xmlns:text="http://openoffice.org/2000/text"
-                xmlns:table="http://openoffice.org/2000/table"
-                xmlns:draw="http://openoffice.org/2000/drawing"
-                xmlns:fo="http://www.w3.org/1999/XSL/Format"
-                xmlns:xlink="http://www.w3.org/1999/xlink"
-                xmlns:number="http://openoffice.org/2000/datastyle"
-                xmlns:svg="http://www.w3.org/2000/svg"
-                xmlns:chart="http://openoffice.org/2000/chart"
-                xmlns:dr3d="http://openoffice.org/2000/dr3d"
-                xmlns:math="http://www.w3.org/1998/Math/MathML"
-                xmlns:form="http://openoffice.org/2000/form"
-                xmlns:script="http://openoffice.org/2000/script"
-                office:class="text"
-                office:version="1.0"
-                xmlns:dc="http://purl.org/dc/elements/1.1/"
-                xmlns:meta="http://openoffice.org/2000/meta"
-                xmlns:config="http://openoffice.org/2001/config"
-                xmlns:help="http://openoffice.org/2000/help"
-                xmlns:xt="http://www.jclark.com/xt"
-                xmlns:system="http://www.jclark.com/xt/java/java.lang.System"
-                xmlns:xalan="http://xml.apache.org/xalan"
-                xmlns:java="http://xml.apache.org/xslt/java"
-                exclude-result-prefixes="java">
-
-
-
-    <!-- ********************************************* -->
-    <!-- *** write (explicit) repeating table rows *** -->
-    <!-- ********************************************* -->
-
-    <xsl:template name="repeat-write-row">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="number-rows-repeated" select="1"/>
-        <xsl:param name="maxRowLength"/>
-
-        <xsl:choose>
-            <!-- write an entry of a row and repeat calling this method until all elements are written out -->
-            <xsl:when test="$number-rows-repeated > 1 and (table:table-cell/text() or table:table-cell/*)">
-                <xsl:call-template name="write-row">
-                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                </xsl:call-template>
-
-                <!-- 2DO: take variable from the output of repeated write-row and iterate giving out the variable -->
-                <xsl:call-template name="repeat-write-row">
-                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                    <xsl:with-param name="number-rows-repeated"     select="$number-rows-repeated - 1"/>
-                </xsl:call-template>
-            </xsl:when>
-            <!-- write a single entry of a row -->
-            <xsl:otherwise>
-                <xsl:call-template name="write-row">
-                    <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                    <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                    <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-                </xsl:call-template>
-            </xsl:otherwise>
-        </xsl:choose>
-    </xsl:template>
-
-
-
-    <xsl:template name="write-row">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="maxRowLength"/>
-
-
-        <xsl:element name="tr">
-            <!-- writing the style of the row -->
-            <xsl:call-template name='add-style-properties'>
-                <xsl:with-param name="collectedGlobalData" select="$collectedGlobalData"/>
-            </xsl:call-template>
-
-            <xsl:if test="$isDebugMode">
-                <xsl:message>
-*************************'tr' element has been added!</xsl:message>
-            </xsl:if>
-
-            <xsl:apply-templates select="table:table-cell">
-                <xsl:with-param name="collectedGlobalData"       select="$collectedGlobalData"/>
-                <xsl:with-param name="allColumnStyleEntries"    select="$allColumnStyleEntries"/>
-                <xsl:with-param name="maxRowLength"             select="$maxRowLength"/>
-            </xsl:apply-templates>
-
-        </xsl:element>
-    </xsl:template>
-
-
-    <!-- **************************** -->
-    <!-- *** HELPER: table styles *** -->
-    <!-- **************************** -->
-
-    <xsl:template name="add-style-properties">
-        <xsl:param name="collectedGlobalData"/>
-        <xsl:param name="allColumnStyleEntries"/>
-        <xsl:param name="node-position"/>
-
-        <xsl:choose>
-            <!--+++++ CSS (CASCADING STLYE SHEET) HEADER STYLE WAY +++++-->
-            <xsl:when test="$outputType = 'CSS_HEADER'">
-                <xsl:attribute name="class">
-                    <xsl:value-of select="translate(@table:style-name, '. %()/\', '')"/>
-                </xsl:attribute>
-            </xsl:when>
-
-            <!--+++++ HTML 4.0 INLINED WAY  +++++-->
-            <xsl:when test="$outputType = 'CSS_INLINED'">
-                <xsl:attribute name="style">
-                    <xsl:value-of select="$collectedGlobalData/allstyles/*[name()=current()/@table:style-name]"/>
-                </xsl:attribute>
-            </xsl:when>
-        </xsl:choose>
-    </xsl:template>
-
-</xsl:stylesheet>
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/pdf.php b/framework/Mime/lib/Horde/Mime/Viewer/pdf.php
deleted file mode 100644 (file)
index 1260a2a..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_pdf class simply outputs the PDF file with the
- * content-type 'application/pdf' enabling web browsers with a PDF viewer
- * plugin to view the PDF file inside the browser.
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_pdf extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_mimepart->getContents(),
-                'status' => array(),
-                'type' => 'application/pdf'
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/php.php b/framework/Mime/lib/Horde/Mime/Viewer/php.php
deleted file mode 100644 (file)
index b9b620e..0000000
+++ /dev/null
@@ -1,157 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_php class renders out syntax-highlighted PHP code in
- * HTML format.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Chuck Hagenbuch <chuck@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_php extends Horde_Mime_Viewer_source
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_renderInline();
-
-        // Need Horde headers for CSS tags.
-        reset($ret);
-        $ret[key($ret)]['data'] =  Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
-            $ret[key($ret)]['data'] .
-            Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
-
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        ini_set('highlight.comment', 'comment');
-        ini_set('highlight.default', 'default');
-        ini_set('highlight.keyword', 'keyword');
-        ini_set('highlight.string', 'string');
-        ini_set('highlight.html', 'html');
-
-        $code = $this->_mimepart->getContents();
-        $text = (strpos($code, '<?php') === false)
-            ? $this->_lineNumber(str_replace('&lt;?php&nbsp;', '', highlight_string('<?php ' . $code, true)))
-            : $this->_lineNumber(highlight_string($code, true));
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $text,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Add line numbers to a block of code.
-     *
-     * @param string $code  The code to number.
-     *
-     * @return string  The code with line numbers added.
-     */
-    protected function _lineNumber($code, $linebreak = "\n")
-    {
-        // Clean up.
-        $code = preg_replace(
-            array(
-                '/<code><span style="color: #?\w+">\s*/',
-                '/<code><font color="#?\w+">\s*/',
-                '/\s*<\/span>\s*<\/span>\s*<\/code>/',
-                '/\s*<\/font>\s*<\/font>\s*<\/code>/'
-            ), '', $code);
-
-        $code = str_replace(
-            array('&nbsp;', '&amp;', '<br />', '<span style="color: ', '<font color="', '</font>',),
-            array(' ', '&#38;', "\n", '<span class="', '<span class="', '</span>',),
-            $code);
-
-        $code = trim($code);
-
-        // Normalize newlines.
-        $code = str_replace("\r", '', $code);
-        $code = preg_replace('/\n\n\n+/', "\n\n", $code);
-
-        $results = array('<ol class="code-listing striped">');
-        $previous = false;
-
-        $lines = explode("\n", $code);
-        reset($lines);
-        while (list($lineno, $line) = each($lines)) {
-            if (substr($line, 0, 7) == '</span>') {
-                $previous = false;
-                $line = substr($line, 7);
-            }
-
-            if (empty($line)) {
-                $line = '&#160;';
-            }
-
-            if ($previous) {
-                $line = "<span class=\"$previous\">" . $line;
-            }
-
-            // Save the previous style.
-            if (strpos($line, '<span') !== false) {
-                switch (substr($line, strrpos($line, '<span') + 13, 1)) {
-                case 'c':
-                    $previous = 'comment';
-                    break;
-
-                case 'd':
-                    $previous = 'default';
-                    break;
-
-                case 'k':
-                    $previous = 'keyword';
-                    break;
-
-                case 's':
-                    $previous = 'string';
-                    break;
-                }
-            }
-
-            // Unset previous style unless the span continues.
-            if (substr($line, -7) == '</span>') {
-                $previous = false;
-            } elseif ($previous) {
-                $line .= '</span>';
-            }
-
-            $results[] = '<li id="l' . ($lineno + 1). '">' . $line . '</li>';
-        }
-
-        $results[] = '</ol>';
-
-        return implode("\n", $results);
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/plain.php b/framework/Mime/lib/Horde/Mime/Viewer/plain.php
deleted file mode 100644 (file)
index 138e92b..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_plain class renders out plain text with URLs made
- * into hyperlinks (if viewing inline).
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_plain extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $text = $this->_mimepart->getContents();
-        $charset = $this->_mimepart->getCharset();
-
-        /* Check for 'flowed' text data. */
-        if ($this->_mimepart->getContentTypeParameter('format') == 'flowed') {
-            $text = $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'));
-        }
-
-        require_once 'Horde/Text/Filter.php';
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => '<html><body><tt>' . Text_Filter::filter($text, 'text2html', array('parselevel' => TEXT_HTML_MICRO, 'charset' => $charset, 'class' => null)) . '</tt></body></html>',
-                'status' => array(),
-                'type' => 'text/html; charset=' . $charset
-            )
-        );
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        $text = String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset());
-
-        /* Check for 'flowed' text data. */
-        $data = ($this->_mimepart->getContentTypeParameter('format') == 'flowed')
-            ? $this->_formatFlowed($text, $this->_mimepart->getContentTypeParameter('delsp'))
-            : $text;
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $data,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Format flowed text for HTML output.
-     *
-     * @param string $text    The text to format.
-     * @param boolean $delsp  Was text created with DelSp formatting?
-     *
-     * @return string  The formatted text.
-     */
-    protected function _formatFlowed($text, $delsp = null)
-    {
-        $flowed = new Horde_Text_Flowed($this->_mimepart->replaceEOL($text, "\n"), $this->_mimepart->getCharset());
-        $flowed->setMaxLength(0);
-        if (!is_null($delsp)) {
-            $flowed->setDelSp($delsp);
-        }
-        return $flowed->toFixed();
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/rar.php b/framework/Mime/lib/Horde/Mime/Viewer/rar.php
deleted file mode 100644 (file)
index c85f8d3..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_rar class renders out the contents of .rar archives
- * in HTML format.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @author  Michael Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rar extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => true,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_renderInline();
-        if (!empty($ret)) {
-            reset($ret);
-            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
-        }
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        $contents = $this->_mimepart->getContents();
-
-        require_once 'Horde/Compress.php';
-        $rar = &Horde_Compress::singleton('rar');
-
-        $rarData = $rar->decompress($contents);
-        if (is_a($rarData, 'PEAR_Error')) {
-            return array();
-        }
-        $fileCount = count($rarData);
-
-        require_once 'Horde/Text.php';
-
-        $name = $this->_mimepart->getName(true);
-        if (empty($name)) {
-            $name = _("unnamed");
-        }
-
-        $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
-            '<table><tr><td align="left"><tt><span class="fixed">' .
-            Text::htmlAllSpaces(_("Archive Name") . ':  ' . $name) . "\n" .
-            Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
-            Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
-            "\n\n" .
-            Text::htmlAllSpaces(
-                String::pad(_("File Name"), 50, ' ', STR_PAD_RIGHT) .
-                String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
-                String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
-                String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
-                String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
-                String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT)
-            ) . "\n" .
-            str_repeat('-', 109) . "\n";
-
-        foreach ($rarData as $val) {
-            $ratio = empty($val['size'])
-                ? 0
-                : 100 * ($val['csize'] / $val['size']);
-
-            $text .= Text::htmlAllSpaces(
-                String::pad($val['name'], 50, ' ', STR_PAD_RIGHT) .
-                String::pad($val['attr'], 10, ' ', STR_PAD_LEFT) .
-                String::pad($val['size'], 10, ' ', STR_PAD_LEFT) .
-                String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT) .
-                String::pad($val['method'], 10, ' ', STR_PAD_LEFT) .
-                String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT)
-            ) . "\n";
-        }
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/report.php b/framework/Mime/lib/Horde/Mime/Viewer/report.php
deleted file mode 100644 (file)
index 11010c8..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_report class is a wrapper used to load the
- * appropriate Horde_Mime_Viewer for multipart/report data (RFC 3462).
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_report extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Return the underlying MIME Viewer for this part.
-     *
-     * @return mixed  A Horde_Mime_Viewer object, or false if not found.
-     */
-    protected function _getViewer()
-    {
-        if (!($type = $this->_mimepart->getContentTypeParameter('report-type'))) {
-            return false;
-        }
-
-        $viewer = Horde_Mime_Viewer::factory($this->_mimepart, 'message/' . String::lower($type));
-        if ($viewer) {
-            $viewer->setParams($this->_params);
-        }
-        return $viewer;
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/rfc822.php b/framework/Mime/lib/Horde/Mime/Viewer/rfc822.php
deleted file mode 100644 (file)
index 97a2c5e..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_rfc822 class renders out messages from the
- * message/rfc822 content type.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (GPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/gpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rfc822 extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => true,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_mimepart->getContents(),
-                'status' => array(),
-                'type' => 'text/plain; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Return the rendered information about the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInfo()
-    {
-        /* Get the text of the part.  Since we need to look for the end of
-         * the headers by searching for the CRLFCRLF sequence, use
-         * getCanonicalContents() to make sure we are getting the text with
-         * CRLF's. */
-        $text = $this->_mimepart->getCanonicalContents();
-        if (empty($text)) {
-            return array();
-        }
-
-        /* Search for the end of the header text (CRLFCRLF). */
-        $text = substr($text, 0, strpos($text, "\r\n\r\n"));
-
-        /* Get the list of headers now. */
-        $headers = Horde_Mime_Headers::parseHeaders($text);
-
-        $header_array = array(
-            'date' => _("Date"),
-            'from' => _("From"),
-            'to' => _("To"),
-            'cc' => _("Cc"),
-            'bcc' => _("Bcc"),
-            'reply-to' => _("Reply-To"),
-            'subject' => _("Subject")
-        );
-        $header_output = array();
-
-        foreach ($header_array as $key => $val) {
-            $hdr = $headers->getValue($key);
-            if (!empty($hdr)) {
-                $header_output[] = '<strong>' . $val . ':</strong> ' . htmlspecialchars($hdr);
-            }
-        }
-
-        require_once 'Horde/Text/Filter.php';
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => empty($header_output) ? '' : ('<div class="mimeHeaders">' . Text_Filter::filter(implode("<br />\n", $header_output), 'emails') . '</div>'),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/richtext.php b/framework/Mime/lib/Horde/Mime/Viewer/richtext.php
deleted file mode 100644 (file)
index 5f14e47..0000000
+++ /dev/null
@@ -1,152 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_richtext class renders out HTML text from
- * text/richtext content tags, (RFC 1896 [7.1.3]).
- *
- * A minimal richtext implementation is one that simply converts "<lt>" to
- * "<", converts CRLFs to SPACE, converts <nl> to a newline according to
- * local newline convention, removes everything between a <comment> command
- * and the next balancing </comment> command, and removes all other
- * formatting commands (all text enclosed in angle brackets).
- *
- * We implement the following tags:
- *   <bold>, <italic>, <fixed>, <smaller>, <bigger>, <underline>, <center>,
- *   <flushleft>, <flushright>, <indent>, <subscript>, <excerpt>, <paragraph>,
- *   <signature>, <comment>, <no-op>, <lt>, <nl>
- *
- * The following tags are implemented differently than described in the RFC
- * (due to limitations in HTML output):
- *   <heading> - Output as centered, bold text.
- *   <footing> - Output as centered, bold text.
- *   <np>      - Output as paragraph break.
- *
- * The following tags are NOT implemented:
- *   <indentright>, <outdent>, <outdentright>, <samepage>, <iso-8859-X>,
- *   <us-ascii>,
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_richtext extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_toHTML(),
-                'status' => array(),
-                'type' => 'text/html; charset=' . $this->_mimepart->getCharset()
-            )
-        );
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => String::convertCharset($this->_toHTML(), $this->_mimepart->getCharset()),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Convert richtext to HTML.
-     *
-     * @return string  The converted HTML string.
-     */
-    protected function _toHTML()
-    {
-        $text = trim($this->_mimepart->getContents());
-        if ($text == '') {
-            return array();
-        }
-
-        /* We add space at the beginning and end of the string as it will
-         * make some regular expression checks later much easier (so we
-         * don't have to worry about start/end of line characters). */
-        $text = ' ' . $text . ' ';
-
-        /* Remove everything between <comment> tags. */
-        $text = preg_replace('/<comment.*>.*<\/comment>/Uis', '', $text);
-
-        /* Remove any unrecognized tags in the text.  We don't need <no-op>
-         * in $tags since it doesn't do anything anyway.  All <comment> tags
-         * have already been removed. */
-        $tags = '<bold><italic><fixed><smaller><bigger><underline><center><flushleft><flushright><indent><subscript><excerpt><paragraph><signature><lt><nl>';
-        $text = strip_tags($text, $tags);
-
-        /* <lt> becomes a '<'. CRLF becomes a SPACE. */
-        $text = str_ireplace(array('<lt>', "\r\n"), array('&lt;', ' '), $text);
-
-        /* We try to protect against bad stuff here. */
-        $text = @htmlspecialchars($text, ENT_QUOTES, $this->_mimepart->getCharset());
-
-        /* <nl> becomes a newline (<br />);
-         * <np> becomes a paragraph break (<p />). */
-        $text = str_ireplace(array('&lt;nl&gt;', '&lt;np&gt;'), array('<br />', '<p />'), $text);
-
-        /* Now convert the known tags to html. Try to remove any tag
-         * parameters to stop people from trying to pull a fast one. */
-        $replace = array(
-            '/(?<!&lt;)&lt;bold.*&gt;(.*)&lt;\/bold&gt;/Uis' => '<span style="font-weight: bold">\1</span>',
-            '/(?<!&lt;)&lt;italic.*&gt;(.*)&lt;\/italic&gt;/Uis' => '<span style="font-style: italic">\1</span>',
-            '/(?<!&lt;)&lt;fixed.*&gt;(.*)&lt;\/fixed&gt;/Uis' => '<font face="fixed">\1</font>',
-            '/(?<!&lt;)&lt;smaller.*&gt;(.*)&lt;\/smaller&gt;/Uis' => '<span style="font-size: smaller">\1</span>',
-            '/(?<!&lt;)&lt;bigger.*&gt;(.*)&lt;\/bigger&gt;/Uis' => '<span style="font-size: larger">\1</span>',
-            '/(?<!&lt;)&lt;underline.*&gt;(.*)&lt;\/underline&gt;/Uis' => '<span style="text-decoration: underline">\1</span>',
-            '/(?<!&lt;)&lt;center.*&gt;(.*)&lt;\/center&gt;/Uis' => '<div align="center">\1</div>',
-            '/(?<!&lt;)&lt;flushleft.*&gt;(.*)&lt;\/flushleft&gt;/Uis' => '<div align="left">\1</div>',
-            '/(?<!&lt;)&lt;flushright.*&gt;(.*)&lt;\/flushright&gt;/Uis' => '<div align="right">\1</div>',
-            '/(?<!&lt;)&lt;indent.*&gt;(.*)&lt;\/indent&gt;/Uis' => '<blockquote>\1</blockquote>',
-            '/(?<!&lt;)&lt;excerpt.*&gt;(.*)&lt;\/excerpt&gt;/Uis' => '<cite>\1</cite>',
-            '/(?<!&lt;)&lt;subscript.*&gt;(.*)&lt;\/subscript&gt;/Uis' => '<sub>\1</sub>',
-            '/(?<!&lt;)&lt;superscript.*&gt;(.*)&lt;\/superscript&gt;/Uis' => '<sup>\1</sup>',
-            '/(?<!&lt;)&lt;heading.*&gt;(.*)&lt;\/heading&gt;/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
-            '/(?<!&lt;)&lt;footing.*&gt;(.*)&lt;\/footing&gt;/Uis' => '<br /><div align="center" style="font-weight: bold">\1</div><br />',
-            '/(?<!&lt;)&lt;paragraph.*&gt;(.*)&lt;\/paragraph&gt;/Uis' => '<p>\1</p>',
-            '/(?<!&lt;)&lt;signature.*&gt;(.*)&lt;\/signature&gt;/Uis' => '<address>\1</address>'
-        );
-        $text = preg_replace(array_keys($replace), array_values($replace), $text);
-
-        /* Now we remove the leading/trailing space we added at the start. */
-        $text = substr($text, 1, -1);
-
-        /* Wordwrap. */
-        $text = str_replace(array("\t", '  ', "\n "), array('        ', ' &nbsp;', "\n&nbsp;"), $text);
-        if ($text[0] == ' ') {
-            $text = '&nbsp;' . substr($text, 1);
-        }
-
-        return '<p style="font-size:100%;font-family:Lucida Console,Courier,Courier New;">' . nl2br($text) . '</p>';
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/rpm.php b/framework/Mime/lib/Horde/Mime/Viewer/rpm.php
deleted file mode 100644 (file)
index 4c15c45..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_rpm class renders out lists of files in RPM
- * packages by using the rpm tool to query the package.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rpm extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => true,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        $data = '';
-        $tmp_rpm = Horde::getTempFile('horde_rpm');
-
-        file_put_contents($tmp_rpm, $this->_mimepart->getContents());
-
-        $fh = popen($this->_conf['location'] . " -qip $tmp_rpm 2>&1", 'r');
-        while (($rc = fgets($fh, 8192))) {
-            $data .= $rc;
-        }
-        pclose($fh);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => '<html><body><pre>' . htmlentities($data) . '</pre></body></html>',
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/rtf.php b/framework/Mime/lib/Horde/Mime/Viewer/rtf.php
deleted file mode 100644 (file)
index 2da5d1f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_rtf class renders out Rich Text Format documents in
- * HTML format by using the UnRTF package
- * (http://www.gnu.org/software/unrtf/unrtf.html).
- *
- * Copyright 2007 Duck <duck@obala.net>
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Duck <duck@obala.net>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_rtf extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        $tmp_rtf = Horde::getTempFile('rtf');
-        $tmp_output = Horde::getTempFile('rtf');
-
-        file_put_contents($tmp_rtf, $this->_mimepart->getContents());
-
-        exec($this->_conf['location'] . " $tmp_rtf > $tmp_output");
-
-        if (file_exists($tmp_output)) {
-            $data = file_get_contents($tmp_output);
-        } else {
-            $data = _("Unable to translate this RTF document");
-        }
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $data,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/security.php b/framework/Mime/lib/Horde/Mime/Viewer/security.php
deleted file mode 100644 (file)
index f66851f..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_security class is a wrapper used to load the
- * appropriate Horde_Mime_Viewer for secure multipart messages (defined by RFC
- * 1847). This class handles multipart/signed and multipart/encrypted data.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_security extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Return the underlying MIME Viewer for this part.
-     *
-     * @return mixed  A Horde_Mime_Viewer object, or false if not found.
-     */
-    protected function _getViewer()
-    {
-        if (!($protocol = $this->_mimepart->getContentTypeParameter('protocol'))) {
-            return false;
-        }
-
-        $viewer = Horde_Mime_Viewer::factory($this->_mimepart, $protocol);
-        if ($viewer) {
-            $viewer->setParams($this->_params);
-        }
-        return $viewer;
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/simple.php b/framework/Mime/lib/Horde/Mime/Viewer/simple.php
deleted file mode 100644 (file)
index c42ae56..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_simple class renders out plain text without any
- * modifications.
- *
- * Copyright 2004-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_simple extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_mimepart->getContents(),
-                'status' => array(),
-                'type' => 'text/plain; charset=' . $this->_mimepart->getCharset()
-            )
-        );
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => String::convertCharset($this->_mimepart->getContents(), $this->_mimepart->getCharset()),
-                'status' => array(),
-                'type' => 'text/plain; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/smil.php b/framework/Mime/lib/Horde/Mime/Viewer/smil.php
deleted file mode 100644 (file)
index 1df1f21..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_smil renders SMIL documents to very basic HTML.
- *
- * Copyright 2006-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Jan Schneider <jan@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_smil extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Handle for the XML parser object.
-     *
-     * @var resource
-     */
-    protected $_parser;
-
-    /**
-     * String buffer to hold the generated content
-     *
-     * @var string
-     */
-    protected $_content;
-
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => true,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $this->_content = '';
-
-        /* Create a new parser and set its default properties. */
-        $this->_parser = xml_parser_create();
-        xml_set_object($this->_parser, $this);
-        xml_set_element_handler($this->_parser, '_startElement', '_endElement');
-        xml_set_character_data_handler($this->_parser, '_defaultHandler');
-        xml_parse($this->_parser, $this->_mimepart->getContents(), true);
-        xml_parser_free($this->_parser);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_content,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * User-defined function callback for start elements.
-     *
-     * @param object $parser  Handle to the parser instance.
-     * @param string $name    The name of this XML element.
-     * @param array $attrs    List of this element's attributes.
-     */
-    protected function _startElement($parser, $name, $attrs)
-    {
-        switch ($name) {
-        case 'IMG':
-            if (isset($attrs['SRC'])) {
-                $this->_content .= '<img src="' . htmlspecialchars($attrs['SRC']) . '" />';
-            }
-            break;
-        }
-    }
-
-    /**
-     * User-defined function callback for end elements.
-     *
-     * @param object $parser  Handle to the parser instance.
-     * @param string $name    The name of this XML element.
-     */
-    protected function _endElement($parser, $name)
-    {
-    }
-
-    /**
-     * User-defined function callback for character data.
-     *
-     * @param object $parser  Handle to the parser instance.
-     * @param string $data    String of character data.
-     */
-    protected function _defaultHandler($parser, $data)
-    {
-        $data = trim($data);
-        if (!empty($data)) {
-            $this->_content .= ' ' . htmlspecialchars($data);
-        }
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/source.php b/framework/Mime/lib/Horde/Mime/Viewer/source.php
deleted file mode 100644 (file)
index c1c16a0..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_source class is a class for any viewer that wants
- * to provide line numbers to extend.
- *
- * Copyright 1999-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Chuck Hagenbuch <chuck@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_source extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Add line numbers to a block of code.
-     *
-     * @param string $code  The code to number.
-     *
-     * @return string  The code with line numbers added.
-     */
-    protected function _lineNumber($code, $linebreak = "\n")
-    {
-        $html = array('<table class="lineNumbered" cellspacing="0"><tr><th>');
-        for ($l = 1,  $lines = substr_count($code, $linebreak) + 1; $l <= $lines; ++$l) {
-            $html[] = sprintf('<a id="l%s" href="#l%s">%s</a><br />', $l, $l, $l);
-        }
-        return implode("\n", $html) . '</th><td><div>' . $code . '</div></td></tr></table>';
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/srchighlite.php b/framework/Mime/lib/Horde/Mime/Viewer/srchighlite.php
deleted file mode 100644 (file)
index bbcc5d2..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-<?php
-
-require_once dirname(__FILE__) . '/source.php';
-
-/**
- * The Horde_Mime_Viewer_srchighlite class renders out various content in HTML
- * format by using Source-highlight.
- *
- * Source-highlight: http://www.gnu.org/software/src-highlite/
- *
- * Copyright 2003-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_srchighlite extends Horde_Mime_Viewer_source
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_renderInline();
-
-        // Need Horde headers for CSS tags.
-        reset($ret);
-        $ret[key($ret)]['data'] =  Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
-            $ret[key($ret)]['data'] .
-            Util::bufferOutput('require', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
-
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        /* Create temporary files for Webcpp. */
-        $tmpin  = Horde::getTempFile('SrcIn');
-        $tmpout = Horde::getTempFile('SrcOut', false);
-
-        /* Write the contents of our buffer to the temporary input file. */
-        file_put_contents($tmpin, $this->_mimepart->getContents());
-
-        /* Determine the language from the mime type. */
-        $lang = $this->_typeToLang($this->_mimepart->getType());
-
-        /* Execute Source-Highlite. */
-        exec($this->_conf['location'] . " --src-lang $lang --out-format xhtml --input $tmpin --output $tmpout");
-        $results = file_get_contents($tmpout);
-        unlink($tmpout);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $this->_lineNumber($results),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Attempts to determine what mode to use for the source-highlight
-     * program from a MIME type.
-     *
-     * @param string $type  The MIME type.
-     *
-     * @return string  The mode to use.
-     */
-    protected function _typeToLang($type)
-    {
-        switch ($type) {
-        case 'text/x-java':
-            return 'java';
-
-        case 'text/x-csrc':
-        case 'text/x-c++src':
-        case 'text/cpp':
-            return 'cpp';
-
-        case 'application/x-perl':
-            return 'perl';
-
-        case 'application/x-php':
-        case 'x-extension/phps':
-        case 'x-extension/php3s':
-        case 'application/x-httpd-php':
-        case 'application/x-httpd-php3':
-        case 'application/x-httpd-phps':
-            return 'php3';
-
-        case 'application/x-python':
-            return 'python';
-
-        // TODO: 'prolog', 'flex', 'changelog', 'ruby'
-        }
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/tgz.php b/framework/Mime/lib/Horde/Mime/Viewer/tgz.php
deleted file mode 100644 (file)
index d128227..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_tgz class renders out plain or gzipped tarballs in
- * HTML.
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Anil Madhavapeddy <anil@recoil.org>
- * @author  Michael Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_tgz extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => true,
-        'full' => false,
-        'info' => true,
-        'inline' => true
-    );
-
-    /**
-     * The list of compressed subtypes.
-     *
-     * @var array
-     */
-    protected $_gzipSubtypes = array(
-        'x-compressed-tar', 'tgz', 'x-tgz', 'gzip', 'x-gzip',
-        'x-gzip-compressed', 'x-gtar'
-    );
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        /* Currently, can't do anything without tar file. */
-        $subtype = $this->_mimepart->getSubType();
-        if (in_array($subtype, array('gzip', 'x-gzip', 'x-gzip-compressed'))) {
-            return array();
-        }
-
-        $contents = $this->_mimepart->getContents();
-
-        /* Decompress gzipped files. */
-        if (in_array($subtype, $this->_gzipSubtypes)) {
-            $gzip = &Horde_Compress::singleton('gzip');
-            $contents = $gzip->decompress($contents);
-            if (is_a($contents, 'PEAR_Error') || empty($contents)) {
-                return array();
-            }
-        }
-
-        /* Obtain the list of files/data in the tar file. */
-        $tar = &Horde_Compress::singleton('tar');
-        $tarData = $tar->decompress($contents);
-        if (is_a($tarData, 'PEAR_Error')) {
-            return array();
-        }
-        $fileCount = count($tarData);
-
-        require_once 'Horde/Text.php';
-
-        $name = $this->_mimepart->getName(true);
-        if (empty($name)) {
-            $name = _("unnamed");
-        }
-
-        $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
-            '<table><tr><td align="left"><tt><span class="fixed">' .
-            Text::htmlAllSpaces(_("Archive Name") . ':  ' . $name) . "\n" .
-            Text::htmlAllSpaces(_("Archive File Size") . ': ' . strlen($contents) . ' bytes') . "\n" .
-            Text::htmlAllSpaces(sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount)) .
-            "\n\n" .
-            Text::htmlAllSpaces(
-                str_pad(_("File Name"), 62, ' ', STR_PAD_RIGHT) .
-                str_pad(_("Attributes"), 15, ' ', STR_PAD_LEFT) .
-                str_pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
-                str_pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT)
-            ) . "\n" .
-            str_repeat('-', 106) . "\n";
-
-        foreach ($tarData as $val) {
-            $text .= Text::htmlAllSpaces(
-                str_pad($val['name'], 62, ' ', STR_PAD_RIGHT) .
-                str_pad($val['attr'], 15, ' ', STR_PAD_LEFT) .
-                str_pad($val['size'], 10, ' ', STR_PAD_LEFT) .
-                str_pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT)
-            ) . "\n";
-        }
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => nl2br($text . str_repeat('-', 106) . "\n" . '</span></tt></td></tr></table>'),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * Return the rendered information about the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInfo()
-    {
-        return $this->_renderInline();
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/tnef.php b/framework/Mime/lib/Horde/Mime/Viewer/tnef.php
deleted file mode 100644 (file)
index 81ac09c..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_tnef class allows MS-TNEF attachments to be
- * displayed.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Jan Schneider <jan@horde.org>
- * @author  Michael Slusarz <slusarz@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_tnef extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => true,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_renderInline();
-        if (!empty($ret)) {
-            reset($ret);
-            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
-        }
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        require_once 'Horde/Compress.php';
-        $tnef = &Horde_Compress::singleton('tnef');
-
-        $data = '<table border="1">';
-        $info = $tnef->decompress($this->_mimepart->getContents());
-        if (empty($info) || is_a($info, 'PEAR_Error')) {
-            $data .= '<tr><td>' . _("MS-TNEF Attachment contained no data.") . '</td></tr>';
-        } else {
-            $data .= '<tr><td>' . _("Name") . '</td><td>' . _("Mime Type") . '</td></tr>';
-            foreach ($info as $part) {
-                $data .= '<tr><td>' . $part['name'] . '</td><td>' . $part['type'] . '/' . $part['subtype'] . '</td></tr>';
-            }
-        }
-        $data .= '</table>';
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $data,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/vcard.php b/framework/Mime/lib/Horde/Mime/Viewer/vcard.php
deleted file mode 100644 (file)
index 2932b95..0000000
+++ /dev/null
@@ -1,404 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_vcard class renders out vCards in HTML format.
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Jan Schneider <jan@horde.org>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_vcard extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_renderInline();
-        if (!empty($ret)) {
-            reset($ret);
-            $ret[key($ret)]['data'] = Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-header.inc') .
-                $ret[key($ret)]['data'] .
-                Util::bufferOutput('include', $GLOBALS['registry']->get('templates', 'horde') . '/common-footer.inc');
-        }
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        global $registry, $prefs, $notification;
-
-        $app = false;
-        $data = $this->_mimepart->getContents();
-        $html = '';
-        $import_msg = null;
-        $title = _("vCard");
-
-        require_once 'Horde/iCalendar.php';
-        $iCal = new Horde_iCalendar();
-        if (!$iCal->parsevCalendar($data, 'VCALENDAR', $this->_mimepart->getCharset())) {
-            $notification->push(_("There was an error reading the contact data."), 'horde.error');
-        }
-
-        if (Util::getFormData('import') &&
-            Util::getFormData('source') &&
-            $registry->hasMethod('contacts/import')) {
-            $source = Util::getFormData('source');
-            $count = 0;
-            foreach ($iCal->getComponents() as $c) {
-                if (is_a($c, 'Horde_iCalendar_vcard')) {
-                    $contacts = $registry->call('contacts/import',
-                                                array($c, null, $source));
-                    if (is_a($contacts, 'PEAR_Error')) {
-                        $notification->push(
-                            _("There was an error importing the contact data:") . ' '
-                            . $contacts->getMessage(),
-                            'horde.error');
-                        continue;
-                    }
-                    $count++;
-                }
-            }
-            $notification->push(sprintf(ngettext(
-                "%d contact was successfully added to your address book.",
-                "%d contacts were successfully added to your address book.",
-                $count),
-                                        $count),
-                                'horde.success');
-        }
-
-        $html .= '<table cellspacing="1" border="0" cellpadding="1">';
-
-        $i = 0;
-        foreach ($iCal->getComponents() as $vc) {
-            if ($i > 0) {
-                $html .= '<tr><td colspan="2">&nbsp;</td></tr>';
-            }
-            ++$i;
-
-            $html .= '<tr><td colspan="2" class="header">';
-            $fullname = $vc->getAttributeDefault('FN', false);
-            if ($fullname !== false) {
-                $html .= $fullname;
-            }
-            $html .= '</td></tr>';
-
-            $n = $vc->printableName();
-            if (!empty($n)) {
-                $html .= $this->_row(_("Name"), $n);
-            }
-
-            $aliases = $vc->getAttributeValues('ALIAS');
-            if (!is_a($aliases, 'PEAR_Error')) {
-                $html .= $this->_row(_("Alias"), implode("\n", $aliases));
-            }
-            $birthdays = $vc->getAttributeValues('BDAY');
-            if (!is_a($birthdays, 'PEAR_Error')) {
-                $birthday = new Horde_Date($birthdays[0]);
-                $html .= $this->_row(
-                    _("Birthday"),
-                    $birthday->strftime($prefs->getValue('date_format')));
-            }
-
-            $photos = $vc->getAllAttributes('PHOTO');
-            foreach ($photos as $photo) {
-                if (!isset($photo['params']['VALUE']) ||
-                    String::upper($photo['params']['VALUE']) != 'URI') {
-                    continue;
-                }
-                $html .= $this->_row(_("Photo"),
-                                     '<img src="' . htmlspecialchars($photo['value']) . '" />',
-                                     false);
-            }
-
-            $labels = $vc->getAllAttributes('LABEL');
-            foreach ($labels as $label) {
-                if (isset($label['params']['TYPE'])) {
-                    if (!is_array($label['params']['TYPE'])) {
-                        $label['params']['TYPE'] = array($label['params']['TYPE']);
-                    }
-                } else {
-                    $label['params']['TYPE'] = array_keys($label['params']);
-                }
-                $types = array();
-                foreach ($label['params']['TYPE'] as $type) {
-                    switch(String::upper($type)) {
-                    case 'HOME':
-                        $types[] = _("Home Address");
-                        break;
-
-                    case 'WORK':
-                        $types[] = _("Work Address");
-                        break;
-
-                    case 'DOM':
-                        $types[] = _("Domestic Address");
-                        break;
-
-                    case 'INTL':
-                        $types[] = _("International Address");
-                        break;
-
-                    case 'POSTAL':
-                        $types[] = _("Postal Address");
-                        break;
-
-                    case 'PARCEL':
-                        $types[] = _("Parcel Address");
-                        break;
-
-                    case 'PREF':
-                        $types[] = _("Preferred Address");
-                        break;
-                    }
-                }
-                if (!count($types)) {
-                    $types = array(_("Address"));
-                }
-                $html .= $this->_row(implode('/', $types), $label['value']);
-            }
-
-            $adrs = $vc->getAllAttributes('ADR');
-            foreach ($adrs as $item) {
-                if (isset($item['params']['TYPE'])) {
-                    if (!is_array($item['params']['TYPE'])) {
-                        $item['params']['TYPE'] = array($item['params']['TYPE']);
-                    }
-                } else {
-                    $item['params']['TYPE'] = array_keys($item['params']);
-                }
-                $address = $item['values'];
-                $a = array();
-                if (isset($address[VCARD_ADR_STREET])) {
-                    $a[] = $address[VCARD_ADR_STREET];
-                }
-                if (isset($address[VCARD_ADR_LOCALITY])) {
-                    $a[] = $address[VCARD_ADR_LOCALITY];
-                }
-                if (isset($address[VCARD_ADR_REGION])) {
-                    $a[] = $address[VCARD_ADR_REGION];
-                }
-                if (isset($address[VCARD_ADR_POSTCODE])) {
-                    $a[] = $address[VCARD_ADR_POSTCODE];
-                }
-                if (isset($address[VCARD_ADR_COUNTRY])) {
-                    $a[] = $address[VCARD_ADR_COUNTRY];
-                }
-                $types = array();
-                foreach ($item['params']['TYPE'] as $type) {
-                    switch(String::upper($type)) {
-                    case 'HOME':
-                        $types[] = _("Home Address");
-                        break;
-
-                    case 'WORK':
-                        $types[] = _("Work Address");
-                        break;
-
-                    case 'DOM':
-                        $types[] = _("Domestic Address");
-                        break;
-
-                    case 'INTL':
-                        $types[] = _("International Address");
-                        break;
-
-                    case 'POSTAL':
-                        $types[] = _("Postal Address");
-                        break;
-
-                    case 'PARCEL':
-                        $types[] = _("Parcel Address");
-                        break;
-
-                    case 'PREF':
-                        $types[] = _("Preferred Address");
-                        break;
-                    }
-                }
-                if (!count($types)) {
-                    $types = array(_("Address"));
-                }
-                $html .= $this->_row(implode('/', $types), implode("\n", $a));
-            }
-
-            $numbers = $vc->getAllAttributes('TEL');
-
-            foreach ($numbers as $number) {
-                if (isset($number['params']['TYPE'])) {
-                    if (!is_array($number['params']['TYPE'])) {
-                        $number['params']['TYPE'] = array($number['params']['TYPE']);
-                    }
-                    foreach ($number['params']['TYPE'] as $type) {
-                        $number['params'][String::upper($type)] = true;
-                    }
-                }
-                if (isset($number['params']['FAX'])) {
-                    $html .= $this->_row(_("Fax"), $number['value']);
-                } else {
-                    if (isset($number['params']['HOME'])) {
-                        $html .= $this->_row(_("Home Phone"),
-                                             $number['value']);
-                    } elseif (isset($number['params']['WORK'])) {
-                        $html .= $this->_row(_("Work Phone"),
-                                             $number['value']);
-                    } elseif (isset($number['params']['CELL'])) {
-                        $html .= $this->_row(_("Cell Phone"),
-                                             $number['value']);
-                    } else {
-                        $html .= $this->_row(_("Phone"),
-                                             $number['value']);
-                    }
-                }
-            }
-
-            $addresses = $vc->getAllAttributes('EMAIL');
-            $emails = array();
-            foreach ($addresses as $address) {
-                if (isset($address['params']['TYPE'])) {
-                    if (!is_array($address['params']['TYPE'])) {
-                        $address['params']['TYPE'] = array($address['params']['TYPE']);
-                    }
-                    foreach ($address['params']['TYPE'] as $type) {
-                        $address['params'][String::upper($type)] = true;
-                    }
-                }
-                $email = '<a href="';
-                if ($registry->hasMethod('mail/compose')) {
-                    $email .= $registry->call(
-                        'mail/compose',
-                        array(array('to' => $address['value'])));
-                } else {
-                    $email .= 'mailto:' . htmlspecialchars($address['value']);
-                }
-                $email .= '">' . htmlspecialchars($address['value']) . '</a>';
-                if (isset($address['params']['PREF'])) {
-                    array_unshift($emails, $email);
-                } else {
-                    $emails[] = $email;
-                }
-            }
-
-            if (count($emails)) {
-                $html .= $this->_row(_("Email"), implode("\n", $emails), false);
-            }
-
-            $title = $vc->getAttributeValues('TITLE');
-            if (!is_a($title, 'PEAR_Error')) {
-                $html .= $this->_row(_("Title"), $title[0]);
-            }
-
-            $role = $vc->getAttributeValues('ROLE');
-            if (!is_a($role, 'PEAR_Error')) {
-                $html .= $this->_row(_("Role"), $role[0]);
-            }
-
-            $org = $vc->getAttributeValues('ORG');
-            if (!is_a($org, 'PEAR_Error')) {
-                $html .= $this->_row(_("Company"), $org[0]);
-                if (isset($org[1])) {
-                    $html .= $this->_row(_("Department"), $org[1]);
-                }
-            }
-
-            $notes = $vc->getAttributeValues('NOTE');
-            if (!is_a($notes, 'PEAR_Error')) {
-                $html .= $this->_row(_("Notes"), $notes[0]);
-            }
-
-            $url = $vc->getAttributeValues('URL');
-            if (!is_a($url, 'PEAR_Error')) {
-                $html .= $this->_row(
-                    _("URL"),
-                    '<a href="' . htmlspecialchars($url[0])
-                        . '" target="_blank">' . htmlspecialchars($url[0])
-                        . '</a>',
-                    false);
-            }
-        }
-
-        if ($registry->hasMethod('contacts/import') &&
-            $registry->hasMethod('contacts/sources')) {
-            $html .= '<tr><td colspan="2" class="smallheader"><form action="'
-                . Horde::selfUrl() . '" method="get" name="vcard_import">'
-                . Util::formInput();
-            foreach ($_GET as $key => $val) {
-                $html .= '<input type="hidden" name="' . htmlspecialchars($key)
-                    . '" value="' . htmlspecialchars($val) . '" />';
-            }
-
-            $sources = $registry->call('contacts/sources', array(true));
-            if (count($sources) > 1) {
-                $html .=
-                    '<input type="submit" class="button" name="import" value="'
-                    . _("Add to address book:") . '" />'
-                    . '<label for="add_source" class="hidden">'
-                    . _("Address Book") . '</label>'
-                    . '<select id="add_source" name="source">';
-                foreach ($sources as $key => $label) {
-                    $selected = ($key == $prefs->getValue('add_source'))
-                        ? ' selected="selected"' : '';
-                    $html .= '<option value="' . htmlspecialchars($key) . '"'
-                        . $selected . '>' . htmlspecialchars($label)
-                        . '</option>';
-                }
-            } else {
-                reset($sources);
-                $html .=
-                    '<input type="submit" class="button" name="import" value="'
-                    . _("Add to my address book") . '" />'
-                    . '<input type="hidden" name="source" value="'
-                    . htmlspecialchars(key($sources)) . '" />';
-            }
-
-            $html .= '</form></td></tr><tr><td>&nbsp;</td></tr>';
-        }
-
-        $html .=  '</table>';
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => Util::bufferOutput(array($notification, 'notify'), array('listeners' => 'status')) . $html,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-
-    /**
-     * TODO
-     */
-    protected function _row($label, $value, $encode = true)
-    {
-        if ($encode) {
-            $label = htmlspecialchars($label);
-            $value = htmlspecialchars($value);
-        }
-        return '<tr><td class="item" valign="top">' . $label .
-            '</td><td class="item" valign="top">' . nl2br($value) .
-            "</td></tr>\n";
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/webcpp.php b/framework/Mime/lib/Horde/Mime/Viewer/webcpp.php
deleted file mode 100644 (file)
index 3d0f995..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_webcpp class renders out various content in HTML
- * format by using Web C Plus Plus.
- *
- * Web C Plus plus: http://webcpp.sourceforge.net/
- *
- * Copyright 2002-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Mike Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_webcpp extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_toHTML();
-
-        /* The first 2 lines are the Content-Type line and a blank line so
-         * remove them before outputting. */
-        reset($ret);
-        $ret[key($ret)]['data'] = preg_replace("/.*\n.*\n/", '', $ret[key($ret)]['data'], 1);
-
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        $ret = $this->_toHTML();
-        reset($ret);
-        $data = $ret[key($ret)]['data'];
-
-        /* Extract the style sheet, removing any global body formatting
-         * if we're displaying inline. */
-        $res = preg_split(';(</style>)|(<style type="text/css">);', $data);
-        $style = $res[1];
-        $style = preg_replace('/\nbody\s+?{.*?}/s', '', $style);
-
-        /* Extract the content. */
-        $res = preg_split('/\<\/?pre\>/', $data);
-        $body = $res[1];
-
-        $ret[key($ret)]['data'] = '<style>' . $style . '</style><div class="webcpp" style="white-space:pre;font-family:Lucida Console,Courier,monospace;">' . $body . '</div>';
-
-        return $ret;
-    }
-
-    /**
-     * Converts the code to HTML.
-     *
-     * @return string  The HTML-ified version of the MIME part contents.
-     */
-    protected function _toHTML()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        /* Create temporary files for Webcpp. */
-        $tmpin  = Horde::getTempFile('WebcppIn');
-        $tmpout = Horde::getTempFile('WebcppOut');
-
-        /* Write the contents of our buffer to the temporary input file. */
-        file_put_contents($tmpin, $this->_mimepart->getContents());
-
-        /* Get the extension for the mime type. */
-        include_once dirname(__FILE__) . '/../Magic.php';
-        $ext = Horde_Mime_Magic::MIMEToExt($this->_mimepart->getType());
-
-        /* Execute Web C Plus Plus. Specifying the in and out files didn't
-         * work for me but pipes did. */
-        exec($this->_conf['location'] . " --pipe --pipe -x=$ext -l -a -t < $tmpin > $tmpout");
-        $results = file_get_contents($tmpout);
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $results,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/wordperfect.php b/framework/Mime/lib/Horde/Mime/Viewer/wordperfect.php
deleted file mode 100644 (file)
index 7cf7496..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_wordperfect class renders out WordPerfect documents
- * in HTML format by using the libwpd package.
- *
- * libpwd website: http://libwpd.sourceforge.net/
- *
- * Copyright 2007-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Matt Selsky <selsky@columbia.edu>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_wordperfect extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => false,
-        'full' => true,
-        'info' => false,
-        'inline' => false
-    );
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        /* Check to make sure the viewer program exists. */
-        if (!isset($this->_conf['location']) ||
-            !file_exists($this->_conf['location'])) {
-            return array();
-        }
-
-        $tmp_wpd = Horde::getTempFile('wpd');
-        $tmp_output = Horde::getTempFile('wpd');
-
-        file_put_contents($tmp_wpd, $this->_mimepart->getContents());
-
-        exec($this->_conf['location'] . " $tmp_wpd > $tmp_output");
-
-        if (file_exists($tmp_output)) {
-            $data = file_get_contents($tmp_output);
-        } else {
-            $data = _("Unable to translate this WordPerfect document");
-        }
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => $data,
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
diff --git a/framework/Mime/lib/Horde/Mime/Viewer/zip.php b/framework/Mime/lib/Horde/Mime/Viewer/zip.php
deleted file mode 100644 (file)
index 5399e2a..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-<?php
-/**
- * The Horde_Mime_Viewer_zip class renders out the contents of ZIP files in
- * HTML format.
- *
- * Copyright 2000-2009 The Horde Project (http://www.horde.org/)
- *
- * See the enclosed file COPYING for license information (LGPL). If you
- * did not receive this file, see http://www.fsf.org/copyleft/lgpl.html.
- *
- * @author  Chuck Hagenbuch <chuck@horde.org>
- * @author  Michael Cochrane <mike@graftonhall.co.nz>
- * @package Horde_Mime_Viewer
- */
-class Horde_Mime_Viewer_zip extends Horde_Mime_Viewer_Driver
-{
-    /**
-     * Can this driver render various views?
-     *
-     * @var boolean
-     */
-    protected $_capability = array(
-        'embedded' => false,
-        'forceinline' => true,
-        'full' => true,
-        'info' => false,
-        'inline' => true
-    );
-
-    /**
-     * A callback function to use in _toHTML().
-     *
-     * @var callback
-     */
-    protected $_callback = null;
-
-    /**
-     * Return the full rendered version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _render()
-    {
-        $ret = $this->_toHTML();
-        if (!empty($ret)) {
-            reset($ret);
-            $ret[key($ret)]['data'] = '<html><body>' . $ret[key($ret)]['data'] . '</body></html>';
-        }
-        return $ret;
-    }
-
-    /**
-     * Return the rendered inline version of the Horde_Mime_Part object.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _renderInline()
-    {
-        return $this->_toHTML();
-    }
-
-    /**
-     * Converts the ZIP file to an HTML display.
-     *
-     * @return array  See Horde_Mime_Viewer_Driver::render().
-     */
-    protected function _toHTML()
-    {
-        $contents = $this->_mimepart->getContents();
-
-        require_once 'Horde/Compress.php';
-        $zip = &Horde_Compress::singleton('zip');
-
-        /* Make sure this is a valid zip file. */
-        if ($zip->checkZipData($contents) === false) {
-            return array();
-        }
-
-        $zipInfo = $zip->decompress($contents, array('action' => HORDE_COMPRESS_ZIP_LIST));
-        if (is_a($zipInfo, 'PEAR_Error')) {
-            return array();
-        }
-        $fileCount = count($zipInfo);
-
-        /* Determine maximum file name length. */
-        $max_array = array();
-        foreach ($zipInfo as $val) {
-            $max_array[] = strlen($val['name']);
-        }
-        $maxlen = empty($max_array) ? 0 : max($max_array);
-
-        require_once 'Horde/Text.php';
-
-        $name = $this->_mimepart->getName(true);
-        if (empty($name)) {
-            $name = _("unnamed");
-        }
-
-        $text = '<strong>' . htmlspecialchars(sprintf(_("Contents of \"%s\""), $name)) . ':</strong>' . "\n" .
-            '<table><tr><td align="left"><tt><span class="fixed">' .
-            Text::htmlAllSpaces(
-                _("Archive Name") . ': ' . $name . "\n" .
-                _("Archive File Size") . ': ' . strlen($contents) .
-                ' bytes' . "\n" .
-                sprintf(ngettext("File Count: %d file", "File Count: %d files", $fileCount), $fileCount) .
-                "\n\n" .
-                String::pad(_("File Name"), $maxlen, ' ', STR_PAD_RIGHT) .
-                String::pad(_("Attributes"), 10, ' ', STR_PAD_LEFT) .
-                String::pad(_("Size"), 10, ' ', STR_PAD_LEFT) .
-                String::pad(_("Modified Date"), 19, ' ', STR_PAD_LEFT) .
-                String::pad(_("Method"), 10, ' ', STR_PAD_LEFT) .
-                String::pad(_("CRC"), 10, ' ', STR_PAD_LEFT) .
-                String::pad(_("Ratio"), 10, ' ', STR_PAD_LEFT) .
-                "\n"
-            ) . str_repeat('-', 69 + $maxlen) . "\n";
-
-        foreach ($zipInfo as $key => $val) {
-            $ratio = (empty($val['size']))
-                ? 0
-                : 100 * ($val['csize'] / $val['size']);
-
-            $val['name']   = String::pad($val['name'], $maxlen, ' ', STR_PAD_RIGHT);
-            $val['attr']   = String::pad($val['attr'], 10,' ', STR_PAD_LEFT);
-            $val['size']   = String::pad($val['size'], 10, ' ', STR_PAD_LEFT);
-            $val['date']   = String::pad(strftime("%d-%b-%Y %H:%M", $val['date']), 19, ' ', STR_PAD_LEFT);
-            $val['method'] = String::pad($val['method'], 10, ' ', STR_PAD_LEFT);
-            $val['crc']    = String::pad($val['crc'], 10, ' ', STR_PAD_LEFT);
-            $val['ratio']  = String::pad(sprintf("%1.1f%%", $ratio), 10, ' ', STR_PAD_LEFT);
-
-            $val = array_map(array('Text', 'htmlAllSpaces'), $val);
-            if (!is_null($this->_callback)) {
-                $val = call_user_func($this->_callback, $key, $val);
-            }
-
-            $text .= $val['name'] . $val['attr'] . $val['size'] .
-                $val['date'] . $val['method'] . $val['crc'] . $val['ratio'] .
-                "\n";
-        }
-
-        return array(
-            $this->_mimepart->getMimeId() => array(
-                'data' => nl2br($text . str_repeat('-', 69 + $maxlen) . "\n" . '</span></tt></td></tr></table>'),
-                'status' => array(),
-                'type' => 'text/html; charset=' . NLS::getCharset()
-            )
-        );
-    }
-}
index a758085..8a86bca 100644 (file)
@@ -41,7 +41,7 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <dir name="Horde">
      <dir name="Mime">
       <dir name="Viewer">
-       <dir name="ooo">
+       <dir name="Ooo">
         <file name="common.xsl" role="php" />
         <file name="global_document.xsl" role="php" />
         <file name="main_html.xsl" role="php" />
@@ -53,40 +53,40 @@ http://pear.php.net/dtd/package-2.0.xsd">
         <file name="table_cells.xsl" role="php" />
         <file name="table_columns.xsl" role="php" />
         <file name="table_rows.xsl" role="php" />
-       </dir> <!-- /lib/Horde/Mime/Viewer/ooo -->
+       </dir> <!-- /lib/Horde/Mime/Viewer/Ooo -->
+       <file name="Audio.php" role="php" />
+       <file name="Css.php" role="php" />
+       <file name="Deb.php" role="php" />
+       <file name="Default.php" role="php" />
        <file name="Driver.php" role="php" />
-       <file name="audio.php" role="php" />
-       <file name="css.php" role="php" />
-       <file name="deb.php" role="php" />
-       <file name="default.php" role="php" />
-       <file name="enriched.php" role="php" />
-       <file name="enscript.php" role="php" />
-       <file name="html.php" role="php" />
-       <file name="images.php" role="php" />
-       <file name="msexcel.php" role="php" />
-       <file name="mspowerpoint.php" role="php" />
-       <file name="msword.php" role="php" />
-       <file name="ooo.php" role="php" />
-       <file name="pdf.php" role="php" />
-       <file name="php.php" role="php" />
-       <file name="plain.php" role="php" />
-       <file name="rar.php" role="php" />
-       <file name="report.php" role="php" />
-       <file name="rfc822.php" role="php" />
-       <file name="richtext.php" role="php" />
-       <file name="rpm.php" role="php" />
-       <file name="rtf.php" role="php" />
-       <file name="security.php" role="php" />
-       <file name="simple.php" role="php" />
-       <file name="smil.php" role="php" />
-       <file name="source.php" role="php" />
-       <file name="srchighlite.php" role="php" />
-       <file name="tgz.php" role="php" />
-       <file name="tnef.php" role="php" />
-       <file name="vcard.php" role="php" />
-       <file name="webcpp.php" role="php" />
-       <file name="wordperfect.php" role="php" />
-       <file name="zip.php" role="php" />
+       <file name="Enriched.php" role="php" />
+       <file name="Enscript.php" role="php" />
+       <file name="Html.php" role="php" />
+       <file name="Images.php" role="php" />
+       <file name="Msexcel.php" role="php" />
+       <file name="Mspowerpoint.php" role="php" />
+       <file name="Msword.php" role="php" />
+       <file name="Ooo.php" role="php" />
+       <file name="Pdf.php" role="php" />
+       <file name="Php.php" role="php" />
+       <file name="Plain.php" role="php" />
+       <file name="Rar.php" role="php" />
+       <file name="Report.php" role="php" />
+       <file name="Rfc822.php" role="php" />
+       <file name="Richtext.php" role="php" />
+       <file name="Rpm.php" role="php" />
+       <file name="Rtf.php" role="php" />
+       <file name="Security.php" role="php" />
+       <file name="Simple.php" role="php" />
+       <file name="Smil.php" role="php" />
+       <file name="Source.php" role="php" />
+       <file name="Srchighlite.php" role="php" />
+       <file name="Tgz.php" role="php" />
+       <file name="Tnef.php" role="php" />
+       <file name="Vcard.php" role="php" />
+       <file name="Webcpp.php" role="php" />
+       <file name="Wordperfect.php" role="php" />
+       <file name="Zip.php" role="php" />
       </dir> <!-- /lib/Horde/Mime/Viewer -->
       <file name="Address.php" role="php" />
       <file name="Exception.php" role="php" />
@@ -147,10 +147,6 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <channel>pecl.php.net</channel>
    </package>
    <package>
-    <name>Auth</name>
-    <channel>pear.horde.org</channel>
-   </package>
-   <package>
     <name>Horde_Browser</name>
     <channel>pear.horde.org</channel>
    </package>
@@ -167,10 +163,6 @@ http://pear.php.net/dtd/package-2.0.xsd">
     <channel>pear.horde.org</channel>
    </package>
    <package>
-    <name>Horde_SessionObjects</name>
-    <channel>pear.horde.org</channel>
-   </package>
-   <package>
     <name>Horde_Text_Filter</name>
     <channel>pear.horde.org</channel>
    </package>
@@ -189,39 +181,39 @@ http://pear.php.net/dtd/package-2.0.xsd">
    <install name="lib/Horde/Mime/Viewer/ooo/table_cells.xsl" as="Horde/Mime/Viewer/ooo/table_cells.xsl" />
    <install name="lib/Horde/Mime/Viewer/ooo/table_columns.xsl" as="Horde/Mime/Viewer/ooo/table_columns.xsl" />
    <install name="lib/Horde/Mime/Viewer/ooo/table_rows.xsl" as="Horde/Mime/Viewer/ooo/table_rows.xsl" />
+   <install name="lib/Horde/Mime/Viewer/Audio.php" as="Horde/Mime/Viewer/Audio.php" />
+   <install name="lib/Horde/Mime/Viewer/Css.php" as="Horde/Mime/Viewer/Css.php" />
+   <install name="lib/Horde/Mime/Viewer/Deb.php" as="Horde/Mime/Viewer/Deb.php" />
+   <install name="lib/Horde/Mime/Viewer/Default.php" as="Horde/Mime/Viewer/Default.php" />
    <install name="lib/Horde/Mime/Viewer/Driver.php" as="Horde/Mime/Viewer/Driver.php" />
-   <install name="lib/Horde/Mime/Viewer/audio.php" as="Horde/Mime/Viewer/audio.php" />
-   <install name="lib/Horde/Mime/Viewer/css.php" as="Horde/Mime/Viewer/css.php" />
-   <install name="lib/Horde/Mime/Viewer/deb.php" as="Horde/Mime/Viewer/deb.php" />
-   <install name="lib/Horde/Mime/Viewer/default.php" as="Horde/Mime/Viewer/default.php" />
-   <install name="lib/Horde/Mime/Viewer/enriched.php" as="Horde/Mime/Viewer/enriched.php" />
-   <install name="lib/Horde/Mime/Viewer/enscript.php" as="Horde/Mime/Viewer/enscript.php" />
-   <install name="lib/Horde/Mime/Viewer/html.php" as="Horde/Mime/Viewer/html.php" />
-   <install name="lib/Horde/Mime/Viewer/images.php" as="Horde/Mime/Viewer/images.php" />
-   <install name="lib/Horde/Mime/Viewer/msexcel.php" as="Horde/Mime/Viewer/msexcel.php" />
-   <install name="lib/Horde/Mime/Viewer/mspowerpoint.php" as="Horde/Mime/Viewer/mspowerpoint.php" />
-   <install name="lib/Horde/Mime/Viewer/msword.php" as="Horde/Mime/Viewer/msword.php" />
-   <install name="lib/Horde/Mime/Viewer/ooo.php" as="Horde/Mime/Viewer/ooo.php" />
-   <install name="lib/Horde/Mime/Viewer/pdf.php" as="Horde/Mime/Viewer/pdf.php" />
-   <install name="lib/Horde/Mime/Viewer/php.php" as="Horde/Mime/Viewer/php.php" />
-   <install name="lib/Horde/Mime/Viewer/plain.php" as="Horde/Mime/Viewer/plain.php" />
-   <install name="lib/Horde/Mime/Viewer/rar.php" as="Horde/Mime/Viewer/rar.php" />
-   <install name="lib/Horde/Mime/Viewer/report.php" as="Horde/Mime/Viewer/report.php" />
-   <install name="lib/Horde/Mime/Viewer/rfc822.php" as="Horde/Mime/Viewer/rfc822.php" />
-   <install name="lib/Horde/Mime/Viewer/richtext.php" as="Horde/Mime/Viewer/richtext.php" />
-   <install name="lib/Horde/Mime/Viewer/rpm.php" as="Horde/Mime/Viewer/rpm.php" />
-   <install name="lib/Horde/Mime/Viewer/rtf.php" as="Horde/Mime/Viewer/rtf.php" />
-   <install name="lib/Horde/Mime/Viewer/security.php" as="Horde/Mime/Viewer/security.php" />
-   <install name="lib/Horde/Mime/Viewer/simple.php" as="Horde/Mime/Viewer/simple.php" />
-   <install name="lib/Horde/Mime/Viewer/smil.php" as="Horde/Mime/Viewer/smil.php" />
-   <install name="lib/Horde/Mime/Viewer/source.php" as="Horde/Mime/Viewer/source.php" />
-   <install name="lib/Horde/Mime/Viewer/srchighlite.php" as="Horde/Mime/Viewer/srchighlite.php" />
-   <install name="lib/Horde/Mime/Viewer/tgz.php" as="Horde/Mime/Viewer/tgz.php" />
-   <install name="lib/Horde/Mime/Viewer/tnef.php" as="Horde/Mime/Viewer/tnef.php" />
-   <install name="lib/Horde/Mime/Viewer/vcard.php" as="Horde/Mime/Viewer/vcard.php" />
-   <install name="lib/Horde/Mime/Viewer/webcpp.php" as="Horde/Mime/Viewer/webcpp.php" />
-   <install name="lib/Horde/Mime/Viewer/wordperfect.php" as="Horde/Mime/Viewer/wordperfect.php" />
-   <install name="lib/Horde/Mime/Viewer/zip.php" as="Horde/Mime/Viewer/zip.php" />
+   <install name="lib/Horde/Mime/Viewer/Enriched.php" as="Horde/Mime/Viewer/Enriched.php" />
+   <install name="lib/Horde/Mime/Viewer/Enscript.php" as="Horde/Mime/Viewer/Enscript.php" />
+   <install name="lib/Horde/Mime/Viewer/Html.php" as="Horde/Mime/Viewer/Html.php" />
+   <install name="lib/Horde/Mime/Viewer/Images.php" as="Horde/Mime/Viewer/Images.php" />
+   <install name="lib/Horde/Mime/Viewer/Msexcel.php" as="Horde/Mime/Viewer/Msexcel.php" />
+   <install name="lib/Horde/Mime/Viewer/Mspowerpoint.php" as="Horde/Mime/Viewer/Mspowerpoint.php" />
+   <install name="lib/Horde/Mime/Viewer/Msword.php" as="Horde/Mime/Viewer/Msword.php" />
+   <install name="lib/Horde/Mime/Viewer/Ooo.php" as="Horde/Mime/Viewer/Ooo.php" />
+   <install name="lib/Horde/Mime/Viewer/Pdf.php" as="Horde/Mime/Viewer/Pdf.php" />
+   <install name="lib/Horde/Mime/Viewer/Php.php" as="Horde/Mime/Viewer/Php.php" />
+   <install name="lib/Horde/Mime/Viewer/Plain.php" as="Horde/Mime/Viewer/Plain.php" />
+   <install name="lib/Horde/Mime/Viewer/Rar.php" as="Horde/Mime/Viewer/Rar.php" />
+   <install name="lib/Horde/Mime/Viewer/Report.php" as="Horde/Mime/Viewer/Report.php" />
+   <install name="lib/Horde/Mime/Viewer/Rfc822.php" as="Horde/Mime/Viewer/Rfc822.php" />
+   <install name="lib/Horde/Mime/Viewer/Richtext.php" as="Horde/Mime/Viewer/Richtext.php" />
+   <install name="lib/Horde/Mime/Viewer/Rpm.php" as="Horde/Mime/Viewer/Rpm.php" />
+   <install name="lib/Horde/Mime/Viewer/Rtf.php" as="Horde/Mime/Viewer/Rtf.php" />
+   <install name="lib/Horde/Mime/Viewer/Security.php" as="Horde/Mime/Viewer/Security.php" />
+   <install name="lib/Horde/Mime/Viewer/Simple.php" as="Horde/Mime/Viewer/Simple.php" />
+   <install name="lib/Horde/Mime/Viewer/Smil.php" as="Horde/Mime/Viewer/Smil.php" />
+   <install name="lib/Horde/Mime/Viewer/Source.php" as="Horde/Mime/Viewer/Source.php" />
+   <install name="lib/Horde/Mime/Viewer/Srchighlite.php" as="Horde/Mime/Viewer/Srchighlite.php" />
+   <install name="lib/Horde/Mime/Viewer/Tgz.php" as="Horde/Mime/Viewer/Tgz.php" />
+   <install name="lib/Horde/Mime/Viewer/Tnef.php" as="Horde/Mime/Viewer/Tnef.php" />
+   <install name="lib/Horde/Mime/Viewer/Vcard.php" as="Horde/Mime/Viewer/Vcard.php" />
+   <install name="lib/Horde/Mime/Viewer/Webcpp.php" as="Horde/Mime/Viewer/Webcpp.php" />
+   <install name="lib/Horde/Mime/Viewer/Wordperfect.php" as="Horde/Mime/Viewer/Wordperfect.php" />
+   <install name="lib/Horde/Mime/Viewer/Zip.php" as="Horde/Mime/Viewer/Zip.php" />
    <install name="lib/Horde/Mime/Address.php" as="Horde/Mime/Address.php" />
    <install name="lib/Horde/Mime/Exception.php" as="Horde/Mime/Exception.php" />
    <install name="lib/Horde/Mime/Headers.php" as="Horde/Mime/Headers.php" />