summaryrefslogtreecommitdiff
path: root/data
diff options
context:
space:
mode:
authorJohn MacFarlane <fiddlosopher@gmail.com>2012-12-29 18:14:09 -0800
committerJohn MacFarlane <fiddlosopher@gmail.com>2012-12-29 18:14:29 -0800
commit2f984b607469ea8228ea6c1aa2c52aec5845faa3 (patch)
tree17cd3be4871a1840cd91c45b309efcc81d1c1d89 /data
parent1864bb0994cc70b99ea8207b3a22438c343348c0 (diff)
Moved all data files and templates to data/.
Diffstat (limited to 'data')
-rw-r--r--data/default.csl422
-rw-r--r--data/dzslides/template.html585
-rw-r--r--data/epub.css31
-rw-r--r--data/reference.docxbin0 -> 8299 bytes
-rw-r--r--data/reference.odtbin0 -> 7058 bytes
-rw-r--r--data/s5/default/blank.gifbin0 -> 49 bytes
-rw-r--r--data/s5/default/bodybg.gifbin0 -> 10119 bytes
-rw-r--r--data/s5/default/framing.css23
-rw-r--r--data/s5/default/iepngfix.htc42
-rw-r--r--data/s5/default/opera.css7
-rw-r--r--data/s5/default/outline.css15
-rw-r--r--data/s5/default/pretty.css86
-rw-r--r--data/s5/default/print.css24
-rw-r--r--data/s5/default/s5-core.css9
-rw-r--r--data/s5/default/slides.css3
-rw-r--r--data/s5/default/slides.js553
-rw-r--r--data/slideous/slideous.css95
-rw-r--r--data/slideous/slideous.js321
-rw-r--r--data/slidy/graphics/fold-dim.gifbin0 -> 56 bytes
-rw-r--r--data/slidy/graphics/fold.gifbin0 -> 56 bytes
-rw-r--r--data/slidy/graphics/nofold-dim.gifbin0 -> 48 bytes
-rw-r--r--data/slidy/graphics/unfold-dim.gifbin0 -> 59 bytes
-rw-r--r--data/slidy/graphics/unfold.gifbin0 -> 59 bytes
-rw-r--r--data/slidy/scripts/slidy.js.gzbin0 -> 12801 bytes
-rw-r--r--data/slidy/styles/slidy.css405
m---------data/templates6
26 files changed, 2627 insertions, 0 deletions
diff --git a/data/default.csl b/data/default.csl
new file mode 100644
index 000000000..dea707114
--- /dev/null
+++ b/data/default.csl
@@ -0,0 +1,422 @@
+<?xml version="1.0" encoding="utf-8"?>
+<style xmlns="http://purl.org/net/xbiblio/csl" class="in-text" version="1.0" demote-non-dropping-particle="sort-only">
+ <info>
+ <title>Chicago Manual of Style (Author-Date format)</title>
+ <id>http://www.zotero.org/styles/chicago-author-date</id>
+ <link href="http://www.zotero.org/styles/chicago-author-date" rel="self"/>
+ <author>
+ <name>Julian Onions</name>
+ <email>julian.onions@gmail.com</email>
+ </author>
+ <contributor>
+ <name>Sebastian Karcher</name>
+ </contributor>
+ <category citation-format="author-date"/>
+ <category field="generic-base"/>
+ <updated>2011-11-17T22:01:05+00:00</updated>
+ <summary>The author-date variant of the Chicago style</summary>
+ <link href="http://www.chicagomanualofstyle.org/tools_citationguide.html" rel="documentation"/>
+ <rights>This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/</rights>
+ </info>
+ <macro name="secondary-contributors">
+ <choose>
+ <if type="chapter paper-conference" match="none">
+ <group delimiter=". ">
+ <choose>
+ <if variable="author">
+ <names variable="editor">
+ <label form="verb-short" text-case="capitalize-first" suffix=". " strip-periods="true"/>
+ <name and="text" delimiter=", "/>
+ </names>
+ </if>
+ </choose>
+ <choose>
+ <if variable="author editor" match="any">
+ <names variable="translator">
+ <label form="verb-short" text-case="capitalize-first" suffix=". " strip-periods="true"/>
+ <name and="text" delimiter=", "/>
+ </names>
+ </if>
+ </choose>
+ </group>
+ </if>
+ </choose>
+ </macro>
+ <macro name="container-contributors">
+ <choose>
+ <if type="chapter paper-conference" match="any">
+ <group prefix="," delimiter=", ">
+ <choose>
+ <if variable="author">
+ <names variable="editor">
+ <label form="verb-short" prefix=" " text-case="lowercase" suffix=". " strip-periods="true"/>
+ <name and="text" delimiter=", "/>
+ </names>
+ <choose>
+ <if variable="container-author">
+ <group>
+ <names variable="container-author">
+ <label form="verb-short" prefix=" " text-case="lowercase" suffix=" " strip-periods="true"/>
+ <name and="text" delimiter=", "/>
+ </names>
+ </group>
+ </if>
+ </choose>
+ </if>
+ </choose>
+ <choose>
+ <if variable="author editor" match="any">
+ <names variable="translator">
+ <label form="verb-short" prefix=" " text-case="lowercase" suffix=". " strip-periods="true"/>
+ <name and="text" delimiter=", "/>
+ </names>
+ </if>
+ </choose>
+ </group>
+ </if>
+ </choose>
+ </macro>
+ <macro name="anon">
+ <text term="anonymous" form="short" text-case="capitalize-first" suffix="." strip-periods="true"/>
+ </macro>
+ <macro name="editor">
+ <names variable="editor">
+ <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
+ <label form="short" prefix=", " suffix="." strip-periods="true"/>
+ </names>
+ </macro>
+ <macro name="translator">
+ <names variable="translator">
+ <name name-as-sort-order="first" and="text" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
+ <label form="verb-short" prefix=", " suffix="." strip-periods="true"/>
+ </names>
+ </macro>
+ <macro name="recipient">
+ <choose>
+ <if type="personal_communication">
+ <choose>
+ <if variable="genre">
+ <text variable="genre" text-case="capitalize-first"/>
+ </if>
+ <else>
+ <text term="letter" text-case="capitalize-first"/>
+ </else>
+ </choose>
+ </if>
+ </choose>
+ <names variable="recipient" delimiter=", ">
+ <label form="verb" prefix=" " text-case="lowercase" suffix=" "/>
+ <name and="text" delimiter=", "/>
+ </names>
+ </macro>
+ <macro name="contributors">
+ <names variable="author">
+ <name and="text" name-as-sort-order="first" sort-separator=", " delimiter=", " delimiter-precedes-last="always"/>
+ <label form="verb-short" prefix=", " suffix="." text-case="lowercase" strip-periods="true"/>
+ <substitute>
+ <text macro="editor"/>
+ <text macro="translator"/>
+ <text macro="anon"/>
+ </substitute>
+ </names>
+ <text macro="recipient"/>
+ </macro>
+ <macro name="contributors-short">
+ <names variable="author">
+ <name form="short" and="text" delimiter=", " initialize-with=". "/>
+ <substitute>
+ <names variable="editor"/>
+ <names variable="translator"/>
+ <text macro="anon"/>
+ </substitute>
+ </names>
+ </macro>
+ <macro name="interviewer">
+ <names variable="interviewer" delimiter=", ">
+ <label form="verb" prefix=" " text-case="capitalize-first" suffix=" "/>
+ <name and="text" delimiter=", "/>
+ </names>
+ </macro>
+ <macro name="archive">
+ <group delimiter=". ">
+ <text variable="archive_location" text-case="capitalize-first"/>
+ <text variable="archive"/>
+ <text variable="archive-place"/>
+ </group>
+ </macro>
+ <macro name="access">
+ <group delimiter=". ">
+ <choose>
+ <if type="graphic report" match="any">
+ <text macro="archive"/>
+ </if>
+ <else-if type="bill book graphic legal_case motion_picture report song article-magazine article-newspaper thesis chapter paper-conference" match="none">
+ <text macro="archive"/>
+ </else-if>
+ </choose>
+ <text variable="DOI" prefix="doi:"/>
+ <choose>
+ <if type="legal_case" match="none">
+ <text variable="URL"/>
+ </if>
+ </choose>
+ </group>
+ </macro>
+ <macro name="title">
+ <choose>
+ <if variable="title" match="none">
+ <choose>
+ <if type="personal_communication" match="none">
+ <text variable="genre" text-case="capitalize-first"/>
+ </if>
+ </choose>
+ </if>
+ <else-if type="bill book graphic legal_case motion_picture report song" match="any">
+ <text variable="title" font-style="italic"/>
+ </else-if>
+ <else>
+ <text variable="title" quotes="true"/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="edition">
+ <choose>
+ <if type="bill book graphic legal_case motion_picture report song chapter paper-conference" match="any">
+ <choose>
+ <if is-numeric="edition">
+ <group delimiter=" ">
+ <number variable="edition" form="ordinal"/>
+ <text term="edition" form="short" suffix="." strip-periods="true"/>
+ </group>
+ </if>
+ <else>
+ <text variable="edition" suffix="."/>
+ </else>
+ </choose>
+ </if>
+ </choose>
+ </macro>
+ <macro name="locators">
+ <choose>
+ <if type="article-journal">
+ <text variable="volume" prefix=" "/>
+ <text variable="issue" prefix=" (" suffix=")"/>
+ </if>
+ <else-if type="legal_case">
+ <text variable="volume" prefix=", "/>
+ <text variable="container-title" prefix=" "/>
+ <text variable="page" prefix=" "/>
+ </else-if>
+ <else-if type="bill book graphic legal_case motion_picture report song" match="any">
+ <group prefix=". " delimiter=". ">
+ <group>
+ <text term="volume" form="short" text-case="capitalize-first" suffix=". " strip-periods="true"/>
+ <number variable="volume" form="numeric"/>
+ </group>
+ <group>
+ <number variable="number-of-volumes" form="numeric"/>
+ <text term="volume" form="short" prefix=" " suffix="." plural="true" strip-periods="true"/>
+ </group>
+ </group>
+ </else-if>
+ <else-if type="chapter paper-conference" match="any">
+ <choose>
+ <if variable="page" match="none">
+ <group prefix=". ">
+ <text term="volume" form="short" text-case="capitalize-first" suffix=". " strip-periods="true"/>
+ <number variable="volume" form="numeric"/>
+ </group>
+ </if>
+ </choose>
+ </else-if>
+ </choose>
+ </macro>
+ <macro name="locators-chapter">
+ <choose>
+ <if type="chapter paper-conference" match="any">
+ <choose>
+ <if variable="page">
+ <group prefix=", ">
+ <text variable="volume" suffix=":"/>
+ <text variable="page"/>
+ </group>
+ </if>
+ </choose>
+ </if>
+ </choose>
+ </macro>
+ <macro name="locators-article">
+ <choose>
+ <if type="article-newspaper">
+ <group prefix=", " delimiter=", ">
+ <group>
+ <text variable="edition" suffix=" "/>
+ <text term="edition" prefix=" "/>
+ </group>
+ <group>
+ <text term="section" form="short" suffix=". " strip-periods="true"/>
+ <text variable="section"/>
+ </group>
+ </group>
+ </if>
+ <else-if type="article-journal">
+ <text variable="page" prefix=": "/>
+ </else-if>
+ </choose>
+ </macro>
+ <macro name="point-locators">
+ <choose>
+ <if variable="locator">
+ <choose>
+ <if locator="page" match="none">
+ <choose>
+ <if type="bill book graphic legal_case motion_picture report song" match="any">
+ <choose>
+ <if variable="volume">
+ <group>
+ <text term="volume" form="short" text-case="lowercase" suffix=". " strip-periods="true"/>
+ <number variable="volume" form="numeric"/>
+ <label variable="locator" form="short" prefix=", " suffix=" "/>
+ </group>
+ </if>
+ <else>
+ <label variable="locator" form="short" suffix=" "/>
+ </else>
+ </choose>
+ </if>
+ </choose>
+ </if>
+ <else-if type="bill book graphic legal_case motion_picture report song" match="any">
+ <number variable="volume" form="numeric" suffix=":"/>
+ </else-if>
+ </choose>
+ <text variable="locator"/>
+ </if>
+ </choose>
+ </macro>
+ <macro name="container-prefix">
+ <text term="in" text-case="capitalize-first"/>
+ </macro>
+ <macro name="container-title">
+ <choose>
+ <if type="chapter paper-conference" match="any">
+ <text macro="container-prefix" suffix=" "/>
+ </if>
+ </choose>
+ <choose>
+ <if type="legal_case" match="none">
+ <text variable="container-title" font-style="italic"/>
+ </if>
+ </choose>
+ </macro>
+ <macro name="publisher">
+ <group delimiter=": ">
+ <text variable="publisher-place"/>
+ <text variable="publisher"/>
+ </group>
+ </macro>
+ <macro name="date">
+ <date variable="issued">
+ <date-part name="year"/>
+ </date>
+ </macro>
+ <macro name="day-month">
+ <date variable="issued">
+ <date-part name="month"/>
+ <date-part name="day" prefix=" "/>
+ </date>
+ </macro>
+ <macro name="collection-title">
+ <text variable="collection-title"/>
+ <text variable="collection-number" prefix=" "/>
+ </macro>
+ <macro name="event">
+ <group>
+ <text term="presented at" suffix=" "/>
+ <text variable="event"/>
+ </group>
+ </macro>
+ <macro name="description">
+ <choose>
+ <if type="interview">
+ <group delimiter=". ">
+ <text macro="interviewer"/>
+ <text variable="medium" text-case="capitalize-first"/>
+ </group>
+ </if>
+ <else>
+ <text variable="medium" text-case="capitalize-first" prefix=". "/>
+ </else>
+ </choose>
+ <choose>
+ <if variable="title" match="none"/>
+ <else-if type="thesis"/>
+ <else>
+ <text variable="genre" text-case="capitalize-first" prefix=". "/>
+ </else>
+ </choose>
+ </macro>
+ <macro name="issue">
+ <choose>
+ <if type="article-journal">
+ <text macro="day-month" prefix=" (" suffix=")"/>
+ </if>
+ <else-if type="legal_case">
+ <text variable="authority" prefix=". "/>
+ </else-if>
+ <else-if type="speech">
+ <group prefix=" " delimiter=", ">
+ <text macro="event"/>
+ <text macro="day-month"/>
+ <text variable="event-place"/>
+ </group>
+ </else-if>
+ <else-if type="article-newspaper article-magazine" match="any">
+ <text macro="day-month" prefix=", "/>
+ </else-if>
+ <else>
+ <group prefix=". " delimiter=", ">
+ <choose>
+ <if type="thesis">
+ <text variable="genre" text-case="capitalize-first"/>
+ </if>
+ </choose>
+ <text macro="publisher"/>
+ </group>
+ </else>
+ </choose>
+ </macro>
+ <citation et-al-min="4" et-al-use-first="1" disambiguate-add-year-suffix="true" disambiguate-add-names="true" disambiguate-add-givenname="true" givenname-disambiguation-rule="primary-name">
+ <layout prefix="(" suffix=")" delimiter="; ">
+ <group delimiter=", ">
+ <group delimiter=" ">
+ <text macro="contributors-short"/>
+ <text macro="date"/>
+ </group>
+ <text macro="point-locators"/>
+ </group>
+ </layout>
+ </citation>
+ <bibliography hanging-indent="true" et-al-min="11" et-al-use-first="7" subsequent-author-substitute="———" entry-spacing="0">
+ <sort>
+ <key macro="contributors"/>
+ <key variable="issued"/>
+ </sort>
+ <layout suffix=".">
+ <text macro="contributors" suffix=". "/>
+ <text macro="date" suffix=". "/>
+ <text macro="title"/>
+ <text macro="description"/>
+ <text macro="secondary-contributors" prefix=". "/>
+ <text macro="container-title" prefix=". "/>
+ <text macro="container-contributors"/>
+ <text macro="locators-chapter"/>
+ <text macro="edition" prefix=". "/>
+ <text macro="locators"/>
+ <text macro="collection-title" prefix=". "/>
+ <text macro="issue"/>
+ <text macro="locators-article"/>
+ <text macro="access" prefix=". "/>
+ </layout>
+ </bibliography>
+</style> \ No newline at end of file
diff --git a/data/dzslides/template.html b/data/dzslides/template.html
new file mode 100644
index 000000000..f2fb64b38
--- /dev/null
+++ b/data/dzslides/template.html
@@ -0,0 +1,585 @@
+<!DOCTYPE html>
+
+<meta charset="utf-8">
+<title>The Title Of Your Presentation</title>
+
+<!-- Your Slides -->
+<!-- One section is one slide -->
+
+<section>
+ <!-- This is the first slide -->
+ <h1>My Presentation</h1>
+ <footer>by John Doe</footer>
+</section>
+
+<section>
+ <p>Some random text: But I've never been to the moon! You can see how I lived before I met you. Also Zoidberg.
+ I could if you hadn't turned on the light and shut off my stereo.</p>
+</section>
+
+<section>
+ <h3>An incremental list</h3>
+ <ul class="incremental">
+ <li>Item 1
+ <li>Item 2
+ <li>Item 3
+ </ul>
+ <details>Some notes. They are only visible using onstage shell.</details>
+</section>
+
+<section>
+ <q>
+ Who's brave enough to fly into something we all keep calling a death sphere?
+ </q>
+</section>
+
+<section>
+ <h2>Part two</h2>
+</section>
+
+<section>
+ <figure> <!-- Figures are used to display images and videos fullpage -->
+ <img src="http://placekitten.com/g/800/600">
+ <figcaption>An image</figcaption>
+ </figure>
+ <details>Kittens are so cute!</details>
+</section>
+
+<section>
+ <figure> <!-- Videos are automatically played -->
+ <video src="http://videos-cdn.mozilla.net/brand/Mozilla_Firefox_Manifesto_v0.2_640.webm" poster="http://www.mozilla.org/images/about/poster.jpg"></video>
+ <figcaption>A video</figcaption>
+ </figure>
+</section>
+
+<section>
+ <h2>End!</h2>
+</section>
+
+<!-- Your Style -->
+<!-- Define the style of your presentation -->
+
+<!-- Maybe a font from http://www.google.com/webfonts ? -->
+<link href='http://fonts.googleapis.com/css?family=Oswald' rel='stylesheet'>
+
+<style>
+ html { background-color: black; }
+ body { background-color: white; border-radius: 12px}
+ /* A section is a slide. It's size is 800x600, and this will never change */
+ section {
+ /* The font from Google */
+ font-family: 'Oswald', arial, serif;
+ font-size: 30px;
+ }
+ h1, h2 {
+ margin-top: 200px;
+ text-align: center;
+ font-size: 80px;
+ }
+ h3 {
+ margin: 100px 0 50px 100px;
+ }
+
+ ul {
+ margin: 50px 200px;
+ }
+
+ p {
+ margin: 75px;
+ font-size: 50px;
+ }
+
+ q {
+ display: block;
+ width: 100%;
+ height: 100%;
+ background-color: black;
+ color: white;
+ font-size: 60px;
+ padding: 50px;
+ }
+
+ /* Figures are displayed full-page, with the caption
+ on top of the image/video */
+ figure {
+ background-color: black;
+ }
+ figcaption {
+ margin: 70px;
+ font-size: 50px;
+ }
+
+ footer {
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ padding: 40px;
+ text-align: right;
+ background-color: #F3F4F8;
+ border-top: 1px solid #CCC;
+ }
+
+ /* Transition effect */
+ /* Feel free to change the transition effect for original
+ animations. See here:
+ https://developer.mozilla.org/en/CSS/CSS_transitions
+ How to use CSS3 Transitions: */
+ section {
+ -moz-transition: left 400ms linear 0s;
+ -webkit-transition: left 400ms linear 0s;
+ -ms-transition: left 400ms linear 0s;
+ transition: left 400ms linear 0s;
+ }
+
+ /* Before */
+ section { left: -150%; }
+ /* Now */
+ section[aria-selected] { left: 0; }
+ /* After */
+ section[aria-selected] ~ section { left: +150%; }
+
+ /* Incremental elements */
+
+ /* By default, visible */
+ .incremental > * { opacity: 1; }
+
+ /* The current item */
+ .incremental > *[aria-selected] { opacity: 1; }
+
+ /* The items to-be-selected */
+ .incremental > *[aria-selected] ~ * { opacity: 0; }
+
+ /* The progressbar, at the bottom of the slides, show the global
+ progress of the presentation. */
+ #progress-bar {
+ height: 2px;
+ background: #AAA;
+ }
+</style>
+
+<!-- {{{{ dzslides core
+#
+#
+# __ __ __ . __ ___ __
+# | \ / /__` | | | \ |__ /__`
+# |__/ /_ .__/ |___ | |__/ |___ .__/ core :€
+#
+#
+# The following block of code is not supposed to be edited.
+# But if you want to change the behavior of these slides,
+# feel free to hack it!
+#
+-->
+
+<div id="progress-bar"></div>
+
+<!-- Default Style -->
+<style>
+ * { margin: 0; padding: 0; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box; }
+ details { display: none; }
+ body {
+ width: 800px; height: 600px;
+ margin-left: -400px; margin-top: -300px;
+ position: absolute; top: 50%; left: 50%;
+ overflow: hidden;
+ }
+ section {
+ position: absolute;
+ pointer-events: none;
+ width: 100%; height: 100%;
+ }
+ section[aria-selected] { pointer-events: auto; }
+ html { overflow: hidden; }
+ body { display: none; }
+ body.loaded { display: block; }
+ .incremental {visibility: hidden; }
+ .incremental[active] {visibility: visible; }
+ #progress-bar{
+ bottom: 0;
+ position: absolute;
+ -moz-transition: width 400ms linear 0s;
+ -webkit-transition: width 400ms linear 0s;
+ -ms-transition: width 400ms linear 0s;
+ transition: width 400ms linear 0s;
+ }
+ figure {
+ width: 100%;
+ height: 100%;
+ }
+ figure > * {
+ position: absolute;
+ }
+ figure > img, figure > video {
+ width: 100%; height: 100%;
+ }
+</style>
+
+<script>
+ var Dz = {
+ remoteWindows: [],
+ idx: -1,
+ step: 0,
+ slides: null,
+ progressBar : null,
+ params: {
+ autoplay: "1"
+ }
+ };
+
+ Dz.init = function() {
+ document.body.className = "loaded";
+ this.slides = $$("body > section");
+ this.progressBar = $("#progress-bar");
+ this.setupParams();
+ this.onhashchange();
+ this.setupTouchEvents();
+ this.onresize();
+ }
+
+ Dz.setupParams = function() {
+ var p = window.location.search.substr(1).split('&');
+ p.forEach(function(e, i, a) {
+ var keyVal = e.split('=');
+ Dz.params[keyVal[0]] = decodeURIComponent(keyVal[1]);
+ });
+ // Specific params handling
+ if (!+this.params.autoplay)
+ $$.forEach($$("video"), function(v){ v.controls = true });
+ }
+
+ Dz.onkeydown = function(aEvent) {
+ // Don't intercept keyboard shortcuts
+ if (aEvent.altKey
+ || aEvent.ctrlKey
+ || aEvent.metaKey
+ || aEvent.shiftKey) {
+ return;
+ }
+ if ( aEvent.keyCode == 37 // left arrow
+ || aEvent.keyCode == 38 // up arrow
+ || aEvent.keyCode == 33 // page up
+ ) {
+ aEvent.preventDefault();
+ this.back();
+ }
+ if ( aEvent.keyCode == 39 // right arrow
+ || aEvent.keyCode == 40 // down arrow
+ || aEvent.keyCode == 34 // page down
+ ) {
+ aEvent.preventDefault();
+ this.forward();
+ }
+ if (aEvent.keyCode == 35) { // end
+ aEvent.preventDefault();
+ this.goEnd();
+ }
+ if (aEvent.keyCode == 36) { // home
+ aEvent.preventDefault();
+ this.goStart();
+ }
+ if (aEvent.keyCode == 32) { // space
+ aEvent.preventDefault();
+ this.toggleContent();
+ }
+ if (aEvent.keyCode == 70) { // f
+ aEvent.preventDefault();
+ this.goFullscreen();
+ }
+ }
+
+ /* Touch Events */
+
+ Dz.setupTouchEvents = function() {
+ var orgX, newX;
+ var tracking = false;
+
+ var db = document.body;
+ db.addEventListener("touchstart", start.bind(this), false);
+ db.addEventListener("touchmove", move.bind(this), false);
+
+ function start(aEvent) {
+ aEvent.preventDefault();
+ tracking = true;
+ orgX = aEvent.changedTouches[0].pageX;
+ }
+
+ function move(aEvent) {
+ if (!tracking) return;
+ newX = aEvent.changedTouches[0].pageX;
+ if (orgX - newX > 100) {
+ tracking = false;
+ this.forward();
+ } else {
+ if (orgX - newX < -100) {
+ tracking = false;
+ this.back();
+ }
+ }
+ }
+ }
+
+ /* Adapt the size of the slides to the window */
+
+ Dz.onresize = function() {
+ var db = document.body;
+ var sx = db.clientWidth / window.innerWidth;
+ var sy = db.clientHeight / window.innerHeight;
+ var transform = "scale(" + (1/Math.max(sx, sy)) + ")";
+
+ db.style.MozTransform = transform;
+ db.style.WebkitTransform = transform;
+ db.style.OTransform = transform;
+ db.style.msTransform = transform;
+ db.style.transform = transform;
+ }
+
+
+ Dz.getDetails = function(aIdx) {
+ var s = $("section:nth-of-type(" + aIdx + ")");
+ var d = s.$("details");
+ return d ? d.innerHTML : "";
+ }
+
+ Dz.onmessage = function(aEvent) {
+ var argv = aEvent.data.split(" "), argc = argv.length;
+ argv.forEach(function(e, i, a) { a[i] = decodeURIComponent(e) });
+ var win = aEvent.source;
+ if (argv[0] === "REGISTER" && argc === 1) {
+ this.remoteWindows.push(win);
+ this.postMsg(win, "REGISTERED", document.title, this.slides.length);
+ this.postMsg(win, "CURSOR", this.idx + "." + this.step);
+ return;
+ }
+ if (argv[0] === "BACK" && argc === 1)
+ this.back();
+ if (argv[0] === "FORWARD" && argc === 1)
+ this.forward();
+ if (argv[0] === "START" && argc === 1)
+ this.goStart();
+ if (argv[0] === "END" && argc === 1)
+ this.goEnd();
+ if (argv[0] === "TOGGLE_CONTENT" && argc === 1)
+ this.toggleContent();
+ if (argv[0] === "SET_CURSOR" && argc === 2)
+ window.location.hash = "#" + argv[1];
+ if (argv[0] === "GET_CURSOR" && argc === 1)
+ this.postMsg(win, "CURSOR", this.idx + "." + this.step);
+ if (argv[0] === "GET_NOTES" && argc === 1)
+ this.postMsg(win, "NOTES", this.getDetails(this.idx));
+ }
+
+ Dz.toggleContent = function() {
+ // If a Video is present in this new slide, play it.
+ // If a Video is present in the previous slide, stop it.
+ var s = $("section[aria-selected]");
+ if (s) {
+ var video = s.$("video");
+ if (video) {
+ if (video.ended || video.paused) {
+ video.play();
+ } else {
+ video.pause();
+ }
+ }
+ }
+ }
+
+ Dz.setCursor = function(aIdx, aStep) {
+ // If the user change the slide number in the URL bar, jump
+ // to this slide.
+ aStep = (aStep != 0 && typeof aStep !== "undefined") ? "." + aStep : ".0";
+ window.location.hash = "#" + aIdx + aStep;
+ }
+
+ Dz.onhashchange = function() {
+ var cursor = window.location.hash.split("#"),
+ newidx = 1,
+ newstep = 0;
+ if (cursor.length == 2) {
+ newidx = ~~cursor[1].split(".")[0];
+ newstep = ~~cursor[1].split(".")[1];
+ if (newstep > Dz.slides[newidx - 1].$$('.incremental > *').length) {
+ newstep = 0;
+ newidx++;
+ }
+ }
+ this.setProgress(newidx, newstep);
+ if (newidx != this.idx) {
+ this.setSlide(newidx);
+ }
+ if (newstep != this.step) {
+ this.setIncremental(newstep);
+ }
+ for (var i = 0; i < this.remoteWindows.length; i++) {
+ this.postMsg(this.remoteWindows[i], "CURSOR", this.idx + "." + this.step);
+ }
+ }
+
+ Dz.back = function() {
+ if (this.idx == 1 && this.step == 0) {
+ return;
+ }
+ if (this.step == 0) {
+ this.setCursor(this.idx - 1,
+ this.slides[this.idx - 2].$$('.incremental > *').length);
+ } else {
+ this.setCursor(this.idx, this.step - 1);
+ }
+ }
+
+ Dz.forward = function() {
+ if (this.idx >= this.slides.length &&
+ this.step >= this.slides[this.idx - 1].$$('.incremental > *').length) {
+ return;
+ }
+ if (this.step >= this.slides[this.idx - 1].$$('.incremental > *').length) {
+ this.setCursor(this.idx + 1, 0);
+ } else {
+ this.setCursor(this.idx, this.step + 1);
+ }
+ }
+
+ Dz.goStart = function() {
+ this.setCursor(1, 0);
+ }
+
+ Dz.goEnd = function() {
+ var lastIdx = this.slides.length;
+ var lastStep = this.slides[lastIdx - 1].$$('.incremental > *').length;
+ this.setCursor(lastIdx, lastStep);
+ }
+
+ Dz.setSlide = function(aIdx) {
+ this.idx = aIdx;
+ var old = $("section[aria-selected]");
+ var next = $("section:nth-of-type("+ this.idx +")");
+ if (old) {
+ old.removeAttribute("aria-selected");
+ var video = old.$("video");
+ if (video) {
+ video.pause();
+ }
+ }
+ if (next) {
+ next.setAttribute("aria-selected", "true");
+ var video = next.$("video");
+ if (video && !!+this.params.autoplay) {
+ video.play();
+ }
+ } else {
+ // That should not happen
+ this.idx = -1;
+ // console.warn("Slide doesn't exist.");
+ }
+ }
+
+ Dz.setIncremental = function(aStep) {
+ this.step = aStep;
+ var old = this.slides[this.idx - 1].$('.incremental > *[aria-selected]');
+ if (old) {
+ old.removeAttribute('aria-selected');
+ }
+ var incrementals = $$('.incremental');
+ if (this.step <= 0) {
+ $$.forEach(incrementals, function(aNode) {
+ aNode.removeAttribute('active');
+ });
+ return;
+ }
+ var next = this.slides[this.idx - 1].$$('.incremental > *')[this.step - 1];
+ if (next) {
+ next.setAttribute('aria-selected', true);
+ next.parentNode.setAttribute('active', true);
+ var found = false;
+ $$.forEach(incrementals, function(aNode) {
+ if (aNode != next.parentNode)
+ if (found)
+ aNode.removeAttribute('active');
+ else
+ aNode.setAttribute('active', true);
+ else
+ found = true;
+ });
+ } else {
+ setCursor(this.idx, 0);
+ }
+ return next;
+ }
+
+ Dz.goFullscreen = function() {
+ var html = $('html'),
+ requestFullscreen = html.requestFullscreen || html.requestFullScreen || html.mozRequestFullScreen || html.webkitRequestFullScreen;
+ if (requestFullscreen) {
+ requestFullscreen.apply(html);
+ }
+ }
+
+ Dz.setProgress = function(aIdx, aStep) {
+ var slide = $("section:nth-of-type("+ aIdx +")");
+ if (!slide)
+ return;
+ var steps = slide.$$('.incremental > *').length + 1,
+ slideSize = 100 / (this.slides.length - 1),
+ stepSize = slideSize / steps;
+ this.progressBar.style.width = ((aIdx - 1) * slideSize + aStep * stepSize) + '%';
+ }
+
+ Dz.postMsg = function(aWin, aMsg) { // [arg0, [arg1...]]
+ aMsg = [aMsg];
+ for (var i = 2; i < arguments.length; i++)
+ aMsg.push(encodeURIComponent(arguments[i]));
+ aWin.postMessage(aMsg.join(" "), "*");
+ }
+
+ function init() {
+ Dz.init();
+ window.onkeydown = Dz.onkeydown.bind(Dz);
+ window.onresize = Dz.onresize.bind(Dz);
+ window.onhashchange = Dz.onhashchange.bind(Dz);
+ window.onmessage = Dz.onmessage.bind(Dz);
+ }
+
+ window.onload = init;
+</script>
+
+
+<script> // Helpers
+ if (!Function.prototype.bind) {
+ Function.prototype.bind = function (oThis) {
+
+ // closest thing possible to the ECMAScript 5 internal IsCallable
+ // function
+ if (typeof this !== "function")
+ throw new TypeError(
+ "Function.prototype.bind - what is trying to be fBound is not callable"
+ );
+
+ var aArgs = Array.prototype.slice.call(arguments, 1),
+ fToBind = this,
+ fNOP = function () {},
+ fBound = function () {
+ return fToBind.apply( this instanceof fNOP ? this : oThis || window,
+ aArgs.concat(Array.prototype.slice.call(arguments)));
+ };
+
+ fNOP.prototype = this.prototype;
+ fBound.prototype = new fNOP();
+
+ return fBound;
+ };
+ }
+
+ var $ = (HTMLElement.prototype.$ = function(aQuery) {
+ return this.querySelector(aQuery);
+ }).bind(document);
+
+ var $$ = (HTMLElement.prototype.$$ = function(aQuery) {
+ return this.querySelectorAll(aQuery);
+ }).bind(document);
+
+ $$.forEach = function(nodeList, fun) {
+ Array.prototype.forEach.call(nodeList, fun);
+ }
+
+</script>
+<!-- vim: set fdm=marker: }}} -->
diff --git a/data/epub.css b/data/epub.css
new file mode 100644
index 000000000..6737f5cc7
--- /dev/null
+++ b/data/epub.css
@@ -0,0 +1,31 @@
+/* This defines styles and classes used in the book */
+body { margin-left: 5%; margin-right: 5%; margin-top: 5%; margin-bottom: 5%; text-align: justify; font-size: medium; }
+code { font-family: monospace; }
+h1 { text-align: center; }
+h2 { text-align: center; }
+h3 { text-align: center; }
+h4 { text-align: center; }
+h5 { text-align: center; }
+h6 { text-align: center; }
+h1.title { }
+h2.author { }
+h3.date { }
+/* For source-code highlighting */
+table.sourceCode, tr.sourceCode, td.lineNumbers, td.sourceCode, table.sourceCode pre
+ { margin: 0; padding: 0; border: 0; vertical-align: baseline; border: none; }
+td.lineNumbers { border-right: 1px solid #AAAAAA; text-align: right; color: #AAAAAA; padding-right: 5px; padding-left: 5px; }
+td.sourceCode { padding-left: 5px; }
+pre.sourceCode { }
+code.sourceCode span.kw { color: #007020; font-weight: bold; }
+code.sourceCode span.dt { color: #902000; }
+code.sourceCode span.dv { color: #40a070; }
+code.sourceCode span.bn { color: #40a070; }
+code.sourceCode span.fl { color: #40a070; }
+code.sourceCode span.ch { color: #4070a0; }
+code.sourceCode span.st { color: #4070a0; }
+code.sourceCode span.co { color: #60a0b0; font-style: italic; }
+code.sourceCode span.ot { color: #007020; }
+code.sourceCode span.al { color: red; font-weight: bold; }
+code.sourceCode span.fu { color: #06287e; }
+code.sourceCode span.re { }
+code.sourceCode span.er { color: red; font-weight: bold; }
diff --git a/data/reference.docx b/data/reference.docx
new file mode 100644
index 000000000..c321408d1
--- /dev/null
+++ b/data/reference.docx
Binary files differ
diff --git a/data/reference.odt b/data/reference.odt
new file mode 100644
index 000000000..6307119d3
--- /dev/null
+++ b/data/reference.odt
Binary files differ
diff --git a/data/s5/default/blank.gif b/data/s5/default/blank.gif
new file mode 100644
index 000000000..75b945d25
--- /dev/null
+++ b/data/s5/default/blank.gif
Binary files differ
diff --git a/data/s5/default/bodybg.gif b/data/s5/default/bodybg.gif
new file mode 100644
index 000000000..5f448a16f
--- /dev/null
+++ b/data/s5/default/bodybg.gif
Binary files differ
diff --git a/data/s5/default/framing.css b/data/s5/default/framing.css
new file mode 100644
index 000000000..14d8509e9
--- /dev/null
+++ b/data/s5/default/framing.css
@@ -0,0 +1,23 @@
+/* The following styles size, place, and layer the slide components.
+ Edit these if you want to change the overall slide layout.
+ The commented lines can be uncommented (and modified, if necessary)
+ to help you with the rearrangement process. */
+
+/* target = 1024x768 */
+
+div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
+div#header {top: 0; height: 3em; z-index: 1;}
+div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
+.slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;}
+div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0;}
+#currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;}
+html>body #currentSlide {position: fixed;}
+
+/*
+div#header {background: #FCC;}
+div#footer {background: #CCF;}
+div#controls {background: #BBD;}
+div#currentSlide {background: #FFC;}
+*/
diff --git a/data/s5/default/iepngfix.htc b/data/s5/default/iepngfix.htc
new file mode 100644
index 000000000..bba2db756
--- /dev/null
+++ b/data/s5/default/iepngfix.htc
@@ -0,0 +1,42 @@
+<public:component>
+<public:attach event="onpropertychange" onevent="doFix()" />
+
+<script>
+
+// IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
+// Free usage permitted as long as this notice remains intact.
+
+// This must be a path to a blank image. That's all the configuration you need here.
+var blankImg = 'ui/default/blank.gif';
+
+var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
+
+function filt(s, m) {
+ if (filters[f]) {
+ filters[f].enabled = s ? true : false;
+ if (s) with (filters[f]) { src = s; sizingMethod = m }
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
+}
+
+function doFix() {
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
+ (event && !/(background|src)/.test(event.propertyName))) return;
+
+ if (tagName == 'IMG') {
+ if ((/\.png$/i).test(src)) {
+ filt(src, 'image'); // was 'scale'
+ src = blankImg;
+ } else if (src.indexOf(blankImg) < 0) filt();
+ } else if (style.backgroundImage) {
+ if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
+ var s = RegExp.$1;
+ style.backgroundImage = '';
+ filt(s, 'crop');
+ } else filt();
+ }
+}
+
+doFix();
+
+</script>
+</public:component> \ No newline at end of file
diff --git a/data/s5/default/opera.css b/data/s5/default/opera.css
new file mode 100644
index 000000000..9e9d2a3c5
--- /dev/null
+++ b/data/s5/default/opera.css
@@ -0,0 +1,7 @@
+/* DO NOT CHANGE THESE unless you really want to break Opera Show */
+.slide {
+ visibility: visible !important;
+ position: static !important;
+ page-break-before: always;
+}
+#slide0 {page-break-before: avoid;}
diff --git a/data/s5/default/outline.css b/data/s5/default/outline.css
new file mode 100644
index 000000000..62db519ed
--- /dev/null
+++ b/data/s5/default/outline.css
@@ -0,0 +1,15 @@
+/* don't change this unless you want the layout stuff to show up in the outline view! */
+
+.layout div, #footer *, #controlForm * {display: none;}
+#footer, #controls, #controlForm, #navLinks, #toggle {
+ display: block; visibility: visible; margin: 0; padding: 0;}
+#toggle {float: right; padding: 0.5em;}
+html>body #toggle {position: fixed; top: 0; right: 0;}
+
+/* making the outline look pretty-ish */
+
+#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
+#slide0 h1 {padding-top: 1.5em;}
+.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em;
+ border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
+#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
diff --git a/data/s5/default/pretty.css b/data/s5/default/pretty.css
new file mode 100644
index 000000000..a87b24375
--- /dev/null
+++ b/data/s5/default/pretty.css
@@ -0,0 +1,86 @@
+/* Following are the presentation styles -- edit away! */
+
+body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2em;}
+:link, :visited {text-decoration: none; color: #00C;}
+#controls :active {color: #88A !important;}
+#controls :focus {outline: 1px dotted #227;}
+h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
+ul, pre {margin: 0; line-height: 1em;}
+html, body {margin: 0; padding: 0;}
+
+blockquote, q {font-style: italic;}
+blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;}
+blockquote p {margin: 0;}
+blockquote i {font-style: normal;}
+blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;}
+blockquote b i {font-style: italic;}
+
+kbd {font-weight: bold; font-size: 1em;}
+sup {font-size: smaller; line-height: 1px;}
+
+.slide code {padding: 2px 0.25em; font-weight: bold; color: #533;}
+.slide code.bad, code del {color: red;}
+.slide code.old {color: silver;}
+.slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;}
+.slide pre code {display: block;}
+.slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;}
+.slide li {margin-top: 0.75em; margin-right: 0;}
+.slide ul ul {line-height: 1;}
+.slide ul ul li {margin: .2em; font-size: 85%; list-style: square;}
+.slide img.leader {display: block; margin: 0 auto;}
+
+div#header, div#footer {background: #005; color: #AAB;
+ font-family: Verdana, Helvetica, sans-serif;}
+div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat;
+ line-height: 1px;}
+div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
+#footer h1, #footer h2 {display: block; padding: 0 1em;}
+#footer h2 {font-style: italic;}
+
+div.long {font-size: 0.75em;}
+.slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1;
+ margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap;
+ font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize;
+ color: #DDE; background: #005;}
+.slide h3 {font-size: 130%;}
+h1 abbr {font-variant: small-caps;}
+
+div#controls {position: absolute; left: 50%; bottom: 0;
+ width: 50%;
+ text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;}
+html>body div#controls {position: fixed; padding: 0 0 1em 0;
+ top: auto;}
+div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
+ margin: 0; padding: 0;}
+#controls #navLinks a {padding: 0; margin: 0 0.5em;
+ background: #005; border: none; color: #779;
+ cursor: pointer;}
+#controls #navList {height: 1em;}
+#controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;}
+
+#currentSlide {text-align: center; font-size: 0.5em; color: #449;}
+
+#slide0 {padding-top: 3.5em; font-size: 90%;}
+#slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
+ font: bold 2em Helvetica, sans-serif; white-space: normal;
+ color: #000; background: transparent;}
+#slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;}
+#slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
+#slide0 h4 {margin-top: 0; font-size: 1em;}
+
+ul.urls {list-style: none; display: inline; margin: 0;}
+.urls li {display: inline; margin: 0;}
+.note {display: none;}
+.external {border-bottom: 1px dotted gray;}
+html>body .external {border-bottom: none;}
+.external:after {content: " \274F"; font-size: smaller; color: #77B;}
+
+.incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;}
+img.incremental {visibility: hidden;}
+.slide .current {color: #B02;}
+
+
+/* diagnostics
+
+li:after {content: " [" attr(class) "]"; color: #F88;}
+*/
diff --git a/data/s5/default/print.css b/data/s5/default/print.css
new file mode 100644
index 000000000..4a3554ddd
--- /dev/null
+++ b/data/s5/default/print.css
@@ -0,0 +1,24 @@
+/* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */
+.slide, ul {page-break-inside: avoid; visibility: visible !important;}
+h1 {page-break-after: avoid;}
+
+body {font-size: 12pt; background: white;}
+* {color: black;}
+
+#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;}
+#slide0 h3 {margin: 0; padding: 0;}
+#slide0 h4 {margin: 0 0 0.5em; padding: 0;}
+#slide0 {margin-bottom: 3em;}
+
+h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;}
+.extra {background: transparent !important;}
+div.extra, pre.extra, .example {font-size: 10pt; color: #333;}
+ul.extra a {font-weight: bold;}
+p.example {display: none;}
+
+#header {display: none;}
+#footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;}
+#footer h2, #controls {display: none;}
+
+/* The following rule keeps the layout stuff out of print. Remove at your own risk! */
+.layout, .layout * {display: none !important;}
diff --git a/data/s5/default/s5-core.css b/data/s5/default/s5-core.css
new file mode 100644
index 000000000..86444e041
--- /dev/null
+++ b/data/s5/default/s5-core.css
@@ -0,0 +1,9 @@
+/* Do not edit or override these styles! The system will likely break if you do. */
+
+div#header, div#footer, div#controls, .slide {position: absolute;}
+html>body div#header, html>body div#footer,
+ html>body div#controls, html>body .slide {position: fixed;}
+.handout {display: none;}
+.layout {display: block;}
+.slide, .hideme, .incremental {visibility: hidden;}
+#slide0 {visibility: visible;}
diff --git a/data/s5/default/slides.css b/data/s5/default/slides.css
new file mode 100644
index 000000000..0786d7dbd
--- /dev/null
+++ b/data/s5/default/slides.css
@@ -0,0 +1,3 @@
+@import url(s5-core.css); /* required to make the slide show run at all */
+@import url(framing.css); /* sets basic placement and size of slide components */
+@import url(pretty.css); /* stuff that makes the slides look better than blah */ \ No newline at end of file
diff --git a/data/s5/default/slides.js b/data/s5/default/slides.js
new file mode 100644
index 000000000..38fe8531c
--- /dev/null
+++ b/data/s5/default/slides.js
@@ -0,0 +1,553 @@
+// S5 v1.1 slides.js -- released into the Public Domain
+//
+// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
+// about all the wonderful and talented contributors to this code!
+
+var undef;
+var slideCSS = '';
+var snum = 0;
+var smax = 1;
+var incpos = 0;
+var number = undef;
+var s5mode = true;
+var defaultView = 'slideshow';
+var controlVis = 'visible';
+
+var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
+var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
+var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
+
+function hasClass(object, className) {
+ if (!object.className) return false;
+ return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
+}
+
+function hasValue(object, value) {
+ if (!object) return false;
+ return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
+}
+
+function removeClass(object,className) {
+ if (!object) return;
+ object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
+}
+
+function addClass(object,className) {
+ if (!object || hasClass(object, className)) return;
+ if (object.className) {
+ object.className += ' '+className;
+ } else {
+ object.className = className;
+ }
+}
+
+function GetElementsWithClassName(elementName,className) {
+ var allElements = document.getElementsByTagName(elementName);
+ var elemColl = new Array();
+ for (var i = 0; i< allElements.length; i++) {
+ if (hasClass(allElements[i], className)) {
+ elemColl[elemColl.length] = allElements[i];
+ }
+ }
+ return elemColl;
+}
+
+function isParentOrSelf(element, id) {
+ if (element == null || element.nodeName=='BODY') return false;
+ else if (element.id == id) return true;
+ else return isParentOrSelf(element.parentNode, id);
+}
+
+function nodeValue(node) {
+ var result = "";
+ if (node.nodeType == 1) {
+ var children = node.childNodes;
+ for (var i = 0; i < children.length; ++i) {
+ result += nodeValue(children[i]);
+ }
+ }
+ else if (node.nodeType == 3) {
+ result = node.nodeValue;
+ }
+ return(result);
+}
+
+function slideLabel() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var list = document.getElementById('jumplist');
+ smax = slideColl.length;
+ for (var n = 0; n < smax; n++) {
+ var obj = slideColl[n];
+
+ var did = 'slide' + n.toString();
+ obj.setAttribute('id',did);
+ if (isOp) continue;
+
+ var otext = '';
+ var menu = obj.firstChild;
+ if (!menu) continue; // to cope with empty slides
+ while (menu && menu.nodeType == 3) {
+ menu = menu.nextSibling;
+ }
+ if (!menu) continue; // to cope with slides with only text nodes
+
+ var menunodes = menu.childNodes;
+ for (var o = 0; o < menunodes.length; o++) {
+ otext += nodeValue(menunodes[o]);
+ }
+ list.options[list.length] = new Option(n + ' : ' + otext, n);
+ }
+}
+
+function currentSlide() {
+ var cs;
+ if (document.getElementById) {
+ cs = document.getElementById('currentSlide');
+ } else {
+ cs = document.currentSlide;
+ }
+ cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
+ '<span id="csSep">\/<\/span> ' +
+ '<span id="csTotal">' + (smax-1) + '<\/span>';
+ if (snum == 0) {
+ cs.style.visibility = 'hidden';
+ } else {
+ cs.style.visibility = 'visible';
+ }
+}
+
+function go(step) {
+ if (document.getElementById('slideProj').disabled || step == 0) return;
+ var jl = document.getElementById('jumplist');
+ var cid = 'slide' + snum;
+ var ce = document.getElementById(cid);
+ if (incrementals[snum].length > 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ removeClass(incrementals[snum][i], 'current');
+ removeClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (step != 'j') {
+ snum += step;
+ lmax = smax - 1;
+ if (snum > lmax) snum = lmax;
+ if (snum < 0) snum = 0;
+ } else
+ snum = parseInt(jl.value);
+ var nid = 'slide' + snum;
+ var ne = document.getElementById(nid);
+ if (!ne) {
+ ne = document.getElementById('slide0');
+ snum = 0;
+ }
+ if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
+ if (incrementals[snum].length > 0 && incpos == 0) {
+ for (var i = 0; i < incrementals[snum].length; i++) {
+ if (hasClass(incrementals[snum][i], 'current'))
+ incpos = i + 1;
+ else
+ addClass(incrementals[snum][i], 'incremental');
+ }
+ }
+ if (incrementals[snum].length > 0 && incpos > 0)
+ addClass(incrementals[snum][incpos - 1], 'current');
+ ce.style.visibility = 'hidden';
+ ne.style.visibility = 'visible';
+ jl.selectedIndex = snum;
+ currentSlide();
+ number = 0;
+}
+
+function goTo(target) {
+ if (target >= smax || target == snum) return;
+ go(target - snum);
+}
+
+function subgo(step) {
+ if (step > 0) {
+ removeClass(incrementals[snum][incpos - 1],'current');
+ removeClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos],'current');
+ incpos++;
+ } else {
+ incpos--;
+ removeClass(incrementals[snum][incpos],'current');
+ addClass(incrementals[snum][incpos], 'incremental');
+ addClass(incrementals[snum][incpos - 1],'current');
+ }
+}
+
+function toggle() {
+ var slideColl = GetElementsWithClassName('*','slide');
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ if (!slides.disabled) {
+ slides.disabled = true;
+ outline.disabled = false;
+ s5mode = false;
+ fontSize('1em');
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'visible';
+ }
+ } else {
+ slides.disabled = false;
+ outline.disabled = true;
+ s5mode = true;
+ fontScale();
+ for (var n = 0; n < smax; n++) {
+ var slide = slideColl[n];
+ slide.style.visibility = 'hidden';
+ }
+ slideColl[snum].style.visibility = 'visible';
+ }
+}
+
+function showHide(action) {
+ var obj = GetElementsWithClassName('*','hideme')[0];
+ switch (action) {
+ case 's': obj.style.visibility = 'visible'; break;
+ case 'h': obj.style.visibility = 'hidden'; break;
+ case 'k':
+ if (obj.style.visibility != 'visible') {
+ obj.style.visibility = 'visible';
+ } else {
+ obj.style.visibility = 'hidden';
+ }
+ break;
+ }
+}
+
+// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
+function keys(key) {
+ if (!key) {
+ key = event;
+ key.which = key.keyCode;
+ }
+ if (key.which == 84) {
+ toggle();
+ return;
+ }
+ if (s5mode) {
+ switch (key.which) {
+ case 10: // return
+ case 13: // enter
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ if(number != undef) {
+ goTo(number);
+ break;
+ }
+ case 32: // spacebar
+ case 34: // page down
+ case 39: // rightkey
+ case 40: // downkey
+ if(number != undef) {
+ go(number);
+ } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ break;
+ case 33: // page up
+ case 37: // leftkey
+ case 38: // upkey
+ if(number != undef) {
+ go(-1 * number);
+ } else if (!incrementals[snum] || incpos <= 0) {
+ go(-1);
+ } else {
+ subgo(-1);
+ }
+ break;
+ case 36: // home
+ goTo(0);
+ break;
+ case 35: // end
+ goTo(smax-1);
+ break;
+ case 67: // c
+ showHide('k');
+ break;
+ }
+ if (key.which < 48 || key.which > 57) {
+ number = undef;
+ } else {
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
+ number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
+ }
+ }
+ return false;
+}
+
+function clicker(e) {
+ number = undef;
+ var target;
+ if (window.event) {
+ target = window.event.srcElement;
+ e = window.event;
+ } else target = e.target;
+ if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
+ if (!e.which || e.which == 1) {
+ if (!incrementals[snum] || incpos >= incrementals[snum].length) {
+ go(1);
+ } else {
+ subgo(1);
+ }
+ }
+}
+
+function findSlide(hash) {
+ var target = null;
+ var slides = GetElementsWithClassName('*','slide');
+ for (var i = 0; i < slides.length; i++) {
+ var targetSlide = slides[i];
+ if ( (targetSlide.name && targetSlide.name == hash)
+ || (targetSlide.id && targetSlide.id == hash) ) {
+ target = targetSlide;
+ break;
+ }
+ }
+ while(target != null && target.nodeName != 'BODY') {
+ if (hasClass(target, 'slide')) {
+ return parseInt(target.id.slice(5));
+ }
+ target = target.parentNode;
+ }
+ return null;
+}
+
+function slideJump() {
+ if (window.location.hash == null) return;
+ var sregex = /^#slide(\d+)$/;
+ var matches = sregex.exec(window.location.hash);
+ var dest = null;
+ if (matches != null) {
+ dest = parseInt(matches[1]);
+ } else {
+ dest = findSlide(window.location.hash.slice(1));
+ }
+ if (dest != null)
+ go(dest - snum);
+}
+
+function fixLinks() {
+ var thisUri = window.location.href;
+ thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
+ var aelements = document.getElementsByTagName('A');
+ for (var i = 0; i < aelements.length; i++) {
+ var a = aelements[i].href;
+ var slideID = a.match('\#slide[0-9]{1,2}');
+ if ((slideID) && (slideID[0].slice(0,1) == '#')) {
+ var dest = findSlide(slideID[0].slice(1));
+ if (dest != null) {
+ if (aelements[i].addEventListener) {
+ aelements[i].addEventListener("click", new Function("e",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "if (e.preventDefault) e.preventDefault();"), true);
+ } else if (aelements[i].attachEvent) {
+ aelements[i].attachEvent("onclick", new Function("",
+ "if (document.getElementById('slideProj').disabled) return;" +
+ "go("+dest+" - snum); " +
+ "event.returnValue = false;"));
+ }
+ }
+ }
+ }
+}
+
+function externalLinks() {
+ if (!document.getElementsByTagName) return;
+ var anchors = document.getElementsByTagName('a');
+ for (var i=0; i<anchors.length; i++) {
+ var anchor = anchors[i];
+ if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
+ anchor.target = '_blank';
+ addClass(anchor,'external');
+ }
+ }
+}
+
+function createControls() {
+ var controlsDiv = document.getElementById("controls");
+ if (!controlsDiv) return;
+ var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
+ var hideDiv, hideList = '';
+ if (controlVis == 'hidden') {
+ hideDiv = hider;
+ } else {
+ hideList = hider;
+ }
+ controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
+ '<div id="navLinks">' +
+ '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
+ '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
+ '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
+ '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
+ '<\/div><\/form>';
+ if (controlVis == 'hidden') {
+ var hidden = document.getElementById('navLinks');
+ } else {
+ var hidden = document.getElementById('jumplist');
+ }
+ addClass(hidden,'hideme');
+}
+
+function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
+ if (!s5mode) return false;
+ var vScale = 22; // both yield 32 (after rounding) at 1024x768
+ var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
+ if (window.innerHeight) {
+ var vSize = window.innerHeight;
+ var hSize = window.innerWidth;
+ } else if (document.documentElement.clientHeight) {
+ var vSize = document.documentElement.clientHeight;
+ var hSize = document.documentElement.clientWidth;
+ } else if (document.body.clientHeight) {
+ var vSize = document.body.clientHeight;
+ var hSize = document.body.clientWidth;
+ } else {
+ var vSize = 700; // assuming 1024x768, minus chrome and such
+ var hSize = 1024; // these do not account for kiosk mode or Opera Show
+ }
+ var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
+ fontSize(newSize + 'px');
+ if (isGe) { // hack to counter incremental reflow bugs
+ var obj = document.getElementsByTagName('body')[0];
+ obj.style.display = 'none';
+ obj.style.display = 'block';
+ }
+}
+
+function fontSize(value) {
+ if (!(s5ss = document.getElementById('s5ss'))) {
+ if (!isIE) {
+ document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
+ s5ss.setAttribute('media','screen, projection');
+ s5ss.setAttribute('id','s5ss');
+ } else {
+ document.createStyleSheet();
+ document.s5ss = document.styleSheets[document.styleSheets.length - 1];
+ }
+ }
+ if (!isIE) {
+ while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
+ s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
+ } else {
+ document.s5ss.addRule('body','font-size: ' + value + ' !important;');
+ }
+}
+
+function notOperaFix() {
+ slideCSS = document.getElementById('slideProj').href;
+ var slides = document.getElementById('slideProj');
+ var outline = document.getElementById('outlineStyle');
+ slides.setAttribute('media','screen');
+ outline.disabled = true;
+ if (isGe) {
+ slides.setAttribute('href','null'); // Gecko fix
+ slides.setAttribute('href',slideCSS); // Gecko fix
+ }
+ if (isIE && document.styleSheets && document.styleSheets[0]) {
+ document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
+ document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
+ }
+}
+
+function getIncrementals(obj) {
+ var incrementals = new Array();
+ if (!obj)
+ return incrementals;
+ var children = obj.childNodes;
+ for (var i = 0; i < children.length; i++) {
+ var child = children[i];
+ if (hasClass(child, 'incremental')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'incremental');
+ for (var j = 0; j < child.childNodes.length; j++) {
+ if (child.childNodes[j].nodeType == 1) {
+ addClass(child.childNodes[j], 'incremental');
+ }
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ removeClass(child,'incremental');
+ }
+ }
+ if (hasClass(child, 'show-first')) {
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
+ removeClass(child, 'show-first');
+ if (child.childNodes[isGe].nodeType == 1) {
+ removeClass(child.childNodes[isGe], 'incremental');
+ }
+ } else {
+ incrementals[incrementals.length] = child;
+ }
+ }
+ incrementals = incrementals.concat(getIncrementals(child));
+ }
+ return incrementals;
+}
+
+function createIncrementals() {
+ var incrementals = new Array();
+ for (var i = 0; i < smax; i++) {
+ incrementals[i] = getIncrementals(document.getElementById('slide'+i));
+ }
+ return incrementals;
+}
+
+function defaultCheck() {
+ var allMetas = document.getElementsByTagName('meta');
+ for (var i = 0; i< allMetas.length; i++) {
+ if (allMetas[i].name == 'defaultView') {
+ defaultView = allMetas[i].content;
+ }
+ if (allMetas[i].name == 'controlVis') {
+ controlVis = allMetas[i].content;
+ }
+ }
+}
+
+// Key trap fix, new function body for trap()
+function trap(e) {
+ if (!e) {
+ e = event;
+ e.which = e.keyCode;
+ }
+ try {
+ modifierKey = e.ctrlKey || e.altKey || e.metaKey;
+ }
+ catch(e) {
+ modifierKey = false;
+ }
+ return modifierKey || e.which == 0;
+}
+
+function startup() {
+ defaultCheck();
+ if (!isOp)
+ createControls();
+ slideLabel();
+ fixLinks();
+ externalLinks();
+ fontScale();
+ if (!isOp) {
+ notOperaFix();
+ incrementals = createIncrementals();
+ slideJump();
+ if (defaultView == 'outline') {
+ toggle();
+ }
+ document.onkeyup = keys;
+ document.onkeypress = trap;
+ document.onclick = clicker;
+ }
+}
+
+window.onload = startup;
+window.onresize = function(){setTimeout('fontScale()', 50);} \ No newline at end of file
diff --git a/data/slideous/slideous.css b/data/slideous/slideous.css
new file mode 100644
index 000000000..7d6057069
--- /dev/null
+++ b/data/slideous/slideous.css
@@ -0,0 +1,95 @@
+/* This work is licensed under Creative Commons GNU LGPL License.
+
+ License: http://creativecommons.org/licenses/LGPL/2.1/
+ Version: 1.0
+
+ Author: Stefan Goessner/2005
+ Web: http://goessner.net/
+*/
+@media screen, projection {
+body {
+ background-color: #e3eee7;
+ padding: 0;
+ margin: 0;
+ color: #132;
+ border-color: #678;
+ font-size: 125%;
+}
+#statusbar {
+ display: none;
+ position: absolute; z-index: 10;
+ top: auto; bottom: 0; left: 0; right: 0;
+ height: 2em;
+ background-color: #f0fff8;
+ color: #132;
+ font-size: 75%;
+ padding: 0.5em 0.5em 0 2px;
+ border-top: solid 1px #000;
+}
+#statusbar button, #tocbox {
+ cursor: pointer;
+ color: #031;
+ background-color: #e0eee7;
+ margin: 1px;
+ padding: 0 0.5em;
+ border: inset 1px black;
+}
+#statusbar button:hover, #tocbox:hover {
+ color: #031;
+ background-color: #c0ccc6;
+ border: outset 1px black;
+}
+#tocbox {
+ width: 15em;
+}
+#eos {
+ visibility: hidden;
+ color: #021;
+ background-color: #fffafa;
+ border: inset 1px black;
+ font-size: 120%;
+}
+div.slide {
+ display: block;
+ margin: 0 0 2em 0;
+ padding: 0 150px;
+}
+
+div.slide h1 {
+ background: #a0aaa4;
+ color: #f0fff8;
+ padding: 0 0.5em 0 0.5em;
+ margin: 0 -150px;
+ font-size: 120%;
+ border-bottom: solid 1px black;
+}
+
+div.slide h1:before { content: "# "; }
+div.handout { display: block; }
+
+body>#statusbar { /* ie6 hack for fixing the statusbar - in quirks mode */
+ position: fixed; /* thanks to Anne van Kesteren and Arthur Steiner */
+} /* see http://limpid.nl/lab/css/fixed/footer */
+* html body {
+ overflow: hidden;
+}
+* html div.slide {
+ height: 100%;
+ padding-bottom: 2em;
+ overflow: auto;
+} /* end ie6-hack */
+
+} /* @media screen, projection */
+
+@media print {
+body {
+ color: black;
+ font-family: sans-serif;
+ font-size: 11pt;
+}
+
+#statusbar { display: none; }
+div.slide { page-break-after: always; }
+div.handout { display: block; }
+
+} /* @media print */
diff --git a/data/slideous/slideous.js b/data/slideous/slideous.js
new file mode 100644
index 000000000..3e7a63d4a
--- /dev/null
+++ b/data/slideous/slideous.js
@@ -0,0 +1,321 @@
+/* This work is licensed under Creative Commons GNU LGPL License.
+
+ License: http://creativecommons.org/licenses/LGPL/2.1/
+
+ Author: Stefan Goessner/2005-2006
+ Web: http://goessner.net/
+*/
+var Slideous = {
+ version: 1.0,
+ // == user customisable ===
+ clickables: { a: true, button: true, img: true, input: true, object: true, textarea: true, select: true, option: true },
+ incrementables: { blockquote: { filter: "self, parent" },
+ dd: { filter: "self, parent" },
+ dt: { filter: "self, parent" },
+ h2: { filter: "self, parent" },
+ h3: { filter: "self, parent" },
+ h4: { filter: "self, parent" },
+ h5: { filter: "self, parent" },
+ h6: { filter: "self, parent" },
+ li: { filter: "self, parent" },
+ p: { filter: "self" },
+ pre: { filter: "self" },
+ img: { filter: "self, parent" },
+ object: { filter: "self, parent" },
+ table: { filter: "self, parent" },
+ td: { filter: "self, parent" },
+ th: { filter: "self, parent" },
+ tr: { filter: "parent, grandparent" }
+ },
+ autoincrementables: { ol: true, ul: true, dl: true },
+ autoincrement: false,
+ statusbar: true,
+ navbuttons: { incfontbutton: function(){Slideous.changefontsize(+Slideous.fontdelta);},
+ decfontbutton: function(){Slideous.changefontsize(-Slideous.fontdelta);},
+ contentbutton: function(){Slideous.gotoslide(Slideous.tocidx(), true, true);},
+ homebutton: function(){Slideous.gotoslide(1, true, true);},
+ prevslidebutton: function(){Slideous.previous(false);},
+ previtembutton: function(){Slideous.previous(true);},
+ nextitembutton: function(){Slideous.next(true);},
+ nextslidebutton: function(){Slideous.next(false);},
+ endbutton: function(){Slideous.gotoslide(Slideous.count,true,true);} },
+ fontsize: 125, // in percent, corresponding to body.font-size in css file
+ fontdelta: 5, // increase/decrease fontsize by this value
+ mousesensitive: true,
+ tocidx: 0,
+ tocitems: { toc: "<li><a href=\"#s{\$slideidx}\">{\$slidetitle}</a></li>",
+ tocbox: "<option value=\"#s{\$slideidx}\" title=\"{\$slidetitle}\">{\$slidetitle}</option>" },
+ keydown: function(evt) {
+ evt = evt || window.event;
+ var key = evt.keyCode || evt.which;
+ if (key && !evt.ctrlKey && !evt.altKey) {
+ switch (key) {
+ case 33: // page up ... previous slide
+ Slideous.previous(false); evt.cancel = !Slideous.showall; break;
+ case 37: // left arrow ... previous item
+ Slideous.previous(true); evt.cancel = !Slideous.showall; break;
+ case 32: // space bar
+ case 39: // right arrow
+ Slideous.next(true); evt.cancel = !Slideous.showall; break;
+ case 13: // carriage return ... next slide
+ case 34: // page down
+ Slideous.next(false); evt.cancel = !Slideous.showall; break;
+ case 35: // end ... last slide (not recognised by opera)
+ Slideous.gotoslide(Slideous.count, true, true); evt.cancel = !Slideous.showall; break;
+ case 36: // home ... first slide (not recognised by opera)
+ Slideous.gotoslide(1, true, true); evt.cancel = !Slideous.showall; break;
+ case 65: // A ... show All
+ case 80: // P ... Print mode
+ Slideous.toggleshowall(!Slideous.showall); evt.cancel = true; break;
+ case 67: // C ... goto contents
+ Slideous.gotoslide(Slideous.tocidx, true, true); evt.cancel = true; break;
+ case 77: // M ... toggle mouse sensitivity
+ Slideous.mousenavigation(Slideous.mousesensitive = !Slideous.mousesensitive); evt.cancel = true; break;
+ case 83: // S ... toggle statusbar
+ Slideous.togglestatusbar(); evt.cancel = true; break;
+ case 61: // + ... increase fontsize
+ case 107:
+ Slideous.changefontsize(+Slideous.fontdelta); evt.cancel = true; break;
+ case 109: // - ... decrease fontsize
+ Slideous.changefontsize(-Slideous.fontdelta); evt.cancel = true; break;
+ default: break;
+ }
+ if (evt.cancel) evt.returnValue = false;
+ }
+ return !evt.cancel;
+ },
+
+ // == program logic ===
+ count: 0, // # of slides ..
+ curidx: 0, // current slide index ..
+ mousedownpos: null, // last mouse down position ..
+ contentselected: false, // indicates content selection ..
+ showall: true,
+ init: function() {
+ Slideous.curidx = 1;
+ Slideous.importproperties();
+ Slideous.registerslides();
+ document.body.innerHTML = Slideous.injectproperties(document.body.innerHTML);
+ Slideous.buildtocs();
+ Slideous.registeranchors();
+ Slideous.toggleshowall(false);
+ Slideous.updatestatus();
+ document.body.style.fontSize = Slideous.fontsize+"%";
+ document.getElementById("s1").style.display = "block";
+ document.onkeydown = Slideous.keydown;
+ Slideous.mousenavigation(Slideous.mousesensitive);
+ Slideous.registerbuttons();
+ if (window.location.hash)
+ Slideous.gotoslide(window.location.hash.substr(2), true, true);
+ },
+ registerslides: function() {
+ var div = document.getElementsByTagName("div");
+ Slideous.count = 0;
+ for (var i in div)
+ if (Slideous.hasclass(div[i], "slide"))
+ div[i].setAttribute("id", "s"+(++Slideous.count));
+ },
+ registeranchors: function() {
+ var a = document.getElementsByTagName("a"),
+ loc = (window.location.hostname+window.location.pathname).replace(/\\/g, "/");
+ for (var i in a) {
+ if (a[i].href && a[i].href.indexOf(loc) >= 0 && a[i].href.lastIndexOf("#") >= 0) {
+ a[i].href = "javascript:Slideous.gotoslide(" + a[i].href.substr(a[i].href.lastIndexOf("#")+2)+",true,true)";
+ }
+ }
+ },
+ registerbuttons: function() {
+ var button;
+ for (var b in Slideous.navbuttons)
+ if (button = document.getElementById(b))
+ button.onclick = Slideous.navbuttons[b];
+ },
+ importproperties: function() { // from html meta section ..
+ var meta = document.getElementsByTagName("meta"), elem;
+ for (var i in meta)
+ if (meta[i].attributes && meta[i].attributes["name"] && meta[i].attributes["name"].value in Slideous)
+ switch (typeof(Slideous[meta[i].attributes["name"].value])) {
+ case "number": Slideous[meta[i].attributes["name"].value] = parseInt(meta[i].attributes["content"].value); break;
+ case "boolean": Slideous[meta[i].attributes["name"].value] = meta[i].attributes["content"].value == "true" ? true : false; break;
+ default: Slideous[meta[i].attributes["name"].value] = meta[i].attributes["content"].value; break;
+ }
+ },
+ injectproperties: function(str) {
+ var meta = document.getElementsByTagName("meta"), elem;
+ for (var i in meta) {
+ if (meta[i].attributes && meta[i].attributes["name"])
+ str = str.replace(new RegExp("{\\$"+meta[i].attributes["name"].value+"}","g"), meta[i].attributes["content"].value);
+ }
+ return str = str.replace(/{\$generator}/g, "Slideous")
+ .replace(/{\$version}/g, Slideous.version)
+ .replace(/{\$title}/g, document.title)
+ .replace(/{\$slidecount}/g, Slideous.count);
+ },
+ buildtocs: function() {
+ var toc = document.getElementById("toc"), list = "",
+ tocbox = document.getElementById("tocbox");
+ if (toc) {
+ for (var i=0; i<Slideous.count; i++)
+ list += Slideous.tocitems.toc.replace(/{\$slideidx}/g, i+1).replace(/{\$slidetitle}/, document.getElementById("s"+(i+1)).getElementsByTagName("h1")[0].innerHTML);
+ toc.innerHTML = list;
+ while (toc && !Slideous.hasclass(toc, "slide")) toc = toc.parentNode;
+ if (toc) Slideous.tocidx = toc.getAttribute("id").substr(1);
+ }
+ if (tocbox) {
+ tocbox.innerHTML = "";
+ for (var i=0; i<Slideous.count; i++)
+ tocbox.options[tocbox.length] = new Option((i+1)+". "+document.getElementById("s"+(i+1)).getElementsByTagName("h1")[0].innerHTML, "#s"+(i+1));
+ tocbox.onchange = function() { Slideous.gotoslide(this.selectedIndex+1, true, true); };
+ }
+ },
+ next: function(deep) {
+ if (!Slideous.showall) {
+ var slide = document.getElementById("s"+Slideous.curidx),
+ item = Slideous.firstitem(slide, Slideous.isitemhidden);
+ if (deep) { // next item
+ if (item)
+ Slideous.displayitem(item, true);
+ else
+ Slideous.gotoslide(Slideous.curidx+1, false, false);
+ }
+ else if (item) // complete slide ..
+ while (item = Slideous.firstitem(slide, Slideous.isitemhidden))
+ Slideous.displayitem(item, true);
+ else // next slide
+ Slideous.gotoslide(Slideous.curidx+1, true, false);
+ Slideous.updatestatus();
+ }
+ },
+ previous: function(deep) {
+ if (!Slideous.showall) {
+ var slide = document.getElementById("s"+Slideous.curidx);
+ if (deep) {
+ var item = Slideous.lastitem(slide, Slideous.isitemvisible);
+ if (item)
+ Slideous.displayitem(item, false);
+ else
+ Slideous.gotoslide(Slideous.curidx-1, true, false);
+ }
+ else
+ Slideous.gotoslide(Slideous.curidx-1, true, false);
+ Slideous.updatestatus();
+ }
+ },
+ gotoslide: function(i, showitems, updatestatus) {
+ if (!Slideous.showall && i > 0 && i <= Slideous.count && i != Slideous.curidx) {
+ document.getElementById("s"+Slideous.curidx).style.display = "none";
+ var slide = document.getElementById("s"+(Slideous.curidx=i)), item;
+ while (item = Slideous.firstitem(slide, showitems ? Slideous.isitemhidden : Slideous.isitemvisible))
+ Slideous.displayitem(item, showitems);
+ slide.style.display = "block";
+ if (updatestatus)
+ Slideous.updatestatus();
+ }
+ },
+ firstitem: function(root, filter) {
+ var found = filter(root);
+ for (var node=root.firstChild; node!=null && !found; node = node.nextSibling)
+ found = Slideous.firstitem(node, filter);
+ return found;
+ },
+ lastitem: function(root, filter) {
+ var found = null;
+ for (var node=root.lastChild; node!=null && !found; node = node.previousSibling)
+ found = Slideous.lastitem(node, filter);
+ return found || filter(root);
+ },
+ isitem: function(node, visible) {
+ var nodename;
+ return node && node.nodeType == 1 // elements only ..
+ && (nodename=node.nodeName.toLowerCase()) in Slideous.incrementables
+ && ( Slideous.incrementables[nodename].filter.match("\\bself\\b") && (Slideous.hasclass(node, "incremental") || (Slideous.autoincrement && nodename in Slideous.autoincrementables))
+ || Slideous.incrementables[nodename].filter.match("\\bparent\\b") && (Slideous.hasclass(node.parentNode, "incremental") || (Slideous.autoincrement && node.parentNode.nodeName.toLowerCase() in Slideous.autoincrementables))
+ || Slideous.incrementables[nodename].filter.match("\\bgrandparent\\b") && (Slideous.hasclass(node.parentNode.parentNode, "incremental") || (Slideous.autoincrement && node.parentNode.parentNode.nodeName.toLowerCase() in Slideous.autoincrementables))
+ )
+ && (visible ? (node.style.visibility != "hidden")
+ : (node.style.visibility == "hidden"))
+ ? node : null;
+ },
+ isitemvisible: function(node) { return Slideous.isitem(node, true); },
+ isitemhidden: function(node) { return Slideous.isitem(node, false); },
+ displayitem: function(item, show) {
+ if (item) item.style.visibility = (show ? "visible" : "hidden");
+ },
+ updatestatus: function() {
+ if (Slideous.statusbar) {
+ var eos = document.getElementById("eos"),
+ idx = document.getElementById("slideidx"),
+ tocbox = document.getElementById("tocbox");
+ if (eos)
+ eos.style.visibility = Slideous.firstitem(document.getElementById("s"+Slideous.curidx), Slideous.isitemhidden) != null
+ ? "visible" : "hidden";
+ if (idx)
+ idx.innerHTML = Slideous.curidx;
+ if (tocbox)
+ tocbox.selectedIndex = Slideous.curidx-1;
+ }
+ },
+ changefontsize: function(delta) {
+ document.body.style.fontSize = (Slideous.fontsize+=delta)+"%";
+ },
+ togglestatusbar: function() {
+ document.getElementById("statusbar").style.display = (Slideous.statusbar = !Slideous.statusbar) ? "block" : "none";
+ },
+ toggleshowall: function(showall) {
+ var slide, item;
+ for (var i=0; i<Slideous.count; i++) {
+ slide = document.getElementById("s"+(i+1));
+ slide.style.display = showall ? "block" : "none";
+ while (item = Slideous.firstitem(slide, showall ? Slideous.isitemhidden : Slideous.isitemvisible))
+ Slideous.displayitem(item, showall);
+ var divs = slide.getElementsByTagName("div");
+ for (var j in divs)
+ if (Slideous.hasclass(divs[j], "handout"))
+ divs[j].style.display = showall ? "block" : "none";
+ }
+ if (!showall)
+ document.getElementById("s"+Slideous.curidx).style.display = "block";
+ if (Slideous.statusbar)
+ document.getElementById("statusbar").style.display = showall ? "none" : "block";
+ Slideous.showall = showall;
+ },
+ hasclass: function(elem, classname) {
+ var classattr = null;
+ return (classattr=(elem.attributes && elem.attributes["class"]))
+ && classattr.nodeValue.match("\\b"+classname+"\\b");
+ },
+ selectedcontent: function() {
+ return window.getSelection ? window.getSelection().toString()
+ : document.getSelection ? document.getSelection()
+ : document.selection ? document.selection.createRange().text
+ : "";
+ },
+ mousenavigation: function(on) {
+ if (on) {
+ document.onmousedown = Slideous.mousedown;
+ document.onmouseup = Slideous.mouseup;
+ }
+ else
+ document.onmousedown = document.onmouseup = null;
+ },
+ mousepos: function(e) {
+ return e.pageX ? {x: e.pageX, y: e.pageY}
+ : {x: e.x+document.body.scrollLeft, y: e.y+document.body.scrollTop};
+ },
+ mousedown: function(evt) {
+ evt = evt||window.event;
+ Slideous.mousedownpos = Slideous.mousepos(evt);
+ Slideous.contentselected = !!Slideous.selectedcontent() || ((evt.target || evt.srcElement).nodeName.toLowerCase() in Slideous.clickables);
+ return true;
+ },
+ mouseup: function(evt) {
+ evt = evt||window.event;
+ var pos = Slideous.mousepos(evt);
+ if (pos.x == Slideous.mousedownpos.x && pos.y == Slideous.mousedownpos.y && !Slideous.contentselected) {
+ Slideous.next(true);
+ return evt.returnValue = !(evt.cancel = true);
+ }
+ return false;
+ }
+};
+window.onload = Slideous.init;
diff --git a/data/slidy/graphics/fold-dim.gif b/data/slidy/graphics/fold-dim.gif
new file mode 100644
index 000000000..346fcbf3e
--- /dev/null
+++ b/data/slidy/graphics/fold-dim.gif
Binary files differ
diff --git a/data/slidy/graphics/fold.gif b/data/slidy/graphics/fold.gif
new file mode 100644
index 000000000..133e594fd
--- /dev/null
+++ b/data/slidy/graphics/fold.gif
Binary files differ
diff --git a/data/slidy/graphics/nofold-dim.gif b/data/slidy/graphics/nofold-dim.gif
new file mode 100644
index 000000000..996fb5eda
--- /dev/null
+++ b/data/slidy/graphics/nofold-dim.gif
Binary files differ
diff --git a/data/slidy/graphics/unfold-dim.gif b/data/slidy/graphics/unfold-dim.gif
new file mode 100644
index 000000000..bee567117
--- /dev/null
+++ b/data/slidy/graphics/unfold-dim.gif
Binary files differ
diff --git a/data/slidy/graphics/unfold.gif b/data/slidy/graphics/unfold.gif
new file mode 100644
index 000000000..0753ae4d2
--- /dev/null
+++ b/data/slidy/graphics/unfold.gif
Binary files differ
diff --git a/data/slidy/scripts/slidy.js.gz b/data/slidy/scripts/slidy.js.gz
new file mode 100644
index 000000000..72bbd63d0
--- /dev/null
+++ b/data/slidy/scripts/slidy.js.gz
Binary files differ
diff --git a/data/slidy/styles/slidy.css b/data/slidy/styles/slidy.css
new file mode 100644
index 000000000..0197e64d0
--- /dev/null
+++ b/data/slidy/styles/slidy.css
@@ -0,0 +1,405 @@
+/* slidy.css
+
+ Copyright (c) 2005-2010 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: "Gill Sans MT", "Gill Sans", GillSans, 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-color: rgb(240,240,240);
+ border-top: solid 1px rgb(180,180,180);
+}
+
+div.toolbar span.copyright {
+ color: black;
+ margin-left: 0.5em;
+}
+
+div.initial_prompt {
+ position: absolute;
+ z-index: 1000;
+ bottom: 1.2em;
+ width: 100%;
+ background-color: rgb(200,200,200);
+ opacity: 0.35;
+ background-color: rgb(200,200,200, 0.35);
+ cursor: pointer;
+}
+
+div.initial_prompt p.help {
+ text-align: center;
+}
+
+div.initial_prompt p.close {
+ text-align: right;
+ font-style: italic;
+}
+
+div.slidy_toc {
+ position: absolute;
+ z-index: 300;
+ width: 60%;
+ max-width: 30em;
+ height: 30em;
+ overflow: auto;
+ top: auto;
+ right: auto;
+ left: 4em;
+ bottom: 4em;
+ padding: 1em;
+ background: rgb(240,240,240);
+ border-style: solid;
+ border-width: 2px;
+ font-size: 60%;
+}
+
+div.slidy_toc .toc_heading {
+ text-align: center;
+ width: 100%;
+ margin: 0;
+ margin-bottom: 1em;
+ border-bottom-style: solid;
+ border-bottom-color: rgb(180,180,180);
+ border-bottom-width: 1px;
+}
+
+div.slide {
+ z-index: 20;
+ margin: 0 0 0 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ padding-left: 20px;
+ padding-right: 20px;
+ border-width: 0;
+ clear: both;
+ top: 0;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ line-height: 120%;
+ background-color: transparent;
+}
+
+div.background {
+ display: none;
+}
+
+div.handout {
+ margin-left: 20px;
+ margin-right: 20px;
+}
+
+div.slide.titlepage {
+ text-align: center;
+}
+
+div.slide.titlepage h1 {
+ padding-top: 10%;
+ margin-right: 0;
+}
+
+div.slide h1 {
+ padding-left: 0;
+ padding-right: 20pt;
+ padding-top: 4pt;
+ padding-bottom: 4pt;
+ margin-top: 0;
+ margin-left: 0;
+ margin-right: 60pt;
+ margin-bottom: 0.5em;
+ display: block;
+ font-size: 160%;
+ line-height: 1.2em;
+ background: transparent;
+}
+
+div.toc {
+ position: absolute;
+ top: auto;
+ bottom: 4em;
+ left: 4em;
+ right: auto;
+ width: 60%;
+ max-width: 30em;
+ height: 30em;
+ border: solid thin black;
+ padding: 1em;
+ background: rgb(240,240,240);
+ color: black;
+ z-index: 300;
+ overflow: auto;
+ display: block;
+ visibility: visible;
+}
+
+div.toc-heading {
+ width: 100%;
+ border-bottom: solid 1px rgb(180,180,180);
+ margin-bottom: 1em;
+ text-align: center;
+}
+
+img {
+ image-rendering: optimize-quality;
+}
+
+pre {
+ font-size: 80%;
+ font-weight: bold;
+ line-height: 120%;
+ padding-top: 0.2em;
+ padding-bottom: 0.2em;
+ padding-left: 1em;
+ padding-right: 1em;
+ border-style: solid;
+ border-left-width: 1em;
+ border-top-width: thin;
+ border-right-width: thin;
+ border-bottom-width: thin;
+ border-color: #95ABD0;
+ color: #00428C;
+ background-color: #E4E5E7;
+}
+
+li pre { margin-left: 0; }
+
+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: navy }
+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: italic }
+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;
+}
+
+
+p,pre,ul,ol,blockquote,h2,h3,h4,h5,h6,dl,table {
+ margin-left: 1em;
+ margin-right: 1em;
+}
+
+p.subhead { font-weight: bold; margin-top: 2em; }
+
+.smaller { font-size: smaller }
+.bigger { font-size: 130% }
+
+td,th { padding: 0.2em }
+
+ul {
+ margin: 0.5em 1.5em 0.5em 1.5em;
+ padding: 0;
+}
+
+ol {
+ margin: 0.5em 1.5em 0.5em 1.5em;
+ padding: 0;
+}
+
+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; }
+
+ul li {
+ list-style: square;
+ margin: 0.1em 0em 0.6em 0;
+ padding: 0 0 0 0;
+ line-height: 140%;
+}
+
+ol li {
+ margin: 0.1em 0em 0.6em 1.5em;
+ padding: 0 0 0 0px;
+ line-height: 140%;
+ list-style-type: decimal;
+}
+
+li ul li {
+ font-size: 85%;
+ font-style: italic;
+ list-style-type: disc;
+ background: transparent;
+ padding: 0 0 0 0;
+}
+li li ul li {
+ font-size: 85%;
+ font-style: normal;
+ list-style-type: circle;
+ background: transparent;
+ padding: 0 0 0 0;
+}
+li li li ul li {
+ list-style-type: disc;
+ background: transparent;
+ padding: 0 0 0 0;
+}
+
+li ol li {
+ list-style-type: decimal;
+}
+
+
+li li ol li {
+ list-style-type: decimal;
+}
+
+/*
+ setting class="outline on ol or ul makes it behave as an
+ ouline list where blocklevel content in li elements is
+ hidden by default and can be expanded or collapsed with
+ mouse click. Set class="expand" on li to override default
+*/
+
+ol.outline li:hover { cursor: pointer }
+ol.outline li.nofold:hover { cursor: default }
+
+ul.outline li:hover { cursor: pointer }
+ul.outline li.nofold:hover { cursor: default }
+
+ol.outline { list-style:decimal; }
+ol.outline ol { list-style-type:lower-alpha }
+
+ol.outline li.nofold {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.unfolded {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.folded {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.unfolded:hover {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;
+}
+ol.outline li.folded:hover {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;
+}
+
+ul.outline li.nofold {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/nofold-dim.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.unfolded {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.folded {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.unfolded:hover {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/fold.gif) no-repeat 0px 0.5em;
+}
+ul.outline li.folded:hover {
+ padding: 0 0 0 20px;
+ background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.5em;
+}
+
+/* for slides with class "title" in table of contents */
+a.titleslide { font-weight: bold; font-style: italic }
+
+/*
+ hide images for work around for save as bug
+ where browsers fail to save images used by CSS
+*/
+img.hidden { display: none; visibility: hidden }
+div.initial_prompt { display: none; visibility: hidden }
+
+ div.slide {
+ visibility: visible;
+ position: inherit;
+ }
+ div.handout {
+ border-top-style: solid;
+ border-top-width: thin;
+ border-top-color: black;
+ }
+
+@media screen {
+ .hidden { display: none; visibility: visible }
+
+ div.slide.hidden { display: block; visibility: visible }
+ div.handout.hidden { display: block; visibility: visible }
+ div.background { display: none; visibility: hidden }
+ body.single_slide div.initial_prompt { display: block; visibility: visible }
+ body.single_slide div.background { display: block; visibility: visible }
+ body.single_slide div.background.hidden { display: none; visibility: hidden }
+ body.single_slide .invisible { visibility: hidden }
+ body.single_slide .hidden { display: none; visibility: hidden }
+ body.single_slide div.slide { position: absolute }
+ body.single_slide div.handout { display: none; visibility: hidden }
+}
+
+@media print {
+ .hidden { display: block; visibility: visible }
+
+ div.slide pre { font-size: 60%; padding-left: 0.5em; }
+ div.toolbar { display: none; visibility: hidden; }
+ div.slidy_toc { display: none; visibility: hidden; }
+ div.background { display: none; visibility: hidden; }
+ div.slide { page-break-before: always }
+ /* :first-child isn't reliable for print media */
+ div.slide.first-slide { page-break-before: avoid }
+}
+
diff --git a/data/templates b/data/templates
new file mode 160000
+Subproject 4c1f840c392010309cdb4cc1b8db4f4b24ff642