<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>mysite blog</title>
		<link>http://www.warringersworks.com/blog/</link>
		

		
		<item>
			<title>New Homepage</title>
			<link>http://www.warringersworks.com/new-homepage/</link>
			<description>&lt;p&gt;Well, it was some time, but I finally managed to get my new homepage up and running after a good amount of problems setting up Silverstripe CMS.&lt;/p&gt;&lt;p&gt;So... Now I can finally get to put my work up here, through I guess that I won't put up everything here.&lt;/p&gt;</description>
			<pubDate>Sun, 21 Sep 2008 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.warringersworks.com/new-homepage/</guid>
		</item>
		
		<item>
			<title>Baking Cakes with Fire</title>
			<link>http://www.warringersworks.com/baking-cakes-with-fire/</link>
			<description>&lt;p&gt;Or rather 'Baking CakePHP with FirePHP'.&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://bakery.cakephp.org/articles/view/baking-cakes-with-firephp&quot;&gt;Originally Posted at the Bakery&lt;/a&gt;

FirePHP is an extension of the well known Firefox extension Firebug. FirePHP uses the Firebug interface to handle debugging and error messanges from PHP, you just need to include a single file into your PHP code. Sadly FirePHP is PHP5 only!!&lt;/p&gt;&lt;p&gt;I have found FirePHP by pure chance and thought that it would make a very good addition to Cake, especially cleaning up the browser from the debugging messages or the SQL fields below the main view during development.&lt;/p&gt;&lt;p&gt;Of course you need some things to use FirePHP.&lt;/p&gt;&lt;p&gt;   1. Firefox 2 or 3(I guess everyone knows where to find it... :) )&lt;br /&gt;   2. Firebug &lt;a href=&quot;http://getfirebug.com/&quot;&gt;http://getfirebug.com/&lt;/a&gt; 1.0 or 1.1 for Firefox 2, 1.2 for Firefox 3&lt;br /&gt;   3. FirePHP plugin for Firebug &lt;a href=&quot;https://addons.mozilla.org/en-US/firefox/addon/6149&quot;&gt;https://addons.mozilla.org/en-US/firefox/addon/6149&lt;/a&gt; or &lt;a href=&quot;http://www.firephp.org/&quot;&gt;http://www.firephp.org/&lt;/a&gt;
   4. FirePHP Core library for PHP &lt;a href=&quot;http://www.firephp.org/&quot;&gt;http://www.firephp.org/&lt;/a&gt;

For general information about FirePHP you should visit &lt;a href=&quot;http://www.firephp.org/&quot;&gt;http://www.firephp.org/&lt;/a&gt; anyway.&lt;/p&gt;&lt;p&gt;Please note that the following way to use FirePHP is very basic at the moment and pretty much not more than a quick 'hack'.&lt;/p&gt;&lt;p&gt;The first is to put the file &lt;em&gt;FirePHP.class.php&lt;/em&gt; into &lt;em&gt;/app/vendors&lt;/em&gt; folder.&lt;/p&gt;&lt;p&gt;The next if to make a copy of &lt;em&gt;dbo_source.php&lt;/em&gt; and put it into &lt;em&gt;/app/models/datasources&lt;/em&gt; to keep the core of Cake untouched.&lt;/p&gt;&lt;p&gt;Now you just need to replace &lt;em&gt;showLog()&lt;/em&gt; in your copy of &lt;em&gt;dbo_source.php&lt;/em&gt; with the following.&lt;br /&gt;&lt;pre class=&quot;sh_php&quot;&gt;&amp;lt;?php &lt;br /&gt;/**&lt;br /&gt; * Outputs the contents of the queries log.&lt;br /&gt; *&lt;br /&gt; * @param boolean $sorted&lt;br /&gt; */&lt;br /&gt;    function showLog($sorted = false) {&lt;br /&gt;        if ($sorted) {&lt;br /&gt;            $log = sortByKey($this-&amp;gt;_queriesLog, 'took', 'desc', SORT_NUMERIC);&lt;br /&gt;        } else {&lt;br /&gt;            $log = $this-&amp;gt;_queriesLog;&lt;br /&gt;        }&lt;/p&gt;&lt;p&gt;        if ($this-&amp;gt;_queriesCnt &amp;gt; 1) {&lt;br /&gt;            $text = 'queries';&lt;br /&gt;        } else {&lt;br /&gt;            $text = 'query';&lt;br /&gt;        }&lt;/p&gt;&lt;p&gt;        if (php_sapi_name() != 'cli') {&lt;br /&gt;            $summery = &quot;{$this-&amp;gt;_queriesCnt} {$text} took {$this-&amp;gt;_queriesTime} ms&quot;;&lt;br /&gt;            $header = array(&quot;Nr&quot;, &quot;Query&quot;, &quot;Error&quot;, &quot;Affected&quot;, &quot;Num. rows&quot;, &quot;Took (ms)&quot;);&lt;br /&gt;            $body = array($header);&lt;br /&gt;            foreach ($log as $k =&amp;gt; $i) {&lt;br /&gt;                $row = array(($k + 1), $i['query'], $i['error'], $i['affected'], $i['numRows'], $i['took']);&lt;br /&gt;                $body[] = $row;&lt;br /&gt;                }&lt;br /&gt;            fb(array($summery, $body), FirePHP::TABLE);&lt;br /&gt;            } else {&lt;br /&gt;            foreach ($log as $k =&amp;gt; $i) {&lt;br /&gt;                print (($k + 1) . &quot;. {$i['query']} {$i['error']}\n&quot;);&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;?&amp;gt; &lt;/pre&gt;

