You are viewing a plain text version of this content. The canonical link for it is here.
Posted to svn@forrest.apache.org by fe...@apache.org on 2005/11/14 08:16:57 UTC

svn commit: r344062 [1/2] - in /forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides: ./ lib/ resources/ resources/stylesheets/ resources/ui/ src/ src/documentation/ src/documentation/content/ src/documentation/content/xdocs/ s...

Author: ferdinand
Date: Sun Nov 13 23:16:11 2005
New Revision: 344062

URL: http://svn.apache.org/viewcvs?rev=344062&view=rev
Log:
SmartSlides Output Plugin for discussion and reference (adding missing code)

Added:
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/build.xml
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/forrest.properties
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/lib/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/lib/readme.txt
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/locationmap.xml
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap.org
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/stylesheets/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/stylesheets/presentation-to-slidy.xsl
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/print.css
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/show.css
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/slidy.js
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group-logo.gif   (with props)
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group.svg
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/icon.png   (with props)
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project-logo.gif   (with props)
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project.svg
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/usemap.gif   (with props)
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/index.xml
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/site.xml
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/tabs.xml
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/skinconf.xml
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/java/
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/java/readme.txt
    forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/status.xml

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/build.xml
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/build.xml?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/build.xml (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/build.xml Sun Nov 13 23:16:11 2005
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!--
+  Copyright 2002-2005 The Apache Software Foundation or its licensors,
+  as applicable.
+
+  Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<project default="docs" basedir="." name="Forrest org.apache.forrest.plugin.output.smartSlides build file">
+  <property name="plugin-name" value="org.apache.forrest.plugin.output.smartSlides"/>
+  <property name="forrest.version" value="0.8"/>
+  <property name="type" value="output"/>
+  <property name="plugin-version" value="0.1-dev"/>
+  <property name="description" value="Translate documents adhering to the smartSlide grammar to HTML-presentations based on W3Cs slidy-module."/>
+  <property name="author" value="Apache Forrest Project"/>
+  <property name="websiteURL" value="http://forrest.apache.org/docs/plugins/org.apache.forrest.plugin.output.smartSlides"/>
+  <property name="downloadURL" value="http://forrest.apache.org/plugins/"/>
+  
+  <import file="../build.xml"/>
+
+  <!-- Add any additional installation work here in the build target, for example:
+  <target name="build"
+          description="Extract the tools">
+     <unzip dest="${plugins.localDeploy-dir}/${plugin-name}/resources">
+       <fileset dir="tools">
+          <include name="pluginBionaryTools.zip"/>
+        </fileset>
+     </unzip>   
+  </target>
+  -->
+</project>
+  
+  

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/forrest.properties
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/forrest.properties?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/forrest.properties (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/forrest.properties Sun Nov 13 23:16:11 2005
@@ -0,0 +1,109 @@
+# Copyright 2002-2005 The Apache Software Foundation or its licensors,
+# as applicable.
+#
+# Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+##############
+# Properties used by forrest.build.xml for building the website
+# These are the defaults, un-comment them if you need to change them.
+##############
+
+# Prints out a summary of Forrest settings for this project
+#forrest.echo=true
+
+# Project name (used to name .war file)
+#project.name=my-project
+
+# Specifies name of Forrest skin to use
+#project.skin=tigris
+#project.skin=pelt
+
+# comma separated list, file:// is supported
+#forrest.skins.descriptors=http://forrest.apache.org/skins/skins.xml,file:///c:/myskins/skins.xml
+
+##############
+# behavioural properties
+#project.menu-scheme=tab_attributes
+#project.menu-scheme=directories
+
+##############
+# layout properties
+
+# Properties that can be set to override the default locations
+#
+# Parent properties must be set. This usually means uncommenting
+# project.content-dir if any other property using it is uncommented
+
+#project.status=status.xml
+#project.content-dir=src/documentation
+#project.raw-content-dir=${project.content-dir}/content
+#project.conf-dir=${project.content-dir}/conf
+#project.sitemap-dir=${project.content-dir}
+#project.xdocs-dir=${project.content-dir}/content/xdocs
+#project.resources-dir=${project.content-dir}/resources
+#project.stylesheets-dir=${project.resources-dir}/stylesheets
+#project.images-dir=${project.resources-dir}/images
+#project.schema-dir=${project.resources-dir}/schema
+#project.skins-dir=${project.content-dir}/skins
+#project.skinconf=${project.content-dir}/skinconf.xml
+#project.lib-dir=${project.content-dir}/lib
+#project.classes-dir=${project.content-dir}/classes
+#project.translations-dir=${project.content-dir}/translations
+
+##############
+# validation properties
+
+# This set of properties determine if validation is performed
+# Values are inherited unless overridden.
+# e.g. if forrest.validate=false then all others are false unless set to true.
+#forrest.validate=true
+#forrest.validate.xdocs=${forrest.validate}
+#forrest.validate.skinconf=${forrest.validate}
+#forrest.validate.sitemap=${forrest.validate}
+#forrest.validate.stylesheets=${forrest.validate}
+#forrest.validate.skins=${forrest.validate}
+#forrest.validate.skins.stylesheets=${forrest.validate.skins}
+
+# *.failonerror=(true|false) - stop when an XML file is invalid
+#forrest.validate.failonerror=true
+
+# *.excludes=(pattern) - comma-separated list of path patterns to not validate
+# e.g.
+#forrest.validate.xdocs.excludes=samples/subdir/**, samples/faq.xml
+#forrest.validate.xdocs.excludes=
+
+
+##############
+# General Forrest properties
+
+# The URL to start crawling from
+#project.start-uri=linkmap.html
+# Set logging level for messages printed to the console
+# (DEBUG, INFO, WARN, ERROR, FATAL_ERROR)
+#project.debuglevel=ERROR
+# Max memory to allocate to Java
+#forrest.maxmemory=64m
+# Any other arguments to pass to the JVM. For example, to run on an X-less
+# server, set to -Djava.awt.headless=true
+#forrest.jvmargs=
+# The bugtracking URL - the issue number will be appended
+#project.bugtracking-url=http://issues.apache.org/bugzilla/show_bug.cgi?id=
+#project.bugtracking-url=http://issues.apache.org/jira/browse/
+# The issues list as rss
+#project.issues-rss-url=
+#I18n Property only works for the "forrest run" target.
+#project.i18n=true
+# The names of plugins that are required to build the project
+# comma separated list (no spaces)
+# Run "forrest available-plugins" for a list of plug-ins currently available
+project.required.plugins=org.apache.forrest.plugin.output.smartSlides,org.apache.forrest.plugin.input.projectInfo,org.apache.forrest.plugin.output.pdf

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/lib/readme.txt
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/lib/readme.txt?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/lib/readme.txt (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/lib/readme.txt Sun Nov 13 23:16:11 2005
@@ -0,0 +1 @@
+Place any libraries required by your plugin in this directory.
\ No newline at end of file

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/locationmap.xml
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/locationmap.xml?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/locationmap.xml (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/locationmap.xml Sun Nov 13 23:16:11 2005
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Copyright 2002-2005 The Apache Software Foundation or its licensors,
+  as applicable.
+
+  Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<locationmap xmlns="http://apache.org/forrest/locationmap/1.0">
+
+  <components>
+    <matchers default="lm">
+      <matcher 
+        name="lm" 
+        src="org.apache.forrest.locationmap.WildcardLocationMapHintMatcher"/>
+    </matchers>
+    <selectors default="exists">
+          <selector name="exists" logger="sitemap.selector.exists"  
+                    src="org.apache.forrest.sourceexists.SourceExistsSelector" />
+    </selectors>
+  </components>
+  
+  <locator>    
+    <match pattern="daisy.transform.*.*">
+      <location src="resources/stylesheets/{1}-to-{2}.xsl"/>
+    </match>   
+  </locator>
+</locationmap>

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap Sun Nov 13 23:16:11 2005
@@ -0,0 +1,65 @@
+<?xml version="1.0"?>
+
+  <!-- ============================================================ -->
+  <!-- S5 Plugin                                               -->
+  <!-- This plugin provides WYSIWYG editing of XHTML1.0 files       -->
+  <!--                                                              -->
+  <!-- ============================================================ -->
+
+<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+  
+  <map:pipelines internal="true">
+      
+      <map:components>
+          <map:actions>
+              <map:action logger="sitemap.action.sourcetype" name="sourcetype" src="org.apache.forrest.sourcetype.SourceTypeAction">
+                  <sourcetype name="SmartSlides-1.0">
+                      <document-declaration public-id="-//APACHE//DTD SmartSlides Presentation V1.0//EN" />
+                  </sourcetype>
+                  
+              </map:action>
+          </map:actions>
+          
+          <map:selectors default="parameter">
+              <map:selector logger="sitemap.selector.parameter" name="parameter" src="org.apache.cocoon.selection.ParameterSelector" />
+          </map:selectors>
+      </map:components>
+      
+      <map:resources>    
+          <map:resource name="transform-to-document">
+              <map:act type="sourcetype" src="{src}">
+                  <map:select type="parameter">
+                      <map:parameter name="parameter-selector-test" value="{sourcetype}" />
+                      <map:when test="SmartSlides-1.0">
+                          <map:generate src="{project:content.xdocs}{../../1}.xml" />
+                          <map:transform src="{forrest:plugins}/org.apache.forrest.plugin.output.smartSlides/resources/stylesheets/presentation-to-slidy.xsl" />
+                          <map:serialize type="html-document"/>
+                      </map:when>
+                  </map:select>
+              </map:act>
+          </map:resource>
+      </map:resources>
+      
+      
+    <map:pipeline>
+        <map:match pattern="SmartSlides/**.xml">
+            <map:call resource="transform-to-document">
+                <map:parameter name="src" value="{project:content.xdocs}{1}.xml" />
+            </map:call>
+        </map:match>
+       
+                    
+        <map:match pattern="SmartSlides/**/ui/*.js">
+            <map:read src="{forrest:plugins}/org.apache.forrest.plugin.output.smartSlides/resources/ui/{2}.js"
+           mime-type="application/x-javascript"/>
+      </map:match>  
+      
+        <map:match pattern="SmartSlides/**/ui/*.css">
+          <map:read src="{forrest:plugins}/org.apache.forrest.plugin.output.smartSlides/resources/ui/{2}.css"
+           mime-type="text/css"/>
+      </map:match>  
+     
+  
+    </map:pipeline>
+  </map:pipelines>    
+</map:sitemap>

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap.org
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap.org?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap.org (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/output.xmap.org Sun Nov 13 23:16:11 2005
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<!--
+  Copyright 1999-2005 The Apache Software Foundation or its licensors,
+  as applicable.
+
+  Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+
+<map:pipelines>
+
+  <map:pipeline>
+
+  <!-- FIXME: add your plugin matches here -->
+  
+  </map:pipeline>
+</map:pipelines>
+
+</map:sitemap>

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/stylesheets/presentation-to-slidy.xsl
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/stylesheets/presentation-to-slidy.xsl?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/stylesheets/presentation-to-slidy.xsl (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/stylesheets/presentation-to-slidy.xsl Sun Nov 13 23:16:11 2005
@@ -0,0 +1,374 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0" extension-element-prefixes="datetime
+    redirect" xmlns:datetime="http://exslt.org/dates-and-times" xmlns:redirect="http://xml.apache.org/xalan/redirect">
+    <xsl:output doctype-public="-//W3C//DTD XHTML 1.0 Strict//EN"
+        doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" encoding="ISO-8859-1" indent="yes"
+        method="html" />
+    <!-- 
+        
+        Parameters 
+    
+    -->
+    <!--space separated list of all special elements to be visible in target (talk demo addlInfo comment todo) -->
+    <xsl:param name="show"> </xsl:param>
+    <xsl:template match="/">
+        <xsl:apply-templates mode="slidy" />
+    </xsl:template>
+    <!-- 
+        
+        Main processing template
+    -->
+    <xsl:template match="presentation" mode="slidy">
+        <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
+            <head>
+                <xsl:apply-templates select="metadata" mode="slidy" />
+            </head>
+            <xsl:apply-templates select="content" mode="slidy" />
+        </html>
+    </xsl:template>
+    <!-- 
+        
+        Process metadata
+    -->
+    <xsl:template match="metadata" mode="slidy">
+        <title>
+            <xsl:value-of select="title" />
+        </title>
+        <link rel="stylesheet" type="text/css" media="screen, projection" href="ui/show.css" />
+        <script src="ui/slidy.js" type="text/javascript" />
+        <style type="text/css">
+            <!-- your custom style rules -->
+        </style>
+        <link rel="stylesheet" type="text/css" media="print" href="ui/print.css" />
+        <meta name="copyright">
+            <xsl:attribute name="content">
+                <xsl:value-of select="author" />
+                <xsl:text> </xsl:text>
+                <xsl:value-of select="datetime:formatDate(created,'yyyy')" />
+            </xsl:attribute>
+        </meta>
+    </xsl:template>
+    <!-- 
+        
+        Generate visible content
+    -->
+    <xsl:template match="content" mode="slidy">
+        <body>
+            <xsl:attribute name="class">
+                <xsl:value-of select="normalize-space(concat('slidyPresentation ', @class))" />
+            </xsl:attribute>
+            <xsl:copy-of select="@id|@style" />
+            <!-- Background for all pages -->
+            <div class="background">
+                <img id="head-logo" alt="graphic with four colored squares" style="float:right"
+                    src="resources/ssplogo.png" />
+            </div>
+            <!-- Background for cover page -->
+            <div class="background cover" style="background-color: white"> </div>
+            <div class="background chapterTitle" style="background-color: yellow"> </div>
+            <xsl:apply-templates mode="slidy" />
+        </body>
+    </xsl:template>
+    <!--
+        
+        Process chapter start
+    -->
+    <xsl:template match="chapter" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <xsl:apply-templates mode="slidy" />
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        Process module (no processing at all)
+    -->
+    <xsl:template match="module" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <xsl:apply-templates mode="slidy" />
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        Process page
+    -->
+    <xsl:template match="page" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <div>
+                <xsl:attribute name="class">
+                    <xsl:value-of select="normalize-space(concat('slide ', @type))" />
+                </xsl:attribute>
+                <xsl:choose>
+                    <xsl:when test="heading">
+                        <h1>
+                            <xsl:copy-of select="heading/@*" />
+                            <xsl:apply-templates mode="slidyHeading" select="heading" />
+                        </h1>
+                    </xsl:when>
+                    <xsl:otherwise>
+                        <h1>
+                            <xsl:copy-of select="@*" />
+                            <xsl:apply-templates mode="slidy" select="@title" />
+                        </h1>
+                    </xsl:otherwise>
+                </xsl:choose>
+                <xsl:apply-templates mode="slidy" />
+            </div>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        Special element TOC as a macro for a Table of content
+    -->
+    <xsl:template match="TOC" mode="slidy">
+        <ul>
+            <xsl:for-each select="//chapter[not (@hideInTOC)]|//page[@listIn='allTOCs' or  @listIn='globalTOC']">
+                <li>
+                    <p>
+                        <xsl:attribute name="class">
+                            <xsl:choose>
+                                <xsl:when test="local-name()='chapter'">TOCchapterEntry</xsl:when>
+                                <xsl:otherwise>TOCPageEntry</xsl:otherwise>
+                            </xsl:choose>
+                        </xsl:attribute>
+                        <xsl:choose>
+                            <xsl:when test="@title">
+                                <xsl:value-of select="@title" />
+                            </xsl:when>
+                            <xsl:otherwise>
+                                <xsl:value-of select="heading" />
+                            </xsl:otherwise>
+                        </xsl:choose>
+                    </p>
+                </li>
+            </xsl:for-each>
+        </ul>
+    </xsl:template>
+    <!--
+        
+        Special element chapterTOC as a macro for a Table of content
+    -->
+    <xsl:template match="chapterTOC" mode="slidy">
+        <!-- List of pages -->
+        <ul>
+            <xsl:for-each select="ancestor::                 page/following-sibling::page[@listIn='allTOCs' or
+                @listIn='chapterTOC']|ancestor::                 page/following-sibling::chapter">
+                <li>
+                    <xsl:value-of select="@title" />
+                </li>
+            </xsl:for-each>
+        </ul>
+    </xsl:template>
+    <!--
+        
+        Special element PresentationTitle as a macro for a Table of content
+    -->
+    <xsl:template match="PresentationTitle" mode="slidy">
+        <xsl:value-of select="/presentation/metadata/title" />
+    </xsl:template>
+    <!--
+        
+        Special element Presenters as a macro for a Table of content
+    -->
+    <xsl:template match="Presenters" mode="slidy">
+        <xsl:for-each select="/presentation/metadata/presenter">
+            <p class="Presenter">
+                <xsl:value-of select="fullName" />
+                <br />
+                <a href="mailto:{email}">
+                    <xsl:value-of select="email" />
+                </a>
+            </p>
+        </xsl:for-each>
+    </xsl:template>
+    <!--
+        
+        Heading
+        block processing
+    -->
+    <xsl:template match="heading" mode="slidyHeading">
+        <xsl:apply-templates mode="slidy" />
+    </xsl:template>
+    <!--
+        
+        Heading
+        block processing
+    -->
+    <xsl:template match="heading" mode="slidy" />
+    <!--
+        
+        section
+    -->
+    <xsl:template match="section" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <xsl:element name="{concat('h',count(ancestor::section)+1)}">
+                <xsl:copy-of select="@class|@id|@style" />
+                <xsl:value-of select="@title" />
+            </xsl:element>
+            <xsl:apply-templates mode="slidy" />
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        XRef
+    -->
+    <xsl:template match="xref" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <a>
+                <xsl:copy-of select="@class|@id|@style" />
+                <xsl:attribute name="href">
+                    <xsl:value-of select="@url" />
+                </xsl:attribute>
+                <xsl:apply-templates mode="slidy" />
+            </a>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        Image
+    -->
+    <xsl:template match="image" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <img>
+                <xsl:copy-of select="@class|@id|@style" />
+                <xsl:attribute name="src">
+                    <xsl:value-of select="@url" />
+                </xsl:attribute>
+                <xsl:attribute name="alt">
+                    <xsl:value-of select="@alternativeText" />
+                </xsl:attribute>
+            </img>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        numberedList
+    -->
+    <xsl:template match="numberedList" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <ol>
+                <xsl:copy-of select="@class|@id|@style" />
+                <xsl:apply-templates mode="slidy" />
+            </ol>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        bulletList
+    -->
+    <xsl:template match="bulletList" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <ul>
+                <xsl:copy-of select="@class|@id|@style" />
+                <xsl:apply-templates mode="slidy" />
+            </ul>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        list item
+    -->
+    <xsl:template match="item" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <li>
+                <xsl:copy-of select="@class|@id|@style" />
+                <xsl:apply-templates mode="slidy" />
+            </li>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        para
+    -->
+    <xsl:template match="para" mode="slidy">
+        <xsl:if test="not(contains(@showOnlyFor,'print'))">
+            <p>
+                <xsl:copy-of select="@class|@id|@style" />
+                <xsl:apply-templates mode="slidy" />
+            </p>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        todo
+    -->
+    <xsl:template match="todo" mode="slidy">
+        <xsl:if test="contains($show,local-name())">
+            <div>
+                <xsl:attribute name="class">
+                    <xsl:value-of select="local-name()" />
+                </xsl:attribute>
+                <xsl:copy-of select="@id|@style" />
+                <xsl:value-of select="assignedTo" />:<xsl:value-of select="doUntil" />:<xsl:value-of select="priority" /><br />
+                <xsl:apply-templates mode="doc13" />
+            </div>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        comment, talk, demo
+    -->
+    <xsl:template match="comment|talk|demo" mode="slidy">
+        <xsl:if test="contains($show,local-name())">
+            <div>
+                <xsl:copy-of select="@id|@style" />
+                <xsl:attribute name="class">
+                    <xsl:value-of select="local-name()" />
+                </xsl:attribute>
+                <xsl:apply-templates mode="slidy" />
+            </div>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        addlInfo
+    -->
+    <xsl:template match="addlInfo" mode="slidy">
+        <xsl:if test="contains($show,local-name())">
+            <xsl:variable name="NoteFileName" select="concat('addlInfo/',generate-id(..),'.html')" />
+            <a href="{$NoteFileName}">
+                <xsl:attribute name="class">
+                    <xsl:value-of select="normalize-space(concat('additionalInfoRef ', @class))" />
+                </xsl:attribute>
+                <img src="resources\notes.png" alt="Click here to open additional info ..." />
+            </a>
+            <redirect:write select="$NoteFileName">
+                <html>
+                    <body>
+                        <xsl:apply-templates mode="slidy" />
+                    </body>
+                </html>
+            </redirect:write>
+        </xsl:if>
+    </xsl:template>
+    <!--
+
+        Elements that can be passed on unchanged
+    -->
+    <xsl:template match="em|strong|kbd|quote|code|br" mode="slidy">
+        <xsl:copy>
+            <xsl:copy-of select="@class|@id|@style" />
+            <xsl:apply-templates mode="slidy" />
+        </xsl:copy>
+    </xsl:template>
+    <!--
+        
+        Process bare text in items
+        and wrap it in paras
+    -->
+    <xsl:template match="item/text()|cell/text()" mode="slidy">
+        <!-- Ignore completely empty pieces of text -->
+        <xsl:if test="normalize-space(.)!=''">
+            <p>
+                <xsl:value-of select="." />
+            </p>
+        </xsl:if>
+    </xsl:template>
+    <!--
+        
+        Catch unblocked elements
+    -->
+    <xsl:template match="node()|text()|comment()">
+        <xsl:message>Ungeblocktes Elemente <xsl:value-of select="." /></xsl:message>
+    </xsl:template>
+    <xsl:template match="processing-instruction()" />
+</xsl:stylesheet>

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/print.css
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/print.css?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/print.css (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/print.css Sun Nov 13 23:16:11 2005
@@ -0,0 +1,58 @@
+/* print.css
+
+   Copyright (c) 2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+   W3C liability, trademark, document use and software licensing
+   rules apply, see:
+
+   http://www.w3.org/Consortium/Legal/copyright-documents
+   http://www.w3.org/Consortium/Legal/copyright-software
+*/
+body {
+  color: black;
+  font-family: sans-serif;
+  font-size: 12pt;
+}
+
+div.slide { page-break-before: auto; page-break-inside: avoid; }
+div.background { display: none; 
+  visibility: hidden; page-break-after: avoid; }
+div.handout { display: block; visibility: visible; }
+
+div dt
+{
+  margin-left: 0;
+  margin-top: 1em;
+  margin-bottom: 0.5em;
+  font-weight: bold;
+}
+div dd
+{
+  margin-left: 2em;
+}
+
+blockquote { font-style: italic }
+
+pre { color: rgb(0,128,0); font-size: 80%;
+ font-weight: bold; line-height: 120%; }
+
+p.copyright { font-size: smaller }
+
+a:visited { color: navy }
+a:link { color: blue }
+a:hover { color: red }
+a:active { color: red }
+
+a {text-decoration : none}
+.navbar a:link {color: white}
+.navbar a:visited {color: yellow}
+.navbar a:active {color: red}
+.navbar a:hover {color: red}
+
+ul { list-style-type: square; }
+ul ul { list-style-type: disc; }
+ul ul ul { list-style-type: circle; }
+ul ul ul ul { list-style-type: disc; }
+li { margin-left: 0.5em; }
+li li { font-size: 80%; font-style: italic }
+li li li { font-size: 80%; font-style: normal }
+

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/show.css
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/show.css?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/show.css (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/show.css Sun Nov 13 23:16:11 2005
@@ -0,0 +1,167 @@
+/* show.css
+
+   Copyright (c) 2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+   W3C liability, trademark, document use and software licensing
+   rules apply, see:
+
+   http://www.w3.org/Consortium/Legal/copyright-documents
+   http://www.w3.org/Consortium/Legal/copyright-software
+*/
+body
+{
+  margin: 0 0 0 0;
+  padding: 0 0 0 0;
+  width: 100%;
+  height: 100%;
+  color: black;
+  background-color: white;
+  font-family: sans-serif;
+  font-size: 14pt;
+}
+
+div.toolbar {
+  position: fixed; z-index: 200;
+  top: auto; bottom: 0; left: 0; right: 0;
+  height: 1.2em; text-align: right;
+  padding-left: 1em;
+  padding-right: 1em; 
+  font-size: 60%;
+  color: red; background: rgb(240,240,240);
+}
+
+div.background {
+  position: absolute; z-index: 1;
+  left: 0; right: 0; top: 0; bottom: 0;
+}
+
+div.handout {
+  margin-left: 20px;
+  margin-right: 20px;
+}
+
+div.slide.titlepage {
+  text-align: center;
+}
+
+div.slide.titlepage.h1 {
+  padding-top: 40%;
+}
+
+
+div.slide {
+  z-index: 20;
+  margin: 0 0 0 0;
+  padding-top: 1em;
+  padding-bottom: 0;
+  padding-left: 50px;
+  padding-right: 50px;
+  border-width: 0;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  line-height: 120%;
+  background-color: transparent;
+}
+
+div.slide h1 {
+  padding-left: 0;
+  padding-right: 20pt;
+  padding-top: 4pt;
+  padding-bottom: 4pt;
+  margin-top: 1em;
+  margin-left: 0;
+  margin-right: 60pt;
+  margin-bottom: 0.5em;
+  display: block; 
+  font-size: 160%;
+  line-height: 1.2em;
+  background: transparent;
+}
+
+pre { color: rgb(0,128,0); font-size: 80%;
+ font-weight: bold; line-height: 120%; }
+
+blockquote { font-style: italic }
+
+img { background-color: transparent }
+
+p.copyright { font-size: smaller }
+
+.center { text-align: center }
+.footnote { font-size: smaller; margin-left: 2em; }
+
+a img { border-width: 0; border-style: none }
+
+a:visited { color: navy }
+a:link { color: blue }
+a:hover { color: red; text-decoration: underline }
+a:active { color: red; text-decoration: underline }
+
+a {text-decoration: none}
+.navbar a:link {color: white}
+.navbar a:visited {color: yellow}
+.navbar a:active {color: red}
+.navbar a:hover {color: red}
+
+ul { list-style-type: square; }
+ul ul { list-style-type: disc; }
+ul ul ul { list-style-type: circle; }
+ul ul ul ul { list-style-type: disc; }
+li { margin-left: 0.5em; margin-top: 0.5em; }
+li li { font-size: 85%; font-style: normal }
+li li li { font-size: 85%; font-style: normal }
+
+div dt
+{
+  margin-left: 0;
+  margin-top: 1em;
+  margin-bottom: 0.5em;
+  font-weight: bold;
+}
+div dd
+{
+  margin-left: 2em;
+  margin-bottom: 0.5em;
+}
+
+.comment 
+{
+    color: grey; 
+    background-color: silver;
+} 
+
+.talk 
+{ 
+    color: blue; 
+    font-size: 10pt; 
+} 
+
+.todo 
+{ 
+    color: red; 
+    font-size: 10pt; 
+} 
+
+.demo 
+{
+    background-color:linen; 
+} 
+
+.additionalInfoRef 
+{ 
+    position: fixed; 
+    bottom: 1em; 
+    right: 1em;
+} 
+
+.chapterTitle h1
+{
+    position:relative;
+    top:35%;
+}
+
+ #ferdinandsphoto{float: left; margin-right: 2em; width: 10%; margin-bottom: 2em;}
+ .clearBoth{clear:both}
+ .screenshots {width: 60%;}     
+. skinShots {width: 50%;}

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/slidy.js
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/slidy.js?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/slidy.js (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/resources/ui/slidy.js Sun Nov 13 23:16:11 2005
@@ -0,0 +1,1598 @@
+/* slidy.js
+
+   Copyright (c) 2005 W3C (MIT, ERCIM, Keio), All Rights Reserved.
+   W3C liability, trademark, document use and software licensing
+   rules apply, see:
+
+   http://www.w3.org/Consortium/Legal/copyright-documents
+   http://www.w3.org/Consortium/Legal/copyright-software
+*/
+
+var ns_pos = (typeof window.pageYOffset!='undefined');
+var khtml = ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false);
+
+window.onload = startup; // equivalent to onload on body element
+
+var slidenum = 0;     // integer slide count: 0, 1, 2, ...
+var slides;           // set to array of slide div's
+var slideNumElement;  // element containing slide number
+var notes;            // set to array of handout div's
+var backgrounds;      // set to array of background div's
+var toolbar;          // element containing toolbar
+var title;            // document title
+var lastShown = null; // last incrementally shown item
+var eos = null;       // span element for end of slide indicator
+
+var viewAll = 0;      // 1 to view all slides + handouts
+var wantToolbar = 1;   // 0 if toolbar isn't wanted
+var mouseClickEnabled = true;  // enables left click for next slide
+var scrollhack = 0;   // IE work around for position: fixed
+
+var helpPage = "http://www.w3.org/Talks/Tools/Slidy/help.html";
+var helpText = "Navigate with click, space bar, Pg Up or Pg Dn." +
+               " Use < and > (or - and + on number pad) to change font size.";
+
+var sizeIndex = 0;
+var sizes = new Array("10pt", "12pt", "14pt", "16pt", "18pt",
+                      "20pt", "22pt", "24pt", "26pt");
+
+// the corresponding expected toolbar height in pixels
+// as measured with Internet Explorer and Galeon
+
+var toolbarHeight = new Array(10,12,13,15,16,19,21,23,25);
+
+var okayForIncremental = incrementalElementList();
+
+// needed for efficient resizing
+var lastWidth = 0;
+var lastHeight = 0;
+
+// Needed for cross browser support for relative width/height on
+// object elements. The work around is to save width/height attributes
+// and then to recompute absolute width/height dimensions on resizing
+var objects;
+
+/* general initialization */
+function startup()
+{
+   title = document.title;
+   toolbar = addToolbar();
+   slides = collectSlides();
+   notes = collectNotes();
+   objects = document.body.getElementsByTagName("object");
+   backgrounds = collectBackgrounds();
+   patchAnchors();
+   slidenum = findSlideNumber(location.href);
+
+   if (slides.length > 0)
+   {
+      var slide = slides[slidenum];
+      slide.style.position = "absolute";
+   
+      if (slidenum > 0)
+      {
+         setVisibilityAllIncremental("visible");
+         lastShown = previousIncrementalItem(null);
+         setEosStatus(true);
+      }
+      else
+      {
+         lastShown = null;
+         setVisibilityAllIncremental("hidden");
+         setEosStatus(!nextIncrementalItem(lastShown));
+      }
+
+      setLocation();
+   }
+
+   // bind even handlers
+   document.onclick = mouseButtonClick;
+   document.onkeydown = keyDown;
+   window.onresize  = resized;
+   window.onscroll = scrolled;
+   singleSlideView();
+
+   setLocation();
+   resized();
+   showToolbar();
+   //fontAdjust();
+
+
+   //if (!ns_pos)
+   //   setTimeout(ieHack, 100);
+}
+
+// hack to persuade IE to compute correct document height
+// as needed for simulating fixed positioning of toolbar
+function ieHack()
+{
+   window.resizeBy(0,-1);
+   window.resizeBy(0, 1);
+}
+
+// Safari and Konqueror don't yet support getComputedStyle()
+// and they always reload page when location.href is updated
+function isKHTML()
+{
+   var agent = navigator.userAgent;
+   return (agent.indexOf("KHTML") >= 0 ? true : false);
+}
+
+// hack to work around variation in point size to pixels as
+// Opera/Linux displays fonts 30% smaller than other browsers
+
+function fontAdjust()
+{
+   var fontAdjustment = toolbarHeight[sizeIndex] / toolbar.offsetHeight;
+   //alert("fontAdjustment is " + fontAdjustment);
+
+   if (fontAdjustment > 1.1)
+   {
+      // calculated adjustment varies with Opera's window size
+      // which causes problems, so let's fix it to 1.3
+      fontAdjustment = 1.3;
+
+      for (var i = 0; i < sizes.length; ++i)
+      {
+         size = parseInt(sizes[i]);
+         sizes[i] = Math.round(fontAdjustment * size) + "pt";
+      }
+
+      document.body.style.fontSize = sizes[sizeIndex];
+
+      // force correct positioning of toolbar
+      setTimeout(showToolbar, 500);
+      //alert("adjustment is " + fontAdjustment);
+   }
+
+   showToolbar();
+}
+
+function resized()
+{
+   var width = 0;
+
+   if ( typeof( window.innerWidth ) == 'number' )
+      width = window.innerWidth;  // Non IE browser
+   else if (document.documentElement && document.documentElement.clientWidth)
+      width = document.documentElement.clientWidth;  // IE6
+   else if (document.body && document.body.clientWidth)
+      width = document.body.clientWidth; // IE4
+
+   var height = 0;
+
+   if ( typeof( window.innerHeight ) == 'number' )
+      height = window.innerHeight;  // Non IE browser
+   else if (document.documentElement && document.documentElement.clientHeight)
+      height = document.documentElement.clientHeight;  // IE6
+   else if (document.body && document.body.clientHeight)
+      height = document.body.clientHeight; // IE4
+
+   // IE fires onresize even when only font size is changed!
+   // so we do a check to avoid blocking < and > actions
+   if (width != lastWidth || height != lastHeight)
+   {
+      if (width > 1100)
+         sizeIndex = 4;
+      else if (width > 1000)
+         sizeIndex = 3;
+      else if (width > 800)
+         sizeIndex = 2;
+      else if (width > 600)
+         sizeIndex = 1;
+      else if (width)
+         sizeIndex = 0;
+
+      // enables cross browser use of relative width/height
+      // on object elements for use with SVG and Flash media
+      adjustObjectDimensions(width, height);
+
+      document.body.style.fontSize = sizes[sizeIndex];
+
+      lastWidth = width;
+      lastHeight = height;
+
+      // force reflow to work around Mozilla bug
+      //if (ns_pos)
+      {
+         var slide = slides[slidenum];
+         hideSlide(slide);
+         showSlide(slide);
+      }
+
+      // force correct positioning of toolbar
+      refreshToolbar(200);
+   }
+}
+
+function scrolled()
+{
+   if (toolbar && !ns_pos)
+   {
+      // hide toolbar
+      toolbar.style.display = "none";
+
+      // make it reappear later
+      if (scrollhack == 0 && !viewAll)
+      {
+         setTimeout(showToolbar, 1000);
+         scrollhack = 1;
+      }
+   }
+}
+
+// used to ensure IE refreshes toolbar in correct position
+function refreshToolbar(interval)
+{
+   hideToolbar();
+   setTimeout(showToolbar, interval);
+}
+
+// restores toolbar after short delay
+function showToolbar()
+{
+   if (wantToolbar)
+   {
+      if (!ns_pos)
+      {
+         // adjust position to allow for scrolling
+         var xoffset = scrollXOffset();
+         toolbar.style.left = xoffset;
+         toolbar.style.right = xoffset;
+
+         // determine vertical scroll offset
+         //var yoffset = scrollYOffset();
+
+         // bottom is doc height - window height - scroll offset
+         //var bottom = documentHeight() - lastHeight - yoffset
+
+         //if (yoffset > 0 || documentHeight() > lastHeight)
+         //   bottom += 16;  // allow for height of scrollbar
+
+         toolbar.style.bottom = 0; //bottom;
+      }
+
+      toolbar.style.display = "block";
+      toolbar.style.visibility = "visible";
+   }
+
+   scrollhack = 0;
+}
+
+function test()
+{
+   var s = "docH: " + documentHeight() +
+       " winH: " + lastHeight +
+       " yoffset: " + scrollYOffset() +
+       " toolbot: " + (documentHeight() - lastHeight - scrollYOffset());
+
+   //alert(s);
+
+   var slide = slides[slidenum];
+   // IE getAttribute requires "class" to be "className"
+   var name = ns_pos ? "class" : "className";
+   var style = (slide.currentStyle ? slide.currentStyle["backgroundColor"] :
+       document.defaultView.getComputedStyle(slide, '').getPropertyValue("background-color"));
+   alert("class='" + slide.getAttribute(name) + "' backgroundColor: " + style);
+}
+
+function hideToolbar()
+{
+   toolbar.style.display = "none";
+   toolbar.style.visibility = "hidden";
+}
+
+// invoked via F key
+function toggleToolbar()
+{
+   if (!viewAll)
+   {
+      if (toolbar.style.display == "none")
+      {
+         toolbar.style.display = "block";
+         toolbar.style.visibility = "visible";
+         wantToolbar = 1;
+      }
+      else
+      {
+         toolbar.style.display = "none";
+         toolbar.style.visibility = "hidden";
+         wantToolbar = 0;
+      }
+   }
+}
+
+function scrollXOffset()
+{
+   if (window.pageXOffset)
+      return self.pageXOffset;
+
+   if (document.documentElement && 
+             document.documentElement.scrollLeft)
+      return document.documentElement.scrollLeft;
+
+   if (document.body)
+      return document.body.scrollLeft;
+
+    return 0;
+}
+
+
+function scrollYOffset()
+{
+   if (window.pageYOffset)
+      return self.pageYOffset;
+
+   if (document.documentElement && 
+             document.documentElement.scrollTop)
+      return document.documentElement.scrollTop;
+
+   if (document.body)
+      return document.body.scrollTop;
+
+    return 0;
+}
+
+function documentHeight()
+{
+   var sh, oh;
+
+   sh = document.body.scrollHeight;
+   oh = document.body.offsetHeight;
+
+   if (sh && oh)
+   {
+      return (sh > oh ? sh : oh);
+   }
+
+   // no idea!
+   return 0;
+}
+
+// these don't work well on Opera, for which
+// we take advantage on @media projection
+function smaller()
+{
+   if (sizeIndex > 0)
+   {
+      --sizeIndex;
+   }
+
+   toolbar.style.display = "none";
+   document.body.style.fontSize = sizes[sizeIndex];
+   var slide = slides[slidenum];
+   hideSlide(slide);
+   showSlide(slide);
+   setTimeout(showToolbar, 300);
+}
+
+function bigger()
+{
+   if (sizeIndex < sizes.length - 1)
+   {
+      ++sizeIndex;
+   }
+
+   toolbar.style.display = "none";
+   document.body.style.fontSize = sizes[sizeIndex];
+   var slide = slides[slidenum];
+   hideSlide(slide);
+   showSlide(slide);
+   setTimeout(showToolbar, 300);
+}
+
+// enables cross browser use of relative width/height
+// on object elements for use with SVG and Flash media
+// with thanks to Ivan Herman for the suggestion
+function adjustObjectDimensions(width, height)
+{
+   for( var i = 0; i < objects.length; i++ )
+   {
+      var obj = objects[i];
+      var mimeType = obj.getAttribute("type");
+
+      if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash")
+      {
+         if ( !obj.initialWidth ) 
+            obj.initialWidth = obj.getAttribute("width");
+
+         if ( !obj.initialHeight ) 
+            obj.initialHeight = obj.getAttribute("height");
+
+         if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" )
+         {
+            var w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1));
+            var newW = width * (w/100.0);
+            obj.setAttribute("width",newW);
+         }
+
+         if ( obj.initialHeight && obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" )
+         {
+            var h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1));
+            var newH = height * (h/100.0);
+            obj.setAttribute("height", newH);
+         }
+      }
+   }
+}
+
+function cancel(event)
+{
+  event.cancel = true;
+  event.returnValue = false;
+  return false;
+}
+
+//  See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes
+function keyDown(event)
+{
+    var key;
+
+    if (!event)
+      var event = window.event;
+
+    // kludge around NS/IE differences 
+    if (window.event)
+       key = window.event.keyCode;
+    else if (event.which)
+       key = event.which;
+    else
+       return true; // Yikes! unknown browser
+
+    // ignore event if key value is zero
+    // as for alt on Opera and Konqueror
+    if (!key)
+       return true;
+
+    // check for concurrent control/command/alt key
+    // but are these only present on mouse events?
+
+    if (event.ctrlKey || event.altKey)
+       return true;
+
+    if (key == 34) // Page Down
+    {
+       nextSlide(false);
+       return cancel(event);
+    }
+    else if (key == 33) // Page Up
+    {
+       previousSlide(false);
+       return cancel(event);
+    }
+    else if (key == 32) // space bar
+    {
+       nextSlide(true);
+       return cancel(event);
+    }
+    else if (key == 37) // Left arrow
+    {
+       previousSlide(true);
+       return cancel(event);
+    }
+    else if (key == 36) // Home
+    {
+       firstSlide();
+       return cancel(event);
+    }
+    else if (key == 35) // End
+    {
+       lastSlide();
+       return cancel(event);
+    }
+    else if (key == 39) // Right arrow
+    {
+       nextSlide(true);
+       return cancel(event);
+    }
+    else if (key == 188)  // < for smaller fonts
+    {
+       smaller();
+       return cancel(event);
+    }
+    else if (key == 190)  // > for larger fonts
+    {
+       bigger();
+       return cancel(event);
+    }
+    else if (key == 189 || key == 109)  // - for smaller fonts
+    {
+       smaller();
+       return cancel(event);
+    }
+    else if (key == 187 || key == 191 || key == 107)  // = +  for larger fonts
+    {
+       bigger();
+       return cancel(event);
+    }
+    else if (key == 86)  // V for smaller fonts
+    {
+       smaller();
+       return cancel(event);
+    }
+    else if (key == 66)  // B for larger fonts
+    {
+       bigger();
+       return cancel(event);
+    }
+    else if (key == 90)  // Z for last slide
+    {
+       lastSlide();
+       return cancel(event);
+    }
+    else if (key == 70)  // F for toggle toolbar
+    {
+       toggleToolbar();
+       return cancel(event);
+    }
+    else if (key == 65)  // A for toggle view single/all slides
+    {
+       toggleView();
+       return cancel(event);
+    }
+    else if (key == 75)  // toggle action of left click for next page
+    {
+       mouseClickEnabled = !mouseClickEnabled;
+       alert((mouseClickEnabled ? "enabled" : "disabled") +  " mouse click advance");
+       return cancel(event);
+    }
+    else if (key == 84)  // T for test
+    {
+       test();
+       return cancel(event);
+    }
+    //else alert("key code is "+ key);
+
+    return true;
+}
+
+// right mouse button click is reserved for context menus
+// it is more reliable to detect rightclick than leftclick
+function mouseButtonClick(e)
+{
+   var rightclick = false;
+   var target;
+
+   if (!e)
+      var e = window.event;
+
+   if (e.target)
+      target = e.target;
+   else if (e.srcElement)
+      target = e.srcElement;
+
+   // work around Safari bug
+   if (target.nodeType == 3)
+      target = target.parentNode;
+
+   if (e.which)
+      rightclick = (e.which == 3);
+   else if (e.button)
+      rightclick = (e.button == 2);
+
+   // check if target is something that probably want's clicks
+   // e.g. embed, object, input, textarea, select, option
+
+   if (mouseClickEnabled && !rightclick &&
+        target.nodeName != "EMBED" &&
+        target.nodeName != "OBJECT" &&
+        target.nodeName != "INPUT" &&
+        target.nodeName != "TEXTAREA" &&
+        target.nodeName != "SELECT" &&
+        target.nodeName != "OPTION")
+   {
+      nextSlide(true);
+      stopPropagation(e);
+      e.cancel = true;
+      e.returnValue = false;
+   }
+}
+
+function previousSlide(incremental)
+{
+   if (!viewAll)
+   {
+      var slide;
+
+      if ((incremental || slidenum == 0) && lastShown != null)
+      {
+         lastShown = hidePreviousItem(lastShown);
+         setEosStatus(false);
+      }
+      else if (slidenum > 0)
+      {
+         slide = slides[slidenum];
+         hideSlide(slide);
+
+         slidenum = slidenum - 1;
+         slide = slides[slidenum];
+         setVisibilityAllIncremental("visible");
+         lastShown = previousIncrementalItem(null);
+         setEosStatus(true);
+         showSlide(slide);
+      }
+
+      setLocation();
+
+      if (!ns_pos)
+         refreshToolbar(200);
+   }
+}
+
+function nextSlide(incremental)
+{
+   if (!viewAll)
+   {
+      var slide;
+
+      if (incremental || slidenum == slides.length - 1)
+         lastShown = revealNextItem(lastShown);
+
+      if ((!incremental || lastShown == null) && slidenum < slides.length - 1)
+      {
+         slide = slides[slidenum];
+         hideSlide(slide);
+
+         slidenum = slidenum + 1;
+         slide = slides[slidenum];
+         lastShown = null;
+         setVisibilityAllIncremental("hidden");
+         showSlide(slide);
+      }
+
+      setLocation();
+
+      setEosStatus(!nextIncrementalItem(lastShown));
+
+      if (!ns_pos)
+         refreshToolbar(200);
+   }
+}
+
+// to first slide with nothing revealed
+// i.e. state at start of presentation
+function firstSlide()
+{
+   if (!viewAll)
+   {
+      var slide;
+
+      if (slidenum != 0)
+      {
+         slide = slides[slidenum];
+         hideSlide(slide);
+
+         slidenum = 0;
+         slide = slides[slidenum];
+         lastShown = null;
+         setVisibilityAllIncremental("hidden");
+         showSlide(slide);
+      }
+
+      setEosStatus(!nextIncrementalItem(lastShown));
+      setLocation();
+   }
+}
+
+
+// to last slide with everything revealed
+// i.e. state at end of presentation
+function lastSlide()
+{
+   if (!viewAll)
+   {
+      var slide;
+
+      lastShown = null; //revealNextItem(lastShown);
+
+      if (lastShown == null && slidenum < slides.length - 1)
+      {
+         slide = slides[slidenum];
+         hideSlide(slide);
+         slidenum = slides.length - 1;
+         slide = slides[slidenum];
+         setVisibilityAllIncremental("visible");
+         lastShown = previousIncrementalItem(null);
+
+         showSlide(slide);
+      }
+      else
+      {
+         setVisibilityAllIncremental("visible");
+         lastShown = previousIncrementalItem(null);
+      }
+
+      setEosStatus(true);
+      setLocation();
+   }
+}
+
+function setEosStatus(state)
+{
+   if (eos)
+      eos.style.color = (state ? "rgb(240,240,240)" : "red");
+}
+
+function showSlide(slide)
+{
+   syncBackground(slide);
+   slide.style.visibility = "visible";
+   slide.style.display = "block";
+}
+
+function hideSlide(slide)
+{
+   slide.style.visibility = "hidden";
+   slide.style.display = "none";
+}
+
+function toggleView()
+{
+   if (viewAll)
+   {
+      singleSlideView();
+      showToolbar();
+      viewAll = 0;
+   }
+   else
+   {
+      showAllSlides();
+      hideToolbar();
+      viewAll = 1;
+   }
+}
+
+// prepare for printing
+function showAllSlides()
+{
+   var slide;
+
+   for (var i = 0; i < slides.length; ++i)
+   {
+      slide = slides[i];
+
+      slide.style.position = "relative";
+      slide.style.borderTopStyle = "solid";
+      slide.style.borderTopWidth = "thin";
+      slide.style.borderTopColor = "black";
+
+      setVisibilityAllIncremental("visible");
+      showSlide(slide);
+   }
+
+   var note;
+
+   for (var i = 0; i < notes.length; ++i)
+   {
+      showSlide(notes[i]);
+   }
+}
+
+// restore after printing
+function singleSlideView()
+{
+   var slide;
+
+   for (var i = 0; i < slides.length; ++i)
+   {
+      slide = slides[i];
+
+      slide.style.position = "absolute";
+
+      if (i == slidenum)
+      {
+         slide.style.borderStyle = "none";
+         showSlide(slide);
+      }
+      else
+      {
+         slide.style.borderStyle = "none";
+         hideSlide(slide);
+      }
+   }
+
+   setVisibilityAllIncremental("visible");
+   lastShown = previousIncrementalItem(null);
+
+   var note;
+
+   for (var i = 0; i < notes.length; ++i)
+   {
+      hideSlide(notes[i]);
+   }
+}
+
+// the string str is a whitespace separated list of tokens
+// test if str contains a particular token, e.g. "slide"
+function hasToken(str, token)
+{
+   if (str)
+   {
+      // define pattern as regular expression
+      var pattern = /\w+/g;
+
+      // check for matches
+      // place result in array
+      var result = str.match(pattern);
+
+      // now check if desired token is present
+      for (var i = 0; i < result.length; i++)
+      {
+         if (result[i] == token)
+            return true;
+      }
+   }
+
+   return false;
+}
+
+// return new array of all slides
+function collectSlides()
+{
+   var slides = new Array();
+   var divs = document.body.getElementsByTagName("div");
+
+   // IE getAttribute requires "class" to be "className"
+   var name = ns_pos ? "class" : "className";
+
+   for (var i = 0; i < divs.length; ++i)
+   {
+      div = divs.item(i);
+
+      if (hasToken(div.getAttribute(name), "slide"))
+      {
+         // add slide to collection
+         slides[slides.length] = div;
+
+         // hide each slide as it is found
+         div.style.display = "none";
+         div.style.visibility = "hidden";
+         // add dummy <br/> at end for scrolling hack
+         var node = document.createElement("br");
+         div.appendChild(node);
+      }
+   }
+
+   return slides;
+}
+
+// return new array of all <div class="handout">
+function collectNotes()
+{
+   var notes = new Array();
+   var divs = document.body.getElementsByTagName("div");
+
+   // IE getAttribute requires "class" to be "className"
+   var name = ns_pos ? "class" : "className";
+
+   for (var i = 0; i < divs.length; ++i)
+   {
+      div = divs.item(i);
+
+      if (hasToken(div.getAttribute(name), "handout"))
+      {
+         // add slide to collection
+         notes[notes.length] = div;
+
+         // hide handout notes as they are found
+         div.style.display = "none";
+         div.style.visibility = "hidden";
+      }
+   }
+
+   return notes;
+}
+
+// return new array of all <div class="background">
+// including named backgrounds e.g. class="background titlepage"
+function collectBackgrounds()
+{
+   var backgrounds = new Array();
+   var divs = document.body.getElementsByTagName("div");
+
+   // IE getAttribute requires "class" to be "className"
+   var name = ns_pos ? "class" : "className";
+   var background;
+
+   for (var i = 0; i < divs.length; ++i)
+   {
+      div = divs.item(i);
+
+      background = div.getAttribute(name);
+
+      if (hasToken(background, "background"))
+      {
+         // add slide to collection
+         backgrounds[backgrounds.length] = div;
+
+         // hide named backgrounds as they are found
+         // e.g. class="background epilog"
+         if (background != "background")
+         {
+            div.style.display = "none";
+            div.style.visibility = "hidden";
+         }
+      }
+   }
+
+   return backgrounds;
+}
+
+// show just the backgrounds pertinent to this slide
+function syncBackground(slide)
+{
+   var background;
+   var bgColor;
+
+   if (slide.currentStyle)
+      bgColor = slide.currentStyle["backgroundColor"];
+   else if (document.defaultView)
+   {
+      var styles = document.defaultView.getComputedStyle(slide,null);
+
+      if (styles)
+          bgColor = styles.getPropertyValue("background-color");
+      else // broken implementation probably due Safari or Konqueror
+      {
+          //alert("defective implementation of getComputedStyle()");
+          bgColor = "transparent";
+      }
+   }
+   else
+      bgColor == "transparent";
+
+   if (bgColor == "transparent")
+   {
+      // IE getAttribute requires "class" to be "className"
+      var name = ns_pos ? "class" : "className";
+      var slideClass = slide.getAttribute(name);
+      var bgClass;
+
+      for (var i = 0; i < backgrounds.length; i++)
+      {
+         background = backgrounds[i];
+
+         bgClass = background.getAttribute(name);
+
+         if (matchingBackground(slideClass, bgClass))
+         {
+            background.style.display = "block";
+            background.style.visibility = "visible";
+         }
+         else
+         {
+            background.style.display = "none";
+            background.style.visibility = "hidden";
+         }
+      }
+   }
+   else // forcibly hide all backgrounds
+   {
+      for (var i = 0; i < backgrounds.length; i++)
+      {
+         background = backgrounds[i];
+         background.style.display = "none";
+         background.style.visibility = "hidden";
+      }
+   }
+}
+
+// compare classes for slide and background
+function matchingBackground(slideClass, bgClass)
+{
+   if (bgClass == "background")
+      return true;
+
+   // define pattern as regular expression
+   var pattern = /\w+/g;
+
+   // check for matches and place result in array
+   var result = slideClass.match(pattern);
+
+   // now check if desired name is present for background
+   for (var i = 0; i < result.length; i++)
+   {
+      if (hasToken(bgClass, result[i]))
+         return true;
+   }
+
+   return false;
+}
+
+// left to right traversal of root's content
+function nextNode(root, node)
+{
+   if (node == null)
+      return root.firstChild;
+
+   if (node.firstChild)
+      return node.firstChild;
+
+   if (node.nextSibling)
+      return node.nextSibling;
+
+   for (;;)
+   {
+      node = node.parentNode;
+
+      if (node == root)
+         return null;
+
+      if (node.nextSibling)
+         return node.nextSibling;
+   }
+
+   return null;
+}
+
+// right to left traversal of root's content
+function previousNode(root, node)
+{
+   if (node == null)
+   {
+      node = root.lastChild;
+
+      if (node)
+      {
+         while (node.lastChild)
+            node = node.lastChild;
+      }
+
+      return node;
+   }
+
+   if (node.previousSibling)
+   {
+      node = node.previousSibling;
+
+      while (node.lastChild)
+         node = node.lastChild;
+
+      return node;
+   }
+
+   if (node.parentNode != root)
+      return node.parentNode;
+
+   return null;
+}
+
+// HTML elements that can be used with class="incremental"
+// note that you can also put the class on containers like
+// up, ol, dl, and div to make their contents appear
+// incrementally. Upper case is used since this is what
+// browsers report for HTML node names (text/html).
+function incrementalElementList()
+{
+   var inclist = new Array();
+   inclist["P"] = true;
+   inclist["PRE"] = true;
+   inclist["LI"] = true;
+   inclist["BLOCKQUOTE"] = true;
+   inclist["DT"] = true;
+   inclist["DD"] = true;
+   inclist["H2"] = true;
+   inclist["H3"] = true;
+   inclist["H4"] = true;
+   inclist["H5"] = true;
+   inclist["H6"] = true;
+   inclist["SPAN"] = true;
+   inclist["ADDRESS"] = true;
+   inclist["TABLE"] = true;
+   inclist["TR"] = true;
+   inclist["TH"] = true;
+   inclist["TD"] = true;
+   inclist["IMG"] = true;
+   inclist["OBJECT"] = true;
+   return inclist;
+}
+
+function nextIncrementalItem(node)
+{
+   var slide = slides[slidenum];
+
+   // IE getAttribute requires "class" to be "className"
+   var classattr = ns_pos ? "class" : "className";
+
+
+   for (;;)
+   {
+      node = nextNode(slide, node);
+
+      if (node == null || node.parentNode == null)
+         break;
+
+      if (node.nodeType == 1)  // ELEMENT
+      {
+         if (hasToken(node.parentNode.getAttribute(classattr), "incremental")
+             && node.nodeName != "BR")
+            return node;
+
+         if (hasToken(node.getAttribute(classattr), "incremental")
+             && okayForIncremental[node.nodeName])
+         {
+            return node;
+         }
+      }
+   }
+
+   return node;
+}
+
+function previousIncrementalItem(node)
+{
+   var slide = slides[slidenum];
+
+   // IE getAttribute requires "class" to be "className"
+   var classattr = ns_pos ? "class" : "className";
+
+
+   for (;;)
+   {
+      node = previousNode(slide, node);
+
+      if (node == null || node.parentNode == null)
+         break;
+
+      if (node.nodeType == 1)
+      {
+         if (hasToken(node.parentNode.getAttribute(classattr), "incremental")
+             && node.nodeName != "BR")
+            return node;
+
+         if (hasToken(node.getAttribute(classattr), "incremental")
+             && okayForIncremental[node.nodeName])
+         {
+            return node;
+         }
+      }
+   }
+
+   return node;
+}
+
+// set visibility for all elements on current slide with
+// a parent element with attribute class="incremental"
+function setVisibilityAllIncremental(value)
+{
+   var node = nextIncrementalItem(null);
+
+   while (node)
+   {
+      node.style.visibility = value;
+      node = nextIncrementalItem(node);
+   }
+}
+
+// reveal the next hidden item on the slide
+// node is null or the node that was last revealed
+function revealNextItem(node)
+{
+   node = nextIncrementalItem(node);
+
+   if (node && node.nodeType == 1)  // an element
+      node.style.visibility = "visible";
+
+   return node;
+}
+
+
+// exact inverse of revealNextItem(node)
+function hidePreviousItem(node)
+{
+   if (node && node.nodeType == 1)  // an element
+      node.style.visibility = "hidden";
+
+   return previousIncrementalItem(node);
+}
+
+
+/* set click handlers on all anchors */
+function patchAnchors()
+{
+   var anchors = document.body.getElementsByTagName("a");
+
+   for (var i = 0; i < anchors.length; ++i)
+   {
+      anchors[i].onclick = clickedAnchor;
+   }
+}
+
+function clickedAnchor(e)
+{
+   if (!e)
+      var e = window.event;
+
+   // compare this.href with location.href
+   // for link to another slide in this doc
+
+   if (pageAddress(this.href) == pageAddress(location.href))
+   {
+      // yes, so find new slide number
+      var newslidenum = findSlideNumber(this.href);
+
+      if (newslidenum != slidenum)
+      {
+         slide = slides[slidenum];
+         hideSlide(slide);
+         slidenum = newslidenum;
+         slide = slides[slidenum];
+         showSlide(slide);
+         setLocation();
+      }
+   }
+   else if (this.target == null)
+      location.href = this.href;
+
+   this.blur();
+   stopPropagation(e);
+}
+
+function pageAddress(uri)
+{
+   var i = uri.indexOf("#");
+
+   // check if anchor is entire page
+
+   if (i < 0)
+      return uri;  // yes
+
+   return uri.substr(0, i);
+}
+
+function showSlideNumber()
+{
+   slideNumElement.innerHTML = "slide " +
+           (slidenum + 1) + "/" + slides.length;
+}
+
+function setLocation()
+{
+   var uri = pageAddress(location.href);
+
+   if (slidenum > 0)
+      uri = uri + "#[" + (slidenum+1) + "]";
+
+   if (uri != location.href && !khtml)
+      location.href = uri;
+
+   document.title = title + " [" + (slidenum+1) + "]";
+   //document.title = (slidenum+1) + ") " + slideName();
+
+   showSlideNumber();
+}
+
+// find current slide based upon location
+// first find target anchor and then look
+// for associated div element enclosing it
+// finally map that to slide number
+function findSlideNumber(uri)
+{
+   // first get anchor from page location
+
+   var i = uri.indexOf("#");
+
+   // check if anchor is entire page
+
+   if (i < 0)
+      return 0;  // yes
+
+   var anchor = uri.substr(i+1);
+
+   // now use anchor as XML ID to find target
+   var target = document.getElementById(anchor);
+
+   if (!target)
+   {
+      // does anchor look like "[2]" for slide 2 ??
+      // where first slide is [1]
+      var re = /\[(\d)+\]/;
+
+      if (anchor.match(re))
+      {
+         var num = parseInt(anchor.substring(1, anchor.length-1));
+
+         if (num > slides.length)
+            num = 1;
+
+         if (--num < 0)
+            num = 0;
+
+         return num;
+      }
+
+      // oh dear unknown anchor
+      return 0;
+   }
+
+   // search for enclosing slide
+
+   // IE getAttribute requires "class" to be "className"
+   var name = ns_pos ? "class" : "className";
+
+   while (true)
+   {
+      // browser coerces html elements to uppercase!
+      if (target.nodeName.toLowerCase() == "div" &&
+          target.getAttribute(name) == "slide")
+      {
+         // found the slide element
+         break;
+      }
+
+      // otherwise try parent element if any
+
+      target = target.parentNode;
+
+      if (!target)
+      {
+         return 0;   // no luck!
+      }
+   };
+
+   for (i = 0; i < slides.length; ++i)
+   {
+      if (slides[i] == target)
+         return i;  // success
+   }
+
+   // oh dear still no luck
+   return 0;
+}
+
+// find slide name from h1 element
+// should allow for h1 within a div (FIX ME)
+// default to document title
+function slideName()
+{
+   var nodes = slides[slidenum].childNodes
+
+   for (var i = 0; i < nodes.length; ++i)
+   {
+      var node = nodes[i];
+
+      if (node.nodeType == 1 &&
+           (node.nodeName == "H1" || node.nodeName == "h1"))
+         return node.innerHTML;
+   }
+
+   return title;
+}
+
+// find copyright text from meta element
+function findCopyright()
+{
+   var name, content;
+   var meta = document.getElementsByTagName("meta");
+
+   for (var i = 0; i < meta.length; ++i)
+   {
+      name = meta[i].getAttribute("name");
+      content = meta[i].getAttribute("content");
+
+      if (name == "copyright")
+         return content;
+   }
+
+   return null;
+}
+
+function addToolbar()
+{
+   var slideCounter, page;
+
+   var toolbar = createElement("div");
+   toolbar.setAttribute("class", "toolbar");
+
+   if (ns_pos) // a reasonably behaved browser
+   {
+      var right = document.createElement("div");
+      right.setAttribute("style", "float: right; text-align: right");
+
+      slideCounter = document.createElement("div")
+      slideCounter.innerHTML = "slide n/m";
+      right.appendChild(slideCounter);
+      toolbar.appendChild(right);
+
+      var left = document.createElement("div");
+      left.setAttribute("style", "text-align: left");
+
+      // global end of slide indicator
+      eos = document.createElement("span");
+      eos.innerHTML = "* ";
+      left.appendChild(eos);
+
+      var help = document.createElement("a");
+      help.setAttribute("href", helpPage);
+      help.setAttribute("title", helpText);
+      help.innerHTML = "help?";
+      left.appendChild(help);
+
+      var gap = document.createTextNode(" ");
+      left.appendChild(gap);
+
+      var i = location.href.indexOf("#");
+
+      // check if anchor is entire page
+
+      if (i > 0)
+         page = location.href.substr(0, i);
+      else
+         page = location.href;
+
+      var start = document.createElement("a");
+      start.setAttribute("href", page);
+      start.setAttribute("title", "restart presentation");
+      start.innerHTML = "restart?";
+      left.appendChild(start);
+
+      var copyright = findCopyright();
+
+      if (copyright)
+      {
+         var span = document.createElement("span");
+         span.innerHTML = copyright;
+         span.style.color = "black";
+         span.style.marginLeft = "4em";
+         left.appendChild(span);
+      }
+
+      toolbar.appendChild(left);
+   }
+   else // IE so need to work around its poor CSS support
+   {
+      toolbar.style.position = "absolute";
+      toolbar.style.zIndex = "200";
+      toolbar.style.width = "100%";
+      toolbar.style.height = "1.2em";
+      toolbar.style.top = "auto";
+      toolbar.style.bottom = "0";
+      toolbar.style.left = "0";
+      toolbar.style.right = "0";
+      toolbar.style.textAlign = "left";
+      toolbar.style.fontSize = "60%";
+      toolbar.style.color = "red";
+      toolbar.borderWidth = 0;
+      toolbar.style.background = "rgb(240,240,240)";
+
+      // would like to have help text left aligned
+      // and page counter right aligned, floating
+      // div's don't work, so instead use nested
+      // absolutely positioned div's.
+
+      var sp = document.createElement("span");
+      sp.innerHTML = "&nbsp;&nbsp;*&nbsp;";
+      toolbar.appendChild(sp);
+      eos = sp;  // end of slide indicator
+
+      var help = document.createElement("a");
+      help.setAttribute("href", helpPage);
+      help.setAttribute("title", helpText);
+      help.innerHTML = "help?";
+      toolbar.appendChild(help);
+
+      var gap = document.createTextNode(" ");
+      toolbar.appendChild(gap);
+
+      var i = location.href.indexOf("#");
+
+      // check if anchor is entire page
+
+      if (i > 0)
+         page = location.href.substr(0, i);
+      else
+         page = location.href;
+
+      var start = document.createElement("a");
+      start.setAttribute("href", page);
+      start.setAttribute("title", "restart presentation");
+      start.innerHTML = "restart?";
+      toolbar.appendChild(start);
+
+      var copyright = findCopyright();
+
+      if (copyright)
+      {
+         var span = document.createElement("span");
+         span.innerHTML = copyright;
+         span.style.color = "black";
+         span.style.marginLeft = "2em";
+         toolbar.appendChild(span);
+      }
+
+      slideCounter = document.createElement("div")
+      slideCounter.style.position = "absolute";
+      slideCounter.style.width = "auto"; //"20%";
+      slideCounter.style.height = "1.2em";
+      slideCounter.style.top = "auto";
+      slideCounter.style.bottom = 0;
+      slideCounter.style.right = "0";
+      slideCounter.style.textAlign = "right";
+      slideCounter.style.color = "red";
+      slideCounter.style.background = "rgb(240,240,240)";
+
+      slideCounter.innerHTML = "slide n/m";
+      toolbar.appendChild(slideCounter);
+   }
+
+   // ensure that click isn't passed through to the page
+   toolbar.onclick = stopPropagation;
+   document.body.appendChild(toolbar);
+   slideNumElement = slideCounter;
+   setEosStatus(false);
+
+   return toolbar;
+}
+
+function replaceByNonBreakingSpace(str)
+{
+   for (var i = 0; i < str.length; ++i)
+      str[i] = 160;
+}
+
+function stopPropagation(e)
+{
+   if (window.event)
+   {
+      window.event.cancelBubble = true;
+      //window.event.returnValue = false;
+   }
+   else
+   {
+      e.cancelBubble = true;
+      e.stopPropagation();
+      //e.preventDefault();
+   }
+}
+
+// works with text/html and text/xhtml+xml with thanks to Simon Willison
+function createElement(element)
+{
+   if (typeof document.createElementNS != 'undefined')
+   {
+      return document.createElementNS('http://www.w3.org/1999/xhtml', element);
+   }
+
+   if (typeof document.createElement != 'undefined')
+   {
+      return document.createElement(element);
+   }
+
+   return false;
+}
+
+// designed to work with both text/html and text/xhtml+xml
+function getElementsByTagName(name)
+{
+   if (typeof document.getElementsByTagNameNS != 'undefined')
+   {
+      return document.getElementsByTagNameNS('http://www.w3.org/1999/xhtml', name);
+   }
+
+   if (typeof document.getElementsByTagName != 'undefined')
+   {
+      return document.getElementsByTagName(name);
+   }
+
+   return null;
+}
+
+// clean alternative to innerHTML method, but on IE6
+// it doesn't work with named entities like &nbsp;
+// which need to be replaced by numeric entities
+function insertText(element, text)
+{
+   if (element.textContent)  // DOM3 only
+      element.textContent = text;
+   else
+   {
+      if (element.firstChild)
+      {
+         // remove current children
+         while (element.firstChild)
+            element.removeChild(element.firstChild);
+      }
+
+      element.appendChild(document.createTextNode(text));
+   }
+}

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group-logo.gif
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group-logo.gif?rev=344062&view=auto
==============================================================================
Binary file - no diff available.

Propchange: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group-logo.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group.svg
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group.svg?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group.svg (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/group.svg Sun Nov 13 23:16:11 2005
@@ -0,0 +1,82 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation or its licensors,
+  as applicable.
+
+  Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!--
+       SVG Anteater logo
+
+To get started with SVG, I'd recommend getting the Adobe SVG plugin, and the
+xml-batik CVS module. Then have a look at the xml-batik/samples files. Use the
+SVG spec (http://www.w3.org/TR/SVG/) as a reference.
+-->
+
+<!-- See Forrest Issue: FOR-229
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
+[
+ <!ATTLIST svg xmlns:for CDATA #FIXED "http://apache.org/forrest">
+ <!ENTITY % textExt "|for:group-name">
+ <!ELEMENT for:group-name (#PCDATA)>
+]>
+-->
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+     xsl:version="1.0"
+     xmlns:for="http://apache.org/forrest"
+     width="220" height="65" >
+  <title>Anteater logo</title>
+
+  <defs>
+
+    <!--
+    <radialGradient id="radialGradient">
+      <stop style="stop-color:gold" offset="0"/>
+      <stop style="stop-color:orange" offset=".5"/>
+      <stop style="stop-color:crimson" offset="1"/>
+    </radialGradient>
+    <linearGradient id="linearGradient">
+      <stop style="stop-color:gold" offset="0"/>
+      <stop style="stop-color:orange" offset=".5"/>
+      <stop style="stop-color:crimson" offset="1"/>
+    </linearGradient>
+    -->
+
+    <linearGradient id="gradient" x1="0" y1="0" x2="0" y2="1">
+      <stop style="stop-color:white" offset="0"/>
+      <stop style="stop-color:lightgreen" offset="1"/>
+    </linearGradient>
+
+    <filter id="shadowFilter" filterUnits="objectBoundingBox" width="1.4" height="1.4">
+      <!-- Takes the alpha channel (black outline of the text), blurs it and saves as 'blur' -->
+      <feGaussianBlur in="SourceAlpha" stdDeviation="2 2" result="blur"/>
+      <!-- Takes saved 'blur' and offsets it by 4 pixels, saves as 'offsetBlur' -->
+      <feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>
+      <!-- Merges SourceGraphic (original image) and 'offsetBlur', putting the
+      former 'over' the latter, and using the merged result as the finished
+      image -->
+      <feComposite in="SourceGraphic" in2="offsetBlur" operator="over"/>
+    </filter>
+
+  </defs>
+
+  <g filter="url(#shadowFilter)" fill="url(#gradient)">
+    <text x="40%" y="60%" style="font-size:24pt; font-family:Verdana ; text-anchor: middle">
+    <for:group-name />
+    </text>
+  </g>
+</svg>

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/icon.png
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/icon.png?rev=344062&view=auto
==============================================================================
Binary file - no diff available.

Propchange: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/icon.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project-logo.gif
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project-logo.gif?rev=344062&view=auto
==============================================================================
Binary file - no diff available.

Propchange: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project-logo.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project.svg
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project.svg?rev=344062&view=auto
==============================================================================
--- forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project.svg (added)
+++ forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/project.svg Sun Nov 13 23:16:11 2005
@@ -0,0 +1,82 @@
+<?xml version="1.0" standalone="no"?>
+<!--
+  Copyright 2002-2004 The Apache Software Foundation or its licensors,
+  as applicable.
+
+  Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!--
+       SVG Anteater logo
+
+To get started with SVG, I'd recommend getting the Adobe SVG plugin, and the
+xml-batik CVS module. Then have a look at the xml-batik/samples files. Use the
+SVG spec (http://www.w3.org/TR/SVG/) as a reference.
+-->
+
+<!-- See Forrest Issue: FOR-229
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
+"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"
+[
+ <!ATTLIST svg xmlns:for CDATA #FIXED "http://apache.org/forrest">
+ <!ENTITY % textExt "|for:project-name">
+ <!ELEMENT for:project-name (#PCDATA)>
+]>
+-->
+<svg xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+     xsl:version="1.0"
+     xmlns:for="http://apache.org/forrest"
+     width="420" height="65" >
+  <title>Anteater logo</title>
+
+  <defs>
+
+    <!--
+    <radialGradient id="radialGradient">
+      <stop style="stop-color:gold" offset="0"/>
+      <stop style="stop-color:orange" offset=".5"/>
+      <stop style="stop-color:crimson" offset="1"/>
+    </radialGradient>
+    <linearGradient id="linearGradient">
+      <stop style="stop-color:gold" offset="0"/>
+      <stop style="stop-color:orange" offset=".5"/>
+      <stop style="stop-color:crimson" offset="1"/>
+    </linearGradient>
+    -->
+
+    <linearGradient id="gradient" x1="0" y1="0" x2="0" y2="1">
+      <stop style="stop-color:white" offset="0"/>
+      <stop style="stop-color:lightgreen" offset="1"/>
+    </linearGradient>
+
+    <filter id="shadowFilter" filterUnits="objectBoundingBox" width="1.4" height="1.4">
+      <!-- Takes the alpha channel (black outline of the text), blurs it and saves as 'blur' -->
+      <feGaussianBlur in="SourceAlpha" stdDeviation="2 2" result="blur"/>
+      <!-- Takes saved 'blur' and offsets it by 4 pixels, saves as 'offsetBlur' -->
+      <feOffset in="blur" dx="4" dy="4" result="offsetBlur"/>
+      <!-- Merges SourceGraphic (original image) and 'offsetBlur', putting the
+      former 'over' the latter, and using the merged result as the finished
+      image -->
+      <feComposite in="SourceGraphic" in2="offsetBlur" operator="over"/>
+    </filter>
+
+  </defs>
+
+  <g filter="url(#shadowFilter)" fill="url(#gradient)">
+    <text x="100%" y="60%" style="font-size:24pt; font-family:Verdana ; text-anchor: end" >
+    <for:project-name />
+    </text>
+  </g>
+</svg>

Added: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/usemap.gif
URL: http://svn.apache.org/viewcvs/forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/usemap.gif?rev=344062&view=auto
==============================================================================
Binary file - no diff available.

Propchange: forrest/trunk/whiteboard/plugins/org.apache.forrest.plugin.output.smartSlides/src/documentation/content/xdocs/images/usemap.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream



Re: Ouput plugins not based on xdocs (was: Re: svn commit: r344062 [1/2] )

Posted by Thorsten Scherler <th...@apache.org>.
El lun, 14-11-2005 a las 21:09 +0100, Ferdinand Soethe escribió:
> Hi Thorsten,
> 
> > a) this plugin do *not* work with our internal format which is against
> > our TR. I read a proposal of bypassing the internal format, I am -1 on
> > such plugins because e.g. I could not transform my index.xml to the
> > smartSlide output.
> 
> The plugin-work-in-progress is still there and unchanged because Ross
> and I decided to wait for other people to comment on the bypass
> proposal and our discussion during these last few days.
> 

A bypassing plugin would IMO not be necessary if the smartSlides would
use e.g. the new xhtml2 internal format. It is new and we still need a
show case of the new power. That means as well that we can propose
extensions to the internal format if we need them for plugins like the
smartSlides.

...and btw the dispatcher contracts already can bypass the core by
contacting any business service (nuggets). 

> > b) the outcome of this plugins seems to be plain html, IMO that can (and
> > should) be done via a v2 theme. Why is this no theme?
> 
> Is your expectation that new developments make use of features
> that are still under development? 

(now personally speaking, no offense nor expectations implied!)

Actually as a "professional" developer I am always trying to use the
newest features for new developments if it makes sense. 

That helps me in the future because I know more or less how this new
stuff (new features) work and where the limitations are. That determines
in which use cases I can use them for my customers. 

On the other hand by testing the new features I can contribute back my
feedback, which helps the community which developed the feature and be
sure some people are very grateful happily helping with problems that I
may encounter. 

That is me personally, but IMO it makes a lot of sense as well for
"hobby" programmers like me in *this* project, trying to bring forrest
closer to 1.0. I can test new features and help develop them. :)

I do not *expect* this attitude from anyone besides myself, but
definitely *appreciate* it if others doing the same. 

(btt - back to topic)

Sure v2 and the dispatcher are still under development but that is why
it makes sense to use it in this case. You can provide feedback and we
can give you a helping hand developing a smartSlides theme. 

Like said above contracts can contact any given business service. The
only thing that we have to do is, the xsl of the plugin has to be
snippet to contracts (quite easy). 

IMO it is better to use already developed or under development features
that can solve the problem instead of creating bypassing plugins.

> If so, how are they supposed to run
> under the current version 0.7? Which was my intention when I started
> working on SmartSlides.
> 

see above I normally develop new features for new releases, but one can
normally backport features to different versions if needed.

salu2

thorsten

"Together we stand, divided we fall!" 
Hey you (Pink Floyd)


Re: Ouput plugins not based on xdocs (was: Re: svn commit: r344062 [1/2] )

Posted by Ferdinand Soethe <fe...@apache.org>.
Hi Thorsten,

> a) this plugin do *not* work with our internal format which is against
> our TR. I read a proposal of bypassing the internal format, I am -1 on
> such plugins because e.g. I could not transform my index.xml to the
> smartSlide output.

The plugin-work-in-progress is still there and unchanged because Ross
and I decided to wait for other people to comment on the bypass
proposal and our discussion during these last few days.

> b) the outcome of this plugins seems to be plain html, IMO that can (and
> should) be done via a v2 theme. Why is this no theme?

Is your expectation that new developments make use of features
that are still under development? If so, how are they supposed to run
under the current version 0.7? Which was my intention when I started
working on SmartSlides.

--
Ferdinand Soethe


Ouput plugins not based on xdocs (was: Re: svn commit: r344062 [1/2] )

Posted by Thorsten Scherler <th...@apache.org>.
El lun, 14-11-2005 a las 07:16 +0000, ferdinand@apache.org escribió:
> Author: ferdinand
> Date: Sun Nov 13 23:16:11 2005
> New Revision: 344062
> 
> URL: http://svn.apache.org/viewcvs?rev=344062&view=rev
> Log:
> SmartSlides Output Plugin for discussion and reference (adding missing code)

I just had a quick glance on the code and I have a couple of questions:
a) this plugin do *not* work with our internal format which is against
our TR. I read a proposal of bypassing the internal format, I am -1 on
such plugins because e.g. I could not transform my index.xml to the
smartSlide output. 
b) the outcome of this plugins seems to be plain html, IMO that can (and
should) be done via a v2 theme. Why is this no theme?

salu2
-- 
thorsten

"Together we stand, divided we fall!" 
Hey you (Pink Floyd)