Next you modify your &lt;em&gt;bootstrap.php&lt;/em&gt; with the following:&lt;br /&gt;&lt;pre class=&quot;sh_php&quot;&gt;&amp;lt;?php &lt;br /&gt;   ob_start();&lt;br /&gt;   App:: import ( 'Vendor', 'FirePHP', array ( 'file' =&amp;gt; 'FirePHP.class.php'));&lt;br /&gt;   function fb() &lt;br /&gt;   {&lt;br /&gt;     $instance = FirePHP::getInstance(true);&lt;br /&gt;     $args = func_get_args();&lt;br /&gt;     return call_user_func_array(array($instance,'fb'),$args);&lt;br /&gt;     return true;&lt;br /&gt;   }&lt;br /&gt;?&amp;gt; &lt;/pre&gt;

FirePHP requires output buffering and fb() is for convenience... :)&lt;/p&gt;&lt;p&gt;Now enjoy your baking with some more fire...&lt;/p&gt;&lt;p&gt;Through of course other Debugging can be done with FirePHP as well, aside from logging Database access, like in this example.&lt;/p&gt;&lt;p&gt;I'm pretty sure it can be turned into a Plugin, but I have to say that I'm a little to new to Cake to be able to create one... &lt;/p&gt;</description>
			<pubDate>Mon, 22 Sep 2008 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.warringersworks.com/baking-cakes-with-fire/</guid>
		</item>
		
		<item>
			<title>Homepage nearly finshed</title>
			<link>http://www.warringersworks.com/homepage-nearly-finshed/</link>
			<description>&lt;p&gt;Well... It looks like I finally finished migrating my old homepage to this new homepage.&lt;/p&gt;</description>
			<pubDate>Wed, 24 Sep 2008 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.warringersworks.com/homepage-nearly-finshed/</guid>
		</item>
		
		<item>
			<title>Baking Cakes with Fire II</title>
			<link>http://www.warringersworks.com/Baking-Cakes-with-Fire-II/</link>
			<description>&lt;p&gt;I would have never thought that people would expand on an idea I had, but it seems that FirePHP was a good find and got some people to thing about debugging with it and so Heath Nail over at the &lt;a href=&quot;http://bakery.cakephp.org&quot;&gt;Bakery&lt;/a&gt; build a &lt;a href=&quot;http://bakery.cakephp.org/articles/view/debugging-with-firephp&quot;&gt;Debugger Handler&lt;/a&gt; for CakePHP.&lt;/p&gt;</description>
			<pubDate>Thu, 25 Sep 2008 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.warringersworks.com/Baking-Cakes-with-Fire-II/</guid>
		</item>
		
		<item>
			<title>Reading OpenDocuments with CakePHP</title>
			<link>http://www.warringersworks.com/Reading-OpenDocuments-with-CakePHP/</link>
			<description>&lt;p&gt;On my quest to find a simple way to read the contents of an *.odt OpenDocument Text file, better known as OpenOffice Writer files, I stumbled over a simple class that, in combination with a xsl template, converts an *.odt file to XHTML.&lt;/p&gt;&lt;p&gt;The original sourcecode of the class can be found here: &lt;a href=&quot;http://www.phpclasses.org/browse/package/3071.html&quot;&gt;http://www.phpclasses.org/browse/package/3071.html&lt;/a&gt;

The following rextensions are needed by the Server:&lt;/p&gt;&lt;p&gt;&lt;ol&gt;&lt;li&gt;Zip&lt;/li&gt;&lt;li&gt;DOM/XML&lt;/li&gt;&lt;li&gt;XSL&lt;/li&gt;&lt;/ol&gt;

I needed to modify the sourcecode of the class a little, since I placed both the &lt;em&gt;odt2xhtml.php&lt;/em&gt; and &lt;em&gt;template.xsl&lt;/em&gt; into the &lt;em&gt;app/vendors&lt;/em&gt; folder.&lt;/p&gt;&lt;p&gt;&lt;em&gt;odt2xhtml.php&lt;/em&gt;
&lt;pre class=&quot;sh_php&quot;&gt;
&amp;lt;?php&lt;br /&gt;class Odt2Xhtml {
    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public function oo_unzip($file, $path = false)&lt;br /&gt;    {&lt;br /&gt;    &amp;nbsp;&amp;nbsp;&amp;nbsp;if(!function_exists('zip_open'))&lt;br /&gt;        {&lt;br /&gt;            throw new Exception('NO ZIP FUNCTIONS DETECTED. Do you have the PECL ZIP extensions loaded?');&lt;br /&gt;        }&lt;br /&gt;        if(!is_file($file))&lt;br /&gt;        {&lt;br /&gt;            throw new Exception('Can\'t find file: '.$file);&lt;br /&gt;        }&lt;br /&gt;        if($zip = zip_open($file))&lt;br /&gt;        {&lt;br /&gt;            while ($zip_entry = zip_read($zip))&lt;br /&gt;            {&lt;br /&gt;                $filename = zip_entry_name($zip_entry);&lt;br /&gt;                if(zip_entry_name($zip_entry) == 'content.xml' and zip_entry_open($zip, $zip_entry, &quot;r&quot;))&lt;br /&gt;                {&lt;br /&gt;                    $content = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));&lt;br /&gt;                    zip_entry_close($zip_entry);&lt;br /&gt;                }&lt;br /&gt;                if(ereg('Pictures/', $filename) and !ereg('Object', $filename)  and zip_entry_open($zip, $zip_entry, &quot;r&quot;))&lt;br /&gt;                {&lt;br /&gt;                    $img[$filename] = zip_entry_read($zip_entry, zip_entry_filesize($zip_entry));&lt;br /&gt;                    zip_entry_close($zip_entry);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            if(isset($content))&lt;br /&gt;            {&lt;br /&gt;                if(!empty($img) &amp;amp;&amp;amp; is_array($img))&lt;br /&gt;                {&lt;br /&gt;                    if(!is_dir($path.'Pictures'))&lt;br /&gt;                    {&lt;br /&gt;                        mkdir($path.'Pictures');&lt;br /&gt;                    }&lt;br /&gt;                    foreach($img as $key =&amp;gt; $val)&lt;br /&gt;                    {&lt;br /&gt;                        file_put_contents($path.$key, $val);&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;                return $content;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;    }
    &lt;br /&gt;    public function oo_convert($xml)&lt;br /&gt;    {&lt;br /&gt;        $xls = new DOMDocument;&lt;br /&gt;        $xls-&amp;gt;load('../vendors/template.xsl');&lt;br /&gt;        $xslt = new XSLTProcessor;&lt;br /&gt;        $xslt-&amp;gt;importStylesheet($xls);
        &lt;br /&gt;        $x = preg_replace('#&amp;lt;draw:image xlink:href=&quot;Pictures/([a-z .A-Z_0-9]*)&quot; (.*?)/&amp;gt;#es', &quot;ODT2XHTML::makeImage('\\1')&quot;, $xml);
        &lt;br /&gt;        $xml = new DOMDocument;&lt;br /&gt;        $xml-&amp;gt;loadXML($x);&lt;br /&gt;        return html_entity_decode($xslt-&amp;gt;transformToXML($xml));&lt;br /&gt;    }
    &lt;br /&gt;    public function makeImage($img)&lt;br /&gt;    {&lt;br /&gt;        return '&amp;amp;lt;img src=&quot;Pictures/'.$img.'&quot; border=&quot;0&quot; /&amp;amp;gt;';&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;

&lt;em&gt;template.xsl&lt;/em&gt;
&lt;pre class=&quot;sh_html&quot;&gt;
&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;This file is dual-licensed.&lt;br /&gt; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - &lt;br /&gt;LGPL:&lt;br /&gt;    This stylesheet converts OpenDocument text files to XHTML.&lt;br /&gt;    Copyright (C) 2005-2006 J. David Eisenberg&lt;/p&gt;&lt;p&gt;    This library is free software; you can redistribute it and/or&lt;br /&gt;    modify it under the terms of the GNU Lesser General Public&lt;br /&gt;    License as published by the Free Software Foundation; either&lt;br /&gt;    version 2.1 of the License, or (at your option) any later version.&lt;/p&gt;&lt;p&gt;    This library is distributed in the hope that it will be useful,&lt;br /&gt;    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU&lt;br /&gt;    Lesser General Public License for more details.&lt;/p&gt;&lt;p&gt;    You should have received a copy of the GNU Lesser General Public&lt;br /&gt;    License along with this library; if not, write to the Free Software&lt;br /&gt;    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Author: J. David Eisenberg&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Contact: &lt;a href=&quot;mailto:catcode@catcode.com&quot;&gt;catcode@catcode.com&lt;/a&gt;
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - &lt;br /&gt; Apache 2.0&lt;br /&gt;  Licensed under the Apache License, Version 2.0 (the &quot;License&quot;);&lt;br /&gt;  you may not use this file except in compliance with the License.&lt;br /&gt;  You may obtain a copy of the License at&lt;/p&gt;&lt;p&gt;      &lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0&quot;&gt;http://www.apache.org/licenses/LICENSE-2.0&lt;/a&gt;

  Unless required by applicable law or agreed to in writing, software&lt;br /&gt;  distributed under the License is distributed on an &quot;AS IS&quot; BASIS,&lt;br /&gt;  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.&lt;br /&gt;  See the License for the specific language governing permissions and&lt;br /&gt;  limitations under the License.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:stylesheet version=&quot;1.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:xsl=&quot;http://www.w3.org/1999/XSL/Transform&quot;&lt;br /&gt;    xmlns:office=&quot;urn:oasis:names:tc:opendocument:xmlns:office:1.0&quot;&lt;br /&gt;    xmlns:meta=&quot;urn:oasis:names:tc:opendocument:xmlns:meta:1.0&quot;&lt;br /&gt;    xmlns:config=&quot;urn:oasis:names:tc:opendocument:xmlns:config:1.0&quot;&lt;br /&gt;    xmlns:text=&quot;urn:oasis:names:tc:opendocument:xmlns:text:1.0&quot;&lt;br /&gt;    xmlns:table=&quot;urn:oasis:names:tc:opendocument:xmlns:table:1.0&quot;&lt;br /&gt;    xmlns:draw=&quot;urn:oasis:names:tc:opendocument:xmlns:drawing:1.0&quot;&lt;br /&gt;    xmlns:presentation=&quot;urn:oasis:names:tc:opendocument:xmlns:presentation:1.0&quot;&lt;br /&gt;    xmlns:dr3d=&quot;urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0&quot;&lt;br /&gt;    xmlns:chart=&quot;urn:oasis:names:tc:opendocument:xmlns:chart:1.0&quot;&lt;br /&gt;    xmlns:form=&quot;urn:oasis:names:tc:opendocument:xmlns:form:1.0&quot;&lt;br /&gt;    xmlns:script=&quot;urn:oasis:names:tc:opendocument:xmlns:script:1.0&quot;&lt;br /&gt;    xmlns:style=&quot;urn:oasis:names:tc:opendocument:xmlns:style:1.0&quot;&lt;br /&gt;    xmlns:number=&quot;urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0&quot;&lt;br /&gt;    xmlns:anim=&quot;urn:oasis:names:tc:opendocument:xmlns:animation:1.0&quot;&lt;/p&gt;&lt;p&gt;    xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot;&lt;br /&gt;    xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot;&lt;br /&gt;    xmlns:math=&quot;http://www.w3.org/1998/Math/MathML&quot;&lt;br /&gt;    xmlns:xforms=&quot;http://www.w3.org/2002/xforms&quot;&lt;/p&gt;&lt;p&gt;    xmlns:fo=&quot;urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0&quot;&lt;br /&gt;    xmlns:svg=&quot;urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0&quot;&lt;br /&gt;    xmlns:smil=&quot;urn:oasis:names:tc:opendocument:xmlns:smil-compatible:1.0&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:ooo=&quot;http://openoffice.org/2004/office&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:ooow=&quot;http://openoffice.org/2004/writer&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:oooc=&quot;http://openoffice.org/2004/calc&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;xmlns:int=&quot;http://catcode.com/odf_to_xhtml/internal&quot;&lt;br /&gt;    xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;exclude-result-prefixes=&quot;office meta config text table draw presentation&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dr3d chart form script style number anim dc xlink math xforms fo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;svg smil ooo ooow oooc int #default&quot;&lt;br /&gt;&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:output&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;method=&quot;xml&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;indent=&quot;yes&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;omit-xml-declaration=&quot;yes&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;doctype-public=&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;doctype-system=&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;encoding=&quot;UTF-8&quot;&lt;br /&gt;/&amp;gt;&lt;br /&gt;&amp;lt;xsl:variable name=&quot;lineBreak&quot;&amp;gt;&amp;lt;xsl:text&amp;gt;&lt;br /&gt;&amp;lt;/xsl:text&amp;gt;&amp;lt;/xsl:variable&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:key name=&quot;listTypes&quot; match=&quot;text:list-style&quot; use=&quot;@style:name&quot;/&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;/office:document-content&quot;&amp;gt;&lt;br /&gt;&amp;lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&amp;gt;&lt;br /&gt;&amp;lt;head&amp;gt;&lt;br /&gt;&amp;lt;title&amp;gt;Converted by odt_to_xhtml.xsl&amp;lt;/title&amp;gt;&lt;br /&gt;&amp;lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html;charset=utf-8&quot; /&amp;gt;&lt;br /&gt;&amp;lt;xsl:apply-templates select=&quot;office:automatic-styles&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/head&amp;gt;&lt;br /&gt;&amp;lt;body&amp;gt;&lt;br /&gt;&amp;lt;xsl:apply-templates select=&quot;office:body/office:text&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;This section of the transformation handles styles in the&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;content.xml file&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match=&quot;office:automatic-styles&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;style type=&quot;text/css&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/style&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;style:style&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:family='table'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;process-table-style&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:family='table-column'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;process-table-column-style&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:family='table-cell'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;process-table-cell-style&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:family='paragraph'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;process-paragraph-style&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:family='text'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;process-text-style&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;process-table-style&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;style:table-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;.&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;translate(@style:name,'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;{width: &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;style:table-properties/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@style:width&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;}&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;process-table-column-style&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;style:table-column-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;.&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;translate(@style:name,'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;{width: &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;style:table-column-properties/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@style:column-width&quot;/&amp;gt;&amp;lt;xsl:text&amp;gt;;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;handle-style-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name=&quot;nodeSet&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select=&quot;style:table-properties&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;}&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;process-table-cell-style&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;style:table-cell-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;.&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;translate(@style:name,'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;{&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;handle-style-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name=&quot;nodeSet&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select=&quot;style:table-cell-properties&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;}&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;process-paragraph-style&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;style:paragraph-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;.&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;translate(@style:name,'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;{&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;handle-style-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name=&quot;nodeSet&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select=&quot;style:paragraph-properties&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;}&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;process-text-style&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;style:text-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;.&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;translate(@style:name,'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;{&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;handle-style-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name=&quot;nodeSet&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select=&quot;style:text-properties&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;}&amp;lt;/xsl:text&amp;gt;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;handle-style-properties&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name=&quot;nodeSet&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:for-each select=&quot;$nodeSet/@*&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;this&quot; select=&quot;.&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;find&quot; select=&quot;document('')/xsl:stylesheet/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;int:attr-map/int:attr[@name=name($this)]&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;$find&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;action&quot; select=&quot;$find/@action&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;$action='pass-through'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;$action='check-align'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;check-align&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;pass-through&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;local-name()&quot;/&amp;gt;&amp;lt;xsl:text&amp;gt;: &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;.&quot;/&amp;gt;&amp;lt;xsl:text&amp;gt;;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;check-align&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;local-name()&quot;/&amp;gt;&amp;lt;xsl:text&amp;gt;: &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;.='start'&quot;&amp;gt;&amp;lt;xsl:text&amp;gt;left&amp;lt;/xsl:text&amp;gt;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;.='end'&quot;&amp;gt;&amp;lt;xsl:text&amp;gt;right&amp;lt;/xsl:text&amp;gt;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;&amp;lt;xsl:value-of select=&quot;.&quot;/&amp;gt;&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:list-level-style-bullet&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;.&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;../@style:name&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;_&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@text:level&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;{ list-style-type: &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@text:level mod 3 = 1&quot;&amp;gt;disc&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@text:level mod 3 = 2&quot;&amp;gt;circle&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@text:level mod 3 = 0&quot;&amp;gt;square&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;decimal&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;;}&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:list-level-style-number&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;.&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;../@style:name&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;_&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@text:level&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;{ list-style-type: &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:num-format='1'&quot;&amp;gt;decimal&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:num-format='I'&quot;&amp;gt;upper-roman&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:num-format='i'&quot;&amp;gt;lower-roman&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:num-format='A'&quot;&amp;gt;upper-alpha&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@style:num-format='a'&quot;&amp;gt;lower-alpha&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;decimal&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text&amp;gt;;}&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;$lineBreak&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --&amp;gt;&lt;br /&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;This section of the transformation handles the true content&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;elements in the content.xml file&lt;br /&gt;--&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Yes, paragraphs in ODT really produce a &amp;lt;div&amp;gt; in XHTML,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;because an ODT paragraph has no extra line spacing.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match=&quot;text:p&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class=&quot;{translate(@text:style-name,'.','_')}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;count(node())=0&quot;&amp;gt;&amp;lt;br /&amp;gt;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:span&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;span class=&quot;{translate(@text:style-name,'.','_')}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/span&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:h&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- Heading levels go only to 6 in XHTML --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;level&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@text:outline-level &amp;amp;gt; 6&quot;&amp;gt;6&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@text:outline-level&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:element name=&quot;{concat('h', $level)}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:attribute name=&quot;class&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select=&quot;translate(@text:style-name,'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:element&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;When processing a list, you have to look at the parent style&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*and* level of nesting&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match=&quot;text:list&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;level&quot; select=&quot;count(ancestor::text:list)+1&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- the list class is the @text:style-name of the outermost&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;text:list&amp;gt; element --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;listClass&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;$level=1&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@text:style-name&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ancestor::text:list[last()]/@text:style-name&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- Now select the &amp;lt;text:list-level-style-foo&amp;gt; element at this&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;level of nesting for this list --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;node&quot; select=&quot;key('listTypes',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$listClass)/*[@text:level='$level']&quot;/&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;!-- emit appropriate list type --&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;local-name($node)='list-level-style-number'&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ol class=&quot;{concat($listClass,'_',$level)}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ol&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ul class=&quot;{concat($listClass,'_',$level)}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:list-item&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li&amp;gt;&amp;lt;xsl:apply-templates/&amp;gt;&amp;lt;/li&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;table:table&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table class=&quot;{@table:style-name}&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;colgroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select=&quot;table:table-column&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/colgroup&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;table:table-header-rows/table:table-row&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;thead&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;select=&quot;table:table-header-rows/table:table-row&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/thead&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select=&quot;table:table-row&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tbody&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;table:table-column&quot;&amp;gt;&lt;br /&gt;&amp;lt;col&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;@table:number-columns-repeated&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:attribute name=&quot;span&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@table:number-columns-repeated&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;@table:style-name&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:attribute name=&quot;class&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;translate(@table:style-name,'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/col&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;table:table-row&quot;&amp;gt;&lt;br /&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates select=&quot;table:table-cell&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;table:table-cell&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:variable name=&quot;n&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:when test=&quot;@table:number-columns-repeated != 0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@table:number-columns-repeated&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:otherwise&amp;gt;1&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:variable&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;process-table-cell&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name=&quot;n&quot; select=&quot;$n&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;process-table-cell&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:param name=&quot;n&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;$n != 0&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;@table:style-name&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:attribute name=&quot;class&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;translate(@table:style-name,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'.','_')&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;@table:number-columns-spanned&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:attribute name=&quot;colspan&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@table:number-columns-spanned&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;@table:number-rows-spanned&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:attribute name=&quot;rowspan&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;@table:number-rows-spanned&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:apply-templates/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:call-template name=&quot;process-table-cell&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:with-param name=&quot;n&quot; select=&quot;$n - 1&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:tab&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:text xml:space=&quot;preserve&quot;&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:text&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:line-break&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br /&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:variable name=&quot;spaces&quot;&lt;br /&gt;    xml:space=&quot;preserve&quot;&amp;gt;                              &amp;lt;/xsl:variable&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:s&quot;&amp;gt;&lt;br /&gt;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;    &amp;lt;xsl:when test=&quot;@text:c&quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&quot;insert-spaces&quot;&amp;gt;&lt;br /&gt;            &amp;lt;xsl:with-param name=&quot;n&quot; select=&quot;@text:c&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:when&amp;gt;&lt;br /&gt;    &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;xsl:text&amp;gt; &amp;lt;/xsl:text&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template name=&quot;insert-spaces&quot;&amp;gt;&lt;br /&gt;&amp;lt;xsl:param name=&quot;n&quot;/&amp;gt;&lt;br /&gt;&amp;lt;xsl:choose&amp;gt;&lt;br /&gt;    &amp;lt;xsl:when test=&quot;$n &amp;amp;lt;= 30&quot;&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&quot;substring($spaces, 1, $n)&quot;/&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:when&amp;gt;
    &lt;br /&gt;    &amp;lt;xsl:otherwise&amp;gt;&lt;br /&gt;        &amp;lt;xsl:value-of select=&quot;$spaces&quot;/&amp;gt;&lt;br /&gt;        &amp;lt;xsl:call-template name=&quot;insert-spaces&quot;&amp;gt;&lt;br /&gt;            &amp;lt;xsl:with-param name=&quot;n&quot;&amp;gt;&lt;br /&gt;                &amp;lt;xsl:value-of select=&quot;$n - 30&quot;/&amp;gt;&lt;br /&gt;            &amp;lt;/xsl:with-param&amp;gt;&lt;br /&gt;        &amp;lt;/xsl:call-template&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;&amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;xsl:template match=&quot;text:a&quot;&amp;gt;&lt;br /&gt;&amp;lt;a href=&quot;{@xlink:href}&quot;&amp;gt;&amp;lt;xsl:apply-templates/&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;text:bookmark-start /&amp;gt; and &amp;lt;text:bookmark-end /&amp;gt; can&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;be on non-wellformed boundaries. The quickest solution is&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;to create an &amp;lt;a name=&quot;&quot;&amp;gt;&amp;lt;/a&amp;gt; element.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If you don't put in any content, it becomes an empty element,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;which will confuse browsers. While we would love to insert&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;a zero-width non-breaking space (Unicode 0x200b), Internet&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Explorer doesn't recognize it.  Hence this ugly hack:&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match=&quot;text:bookmark-start|text:bookmark&quot;&amp;gt;&lt;br /&gt;&amp;lt;a name=&quot;{@text:name}&quot;&amp;gt;&amp;lt;span style=&quot;font-size: 0px&quot;&amp;gt;&amp;lt;xsl:text&amp;gt; &amp;lt;/xsl:text&amp;gt;&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;This template is too dangerous to leave active...&lt;br /&gt;&amp;lt;xsl:template match=&quot;text()&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:if test=&quot;normalize-space(.) !=''&quot;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;xsl:value-of select=&quot;normalize-space(.)&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/xsl:if&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;--&amp;gt;&lt;/p&gt;&lt;p&gt;&amp;lt;!--&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;This is a list of fo: attributes to be transferred to the&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;output document. The action tells which template is to be&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;called to process the attribute.&lt;br /&gt;--&amp;gt;&lt;br /&gt;&amp;lt;int:attr-map&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:border-left&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:border-right&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:border-top&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:border-bottom&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:border&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:margin-left&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:margin-right&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:margin-top&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:margin-bottom&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:margin&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:padding-left&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:padding-right&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:padding-top&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:padding-bottom&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:padding&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:text-indent&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:font-variant&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:font-family&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:color&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:background-color&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:font-style&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:font-weight&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:line-height&quot; action=&quot;pass-through&quot;/&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;int:attr name=&quot;fo:text-align&quot; action=&quot;check-align&quot;/&amp;gt;&lt;br /&gt;&amp;lt;/int:attr-map&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;/pre&gt;

And of course the rather simple &lt;em&gt;odt.php&lt;/em&gt; Component to be placed into the &lt;em&gt;app/controllers/components&lt;/em&gt; Folder:&lt;/p&gt;&lt;p&gt;&lt;pre class=&quot;sh_php&quot;&gt;
&amp;lt;?php&lt;br /&gt;if(!class_exists('Odt2Xhtml')) {&lt;br /&gt;    App::import('Vendor', 'Odt2Xhtml', array ( 'file' =&amp;gt; 'odt2xhtml.php'));&lt;br /&gt;}&lt;br /&gt;class OdtComponent extends Object &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function odtContent($file, $folder = &quot;&quot;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$doc = new Odt2Xhtml;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($folder)) { $folder .= DS; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$file = WWW_ROOT . $folder . $file;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$content = $doc-&amp;gt;oo_convert($doc-&amp;gt;oo_unzip($file));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $content;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;

Using it is rather simple, as long as the file is placed into the &lt;em&gt;webroot&lt;/em&gt; Folder or a subfolder.&lt;/p&gt;&lt;p&gt;In this case a file called &lt;em&gt;test.odt&lt;/em&gt; is placed into the &lt;em&gt;webroot/files&lt;/em&gt; Folder.&lt;/p&gt;&lt;p&gt;&lt;pre class=&quot;sh_php&quot;&gt;
&amp;lt;?php&lt;br /&gt;class TestController extends AppController {&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var $name = 'Test';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var $uses = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;var $components = array('Odt');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function index()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;set('content', $this-&amp;gt;Odt-&amp;gt;odtContent('Legacy.odt', 'files'));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;</description>
			<pubDate>Mon, 06 Oct 2008 00:00:00 +0200</pubDate>
			
			
			<guid>http://www.warringersworks.com/Reading-OpenDocuments-with-CakePHP/</guid>
		</item>
		
		<item>
			<title>Comfortable AjaxUploads with CakePHP</title>
			<link>http://www.warringersworks.com/comfortable-ajaxuploads-with-cakephp/</link>
			<description>&lt;p&gt;After looking for a way to upload files the AJAX way using prototype for quite some time, I have found a very good way to do just that, makeing an internet application react more like a desktop application, without the need for forms if I don't want to. Like getting a file selection dialog when you press a button or a link.&lt;/p&gt;&lt;p&gt;I have found the script here: &lt;a href=&quot;http://valums.com/ajax-upload/&quot;&gt;http://valums.com/ajax-upload/&lt;/a&gt;

As the script doesn't really care what is used to call it up, be it prototype, jQuery or others, I have written a helper using prototype, as it is the default AJAX library used by Cake.&lt;/p&gt;&lt;p&gt;&lt;pre class=&quot;sh_php&quot;&gt;
&amp;lt;?php&lt;br /&gt;/*&lt;br /&gt; * Created on 14.04.2009&lt;br /&gt; *&lt;br /&gt; * To change the template for this generated file go to&lt;br /&gt; * Window - Preferences - PHPeclipse - PHP - Code Templates&lt;br /&gt; */&lt;/p&gt;&lt;p&gt; class AjaxuploadHelper extends AppHelper {&lt;/p&gt;&lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;var $helpers = array('Javascript', 'Ajax', 'Html');&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt; * Wrapper function generating the javascript for ajaxupload and integrating the&lt;br /&gt; * Javascript file only when the helper is actually used to save bandwidth and &lt;br /&gt; * faster rendering of the page in a browser&lt;br /&gt; * &lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$id ID of the DOM element that sould be observed to upload&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$script the basic script informations to be wrapped&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;A Javascript codeblock&lt;br /&gt; */&lt;/p&gt;&lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;function _wrapper($id, $script) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$this-&amp;gt;Javascript-&amp;gt;link('ajaxupload.js', false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$scr = implode(',', $script);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$script = &quot;document.observe(\&quot;dom:loaded\&quot;, function() {new Ajax_upload('$id',{{$scr}});});&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $this-&amp;gt;Javascript-&amp;gt;codeBlock($script);&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt; * Function to create minimal options for ajaxupload&lt;br /&gt; * &lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;array&amp;nbsp;&amp;nbsp;&amp;nbsp;$options Array with options for the upload script&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;array&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['data'] Array containing additional data to be &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transmitted&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['autoSubmit'] Submit after file selection&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['responseType'] The type of data that you're &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;expecting back from the server. Html (text) and xml are &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;detected automatically.&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;basic options for ajaxupload&lt;br /&gt; */&lt;/p&gt;&lt;p&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;function _options($options = null) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return = array();&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['data'])) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$data = $options['data'];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$ret = &quot;data: {&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach ($data as $key=&amp;gt;$value) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$retdata = &quot;$key : $value&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$ret .= $retdata.&quot;} &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return[] = $ret;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['autoSubmit'])) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return[] = &quot;autoSubmit: {$options['autoSubmit']}&quot;;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['responseType'])) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return[] = &quot;responseType: {$options['responseType']}&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt; * Function to get the url from a Cake-relative URL or array of URL parameters, &lt;br /&gt; * or external URL (starts with http://)&lt;br /&gt; * &lt;br /&gt; * @param  &amp;nbsp;&amp;nbsp;&amp;nbsp;mixed   $url Cake-relative URL or array of URL parameters, or &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;external URL (starts with http://)&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;an URL&lt;br /&gt; */&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;function _url($url) {&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;action: \&quot;&quot;.Router::url($url).&quot;\&quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;/* &lt;br /&gt; * Function to get the name for the data via the controller model of the link&lt;br /&gt; * &lt;br /&gt; * @param  &amp;nbsp;&amp;nbsp;&amp;nbsp;mixed   $url Cake-relative URL or array of URL parameters, or &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;external URL (starts with http://)&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;name of the file transfer object&lt;br /&gt; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function _name($url) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$name = Inflector::classify($url['controller']);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;name: \&quot;data[$name][File]\&quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt; * Convienience Function to the the prototype element to a DOM id&lt;br /&gt; * &lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$id ID of a DOM element&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;prototype element&lt;br /&gt; */&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function _id($id) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;$('$id')&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt; * Function to create the onSubmit function for ajaxupload&lt;br /&gt; * &lt;br /&gt; * @param &amp;nbsp;&amp;nbsp;&amp;nbsp;string &amp;nbsp;&amp;nbsp;&amp;nbsp;$id ID of the DOM element that sould be observed to upload&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;array&amp;nbsp;&amp;nbsp;&amp;nbsp;$options Array with options for the upload script&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;mixed&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['files'] Type of the files allowed to be uploaded &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'image', 'text', 'video', 'audio'&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['busy'] ID of a upload indicator element&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['disable'] Disables the element used to upload&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;generated onSubmit function&lt;br /&gt; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function _submit($id, $options) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit = &quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['files'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$files = array();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (is_array($options['files'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach ($options['files'] as $type) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$files[] = $this-&amp;gt;__files($type);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$file = implode(&quot;|&quot;, $files);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$type = implode(&quot;, &quot;, $options['files']);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$file = $this-&amp;gt;__files($options['files']);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$type = $options['files'];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit .= &quot;if (ext &amp;amp;&amp;amp; /^($file)$/.test(ext)){ } else { alert('Only $type files allowed'); return false; } &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['busy'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit .= &quot;$('{$options['busy']}').toggle; &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['disable'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit .= &quot;$id.diable; &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;onSubmit: function(file, ext){&quot;.$submit.&quot;}&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;/* &lt;br /&gt; * Convenience function to get allowed filetypes&lt;br /&gt; * &lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$filetype Type of the files allowed to be uploaded 'image', &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'text', 'video', 'audio'&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;A string to be used in a reg-ex&lt;br /&gt; */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function __files($filetype) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;switch ($filetype) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case &quot;image&quot;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return = &quot;jpg|png|jpeg|gif&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case &quot;text&quot;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return = &quot;txt|html|htm|doc|odt&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case &quot;video&quot;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return = &quot;flv&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;case &quot;music&quot;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return = &quot;mp3&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$return = &quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/p&gt;&lt;p&gt;/*&lt;br /&gt; * Function to create the onComplete function for ajaxupload&lt;br /&gt; * &lt;br /&gt; * @param &amp;nbsp;&amp;nbsp;&amp;nbsp;string &amp;nbsp;&amp;nbsp;&amp;nbsp;$id ID of the DOM element that sould be observed to upload&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;array&amp;nbsp;&amp;nbsp;&amp;nbsp;$options Array with options for the upload script&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['busy'] ID of a upload indicator element&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['disable'] Disables the element used to upload&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['update']['id'] ID of the element to be updated&lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with returned data&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['update']['reply'] Indicates of you use the &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filename or the reply to update the element, true for &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['update']['element'] type of a new element that&lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is going to be appended to the updated element&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;generated onComplete function&lt;br /&gt; */&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function _complete($id, $options) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit = &quot;&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['busy'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit .= &quot;$('{$options['busy']}').toggle; &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['disable'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit .= &quot;$id.enable; &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['update'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (is_array($options['update'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$type = $options['update']['reply']?'response':'file';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!empty($options['update']['element'])) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit .= &quot;$$('#{$options['update']['id']}')[0].insert(new Element('{$options['update']['element']}').update({$type})); &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} else {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$submit .= $this-&amp;gt;_id($options['update']['id']).&quot;.update({$type}); &quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return &quot;onComplete: function(file, response){&quot;.$submit.&quot;}&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;/*&lt;br /&gt; * Main Function for uploading using Ajaxupload&lt;br /&gt; *&lt;br /&gt; * @param &amp;nbsp;&amp;nbsp;&amp;nbsp;string &amp;nbsp;&amp;nbsp;&amp;nbsp;$button_id Id of the DOM element that sould be observed &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;to upload&lt;br /&gt; * @param  &amp;nbsp;&amp;nbsp;&amp;nbsp;mixed   $url Cake-relative URL or array of URL parameters, or &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;external URL (starts with http://)&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;array&amp;nbsp;&amp;nbsp;&amp;nbsp;$options Array with options for the upload script&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;array&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['data'] Array containing additional data to be &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transmitted&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['autoSubmit'] Submit after file selection&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['responseType'] The type of data that you're &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;expecting back from the server. Html (text) and xml are &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;detected automatically.&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;mixed&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['files'] Type of the files allowed to be &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uploaded 'image', 'text', 'video', 'audio'&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['busy'] ID of a upload indicator element&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['disable'] Disables the element used to upload&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['update']['id'] ID of the element to be updated&lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;with returned data&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;boolean&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['update']['reply'] Indicates of you use the &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;filename or the reply to update the element, true for &lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response&lt;br /&gt; * @param&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;$options['update']['element'] type of a new element that&lt;br /&gt; * &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;is going to be appended to the updated element&lt;br /&gt; * @return&amp;nbsp;&amp;nbsp;&amp;nbsp;string&amp;nbsp;&amp;nbsp;&amp;nbsp;A javascript string&lt;br /&gt;*/&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;function upload($button_id, $url, $options) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$script = $this-&amp;gt;_options($options);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$script[] = $this-&amp;gt;_url($url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$script[] = $this-&amp;gt;_name($url);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$script[] = $this-&amp;gt;_submit($this-&amp;gt;_id($button_id), $options);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$script[] = $this-&amp;gt;_complete($this-&amp;gt;_id($button_id), $options);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return $this-&amp;gt;_wrapper($button_id, $script);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt; }&lt;br /&gt;?&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/pre&gt;

It only needs the DOM ID of the element that is to be used to initiate the upload and the URL to the action handling the uploaded file, which has to be used in the Cake format.&lt;/p&gt;&lt;p&gt;A simple example:&lt;/p&gt;&lt;p&gt;&lt;pre class=&quot;sh_php&quot;&gt;
&amp;lt;?php&lt;br /&gt;echo $ajaxupload-&amp;gt;upload('upload_button', array('controller' =&amp;gt; 'image', 'action' =&amp;gt; 'upload');&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;

Or a more complex example, containing some additional data, allowed file types, a busy indicator and disabling the link/button that is used to transfer the data, as well as adding the returned data into a preexisting list.&lt;/p&gt;&lt;p&gt;&lt;pre class=&quot;sh_php&quot;&gt;
&amp;lt;?php&lt;br /&gt;$options = array(&lt;br /&gt;  'data' =&amp;gt; array(&lt;br /&gt;    'meaningless_data1' =&amp;gt; '1',&lt;br /&gt;    'meaningless_data2' =&amp;gt; 'Some data'&lt;br /&gt;  ),&lt;br /&gt;  'files' =&amp;gt; 'image',&lt;br /&gt;  'busy' =&amp;gt; 'busy_indicator',&lt;br /&gt;  'disable' =&amp;gt; true,&lt;br /&gt;  'update' =&amp;gt; array(&lt;br /&gt;    'reply' =&amp;gt; true,&lt;br /&gt;    'id' =&amp;gt; 'updatelist_id',&lt;br /&gt;    'element' =&amp;gt; 'li'&lt;br /&gt;  )&lt;br /&gt;);&lt;br /&gt;echo $ajaxupload-&amp;gt;upload('upload_button', array('controller' =&amp;gt; 'image', 'action' =&amp;gt; 'upload', $options);&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;/p&gt;</description>
			<pubDate>Thu, 01 Jan 1970 00:00:00 +0100</pubDate>
			
			
			<guid>http://www.warringersworks.com/comfortable-ajaxuploads-with-cakephp/</guid>
		</item>
		

	</channel>
</rss>
