From ca23e30b89d3e0ec2a72f060dae23bf3e858743d Mon Sep 17 00:00:00 2001 From: Monty Taylor Date: Wed, 16 May 2012 21:15:39 -0400 Subject: [PATCH] Added slides for jenkins conference. --- ci-roadmap-folsom/index.html | 11 + jenkins/Overview.html | 910 +++++ jenkins/Overview.xhtml | 910 +++++ jenkins/blank.html | 30 + jenkins/graphics/bullet-fold-dim.gif | Bin 0 -> 161 bytes jenkins/graphics/bullet-fold-dim.png | Bin 0 -> 2905 bytes jenkins/graphics/bullet-fold.gif | Bin 0 -> 163 bytes jenkins/graphics/bullet-fold.png | Bin 0 -> 2901 bytes jenkins/graphics/bullet-nofold-dim.gif | Bin 0 -> 142 bytes jenkins/graphics/bullet-nofold-dim.png | Bin 0 -> 2892 bytes jenkins/graphics/bullet-nofold.gif | Bin 0 -> 157 bytes jenkins/graphics/bullet-nofold.png | Bin 0 -> 2888 bytes jenkins/graphics/bullet-unfold-dim.gif | Bin 0 -> 166 bytes jenkins/graphics/bullet-unfold-dim.png | Bin 0 -> 2913 bytes jenkins/graphics/bullet-unfold.gif | Bin 0 -> 163 bytes jenkins/graphics/bullet-unfold.png | Bin 0 -> 2909 bytes jenkins/graphics/bullet.png | Bin 0 -> 167 bytes jenkins/graphics/example.png | Bin 0 -> 6652 bytes jenkins/graphics/example.svg | 223 ++ jenkins/graphics/face1.gif | Bin 0 -> 5279 bytes jenkins/graphics/face2.gif | Bin 0 -> 2378 bytes jenkins/graphics/face3.gif | Bin 0 -> 800 bytes jenkins/graphics/face4.gif | Bin 0 -> 846 bytes jenkins/graphics/fold-bright.gif | Bin 0 -> 145 bytes jenkins/graphics/fold-dim.bmp | Bin 0 -> 306 bytes jenkins/graphics/fold-dim.gif | Bin 0 -> 56 bytes jenkins/graphics/fold.bmp | Bin 0 -> 306 bytes jenkins/graphics/fold.gif | Bin 0 -> 56 bytes jenkins/graphics/icon-blue.png | Bin 0 -> 204 bytes jenkins/graphics/keys2.jpg | Bin 0 -> 42807 bytes jenkins/graphics/nofold-dim.bmp | Bin 0 -> 306 bytes jenkins/graphics/nofold-dim.gif | Bin 0 -> 48 bytes jenkins/graphics/nofold.bmp | Bin 0 -> 306 bytes .../open-stack-cloud-computing-logo-2.png | Bin 0 -> 3670 bytes ...penstack-cloud-software-vertical-large.png | Bin 0 -> 23062 bytes jenkins/graphics/unfold-bright.gif | Bin 0 -> 170 bytes jenkins/graphics/unfold-dim.bmp | Bin 0 -> 306 bytes jenkins/graphics/unfold-dim.gif | Bin 0 -> 59 bytes jenkins/graphics/unfold.bmp | Bin 0 -> 306 bytes jenkins/graphics/unfold.gif | Bin 0 -> 59 bytes jenkins/graphics/w3c-logo-blue.gif | Bin 0 -> 1791 bytes jenkins/graphics/w3c-logo-blue.svg | 14 + jenkins/graphics/w3c-logo-slanted.jpg | Bin 0 -> 26539 bytes jenkins/graphics/w3c-logo-white.gif | Bin 0 -> 793 bytes jenkins/graphics/w3c-logo-white.svg | 14 + jenkins/help/.htaccess | 28 + jenkins/help/help.html | 80 + jenkins/help/help.html.ca | 52 + jenkins/help/help.html.de | 96 + jenkins/help/help.html.en | 81 + jenkins/help/help.html.es | 52 + jenkins/help/help.html.fr | 118 + jenkins/help/help.html.hu | 98 + jenkins/help/help.html.nl | 82 + jenkins/help/help.html.pl | 76 + jenkins/help/help.html.pt-br | 95 + jenkins/help/help.html.pt_br | 95 + jenkins/help/help.html.sv | 75 + jenkins/help/help.pt-br.html | 95 + jenkins/images/489px-MySQL.svg.png | Bin 0 -> 19887 bytes jenkins/images/Drizzle-med.png | Bin 0 -> 26999 bytes jenkins/images/OpenStackLogo_wTag.png | Bin 0 -> 7441 bytes jenkins/images/gerrit-approved.png | Bin 0 -> 96136 bytes jenkins/images/gerrit-bp-topic.png | Bin 0 -> 39005 bytes jenkins/images/gerrit-bp.png | Bin 0 -> 120018 bytes jenkins/images/gerrit-bug.png | Bin 0 -> 126488 bytes jenkins/images/gerrit-jenkins.png | Bin 0 -> 88594 bytes jenkins/images/gerrit-sso.png | Bin 0 -> 36252 bytes jenkins/images/gerrit-verify.png | Bin 0 -> 100693 bytes jenkins/images/jenkins-gate.png | Bin 0 -> 151508 bytes jenkins/images/lp-bp.png | Bin 0 -> 62686 bytes jenkins/images/lp-bug.png | Bin 0 -> 127493 bytes jenkins/images/lp-os-projects.png | Bin 0 -> 33545 bytes jenkins/images/stack-o-pancakes-150x150.png | Bin 0 -> 49332 bytes jenkins/index.html | 467 +++ jenkins/notes | 69 + jenkins/scripts/.htaccess | 28 + jenkins/scripts/slidy.js | 2952 +++++++++++++++++ jenkins/scripts/slidy.js.gz | Bin 0 -> 12797 bytes jenkins/styles/.htaccess | 28 + jenkins/styles/openstack.css | 441 +++ jenkins/styles/slidy.css | 401 +++ jenkins/styles/w3c-blue.css | 493 +++ 83 files changed, 8114 insertions(+) create mode 100644 jenkins/Overview.html create mode 100644 jenkins/Overview.xhtml create mode 100644 jenkins/blank.html create mode 100644 jenkins/graphics/bullet-fold-dim.gif create mode 100644 jenkins/graphics/bullet-fold-dim.png create mode 100644 jenkins/graphics/bullet-fold.gif create mode 100644 jenkins/graphics/bullet-fold.png create mode 100644 jenkins/graphics/bullet-nofold-dim.gif create mode 100644 jenkins/graphics/bullet-nofold-dim.png create mode 100644 jenkins/graphics/bullet-nofold.gif create mode 100644 jenkins/graphics/bullet-nofold.png create mode 100644 jenkins/graphics/bullet-unfold-dim.gif create mode 100644 jenkins/graphics/bullet-unfold-dim.png create mode 100644 jenkins/graphics/bullet-unfold.gif create mode 100644 jenkins/graphics/bullet-unfold.png create mode 100644 jenkins/graphics/bullet.png create mode 100644 jenkins/graphics/example.png create mode 100644 jenkins/graphics/example.svg create mode 100644 jenkins/graphics/face1.gif create mode 100644 jenkins/graphics/face2.gif create mode 100644 jenkins/graphics/face3.gif create mode 100644 jenkins/graphics/face4.gif create mode 100644 jenkins/graphics/fold-bright.gif create mode 100644 jenkins/graphics/fold-dim.bmp create mode 100644 jenkins/graphics/fold-dim.gif create mode 100644 jenkins/graphics/fold.bmp create mode 100644 jenkins/graphics/fold.gif create mode 100644 jenkins/graphics/icon-blue.png create mode 100644 jenkins/graphics/keys2.jpg create mode 100644 jenkins/graphics/nofold-dim.bmp create mode 100644 jenkins/graphics/nofold-dim.gif create mode 100644 jenkins/graphics/nofold.bmp create mode 100644 jenkins/graphics/open-stack-cloud-computing-logo-2.png create mode 100644 jenkins/graphics/openstack-cloud-software-vertical-large.png create mode 100644 jenkins/graphics/unfold-bright.gif create mode 100644 jenkins/graphics/unfold-dim.bmp create mode 100644 jenkins/graphics/unfold-dim.gif create mode 100644 jenkins/graphics/unfold.bmp create mode 100644 jenkins/graphics/unfold.gif create mode 100644 jenkins/graphics/w3c-logo-blue.gif create mode 100644 jenkins/graphics/w3c-logo-blue.svg create mode 100644 jenkins/graphics/w3c-logo-slanted.jpg create mode 100644 jenkins/graphics/w3c-logo-white.gif create mode 100644 jenkins/graphics/w3c-logo-white.svg create mode 100644 jenkins/help/.htaccess create mode 100644 jenkins/help/help.html create mode 100644 jenkins/help/help.html.ca create mode 100644 jenkins/help/help.html.de create mode 100644 jenkins/help/help.html.en create mode 100644 jenkins/help/help.html.es create mode 100644 jenkins/help/help.html.fr create mode 100644 jenkins/help/help.html.hu create mode 100644 jenkins/help/help.html.nl create mode 100644 jenkins/help/help.html.pl create mode 100644 jenkins/help/help.html.pt-br create mode 100644 jenkins/help/help.html.pt_br create mode 100644 jenkins/help/help.html.sv create mode 100644 jenkins/help/help.pt-br.html create mode 100644 jenkins/images/489px-MySQL.svg.png create mode 100644 jenkins/images/Drizzle-med.png create mode 100644 jenkins/images/OpenStackLogo_wTag.png create mode 100644 jenkins/images/gerrit-approved.png create mode 100644 jenkins/images/gerrit-bp-topic.png create mode 100644 jenkins/images/gerrit-bp.png create mode 100644 jenkins/images/gerrit-bug.png create mode 100644 jenkins/images/gerrit-jenkins.png create mode 100644 jenkins/images/gerrit-sso.png create mode 100644 jenkins/images/gerrit-verify.png create mode 100644 jenkins/images/jenkins-gate.png create mode 100644 jenkins/images/lp-bp.png create mode 100644 jenkins/images/lp-bug.png create mode 100644 jenkins/images/lp-os-projects.png create mode 100644 jenkins/images/stack-o-pancakes-150x150.png create mode 100644 jenkins/index.html create mode 100644 jenkins/notes create mode 100644 jenkins/scripts/.htaccess create mode 100644 jenkins/scripts/slidy.js create mode 100644 jenkins/scripts/slidy.js.gz create mode 100644 jenkins/styles/.htaccess create mode 100644 jenkins/styles/openstack.css create mode 100644 jenkins/styles/slidy.css create mode 100644 jenkins/styles/w3c-blue.css diff --git a/ci-roadmap-folsom/index.html b/ci-roadmap-folsom/index.html index d3f9f4e..f3b8fdd 100644 --- a/ci-roadmap-folsom/index.html +++ b/ci-roadmap-folsom/index.html @@ -246,9 +246,20 @@ href="https://openstack-ci.github.com/publications/ci-roadmap-folsom">https://op +
+

translations

+ +
+

exploration

+
+ +
+

Everything Is Automated

+ + + +
+ +
+

Process Flow

+
    +
  • Code is written and locally tested in a virtualenv
  • +
  • Code is submitted for code review to gerrit
  • +
  • Code is run through patch-uploaded automated checks
  • +
  • Code is peer-reviewed
  • +
  • Code is accepted or rejected by core team
  • +
  • Code is run through pre-merge automated checks
  • +
  • Code is merged or rejected
  • +
  • Code is run through post-merge automated checks
  • +
+
+ +
+

Gerrit

+
    +
  • Developed by Google for Android
  • +
  • Stand-alone patch review system
  • +
  • Integration points: hooks, JSON queries, event-stream
  • +
  • Extensible review categories, default: Verified, Code-Review
  • +
+
+ +
+

Pre-merge Check

+ +
+ +
+

States of a Patch

+
    +
  • Code Submitted
  • +
  • Code Verified
  • +
  • Code Reviewed
  • +
  • Code Accepted
  • +
  • Code Landed
  • +
+
+ +
+

Approved Reviews

+ +
+ +
+

Types of Jenkins Gerrit Triggers

+
    +
  • Patchset uploaded
  • +
  • Change merged
  • +
  • Comment added (review state)
  • +
+
+ + +
+

Git Review

+
    +
  • External Git subcommand
  • +
  • Developers can easily incorporate code review into git workflow
  • +
  • Zero-configuration
  • +
  • Can be used for any project, being adopted by other projects
  • +
+ +
+corvus@shiprock:~/rs/github/quantum$ git commit -a
+[new-versionpy ddf1dce] Base version.py on glance.
+ 3 files changed, 28 insertions(+), 107 deletions(-)
+ delete mode 100644 version.py
+
+corvus@shiprock:~/rs/github/quantum$ git review
+remote: Resolving deltas:   0% (0/3)
+remote: 
+remote: New Changes:
+remote:   https://review.openstack.org/3072
+remote: 
+To ssh://corvus@review.openstack.org:29418/openstack/quantum.git
+ * [new branch]      HEAD -> refs/for/master/bug/916018
+
+ +
+ +
+

Types of Tests

+ + +
    +
  • Unit tests
  • +
  • Integration tests +
      +
    • May be able to run on virtual servers, should run on real servers
    • +
    • Difficult or impossible for a developer to run
    • +
    +
  • +
+ +
+ +
+

Specific Challenges/Solutions

+ +
    +
  • Testing effect of merging change
  • +
  • Using cloud builders
  • +
  • Large numbers of similar projects
  • +
  • Disparate hardware configurations
  • +
+ +
+ +
+

gerrit git prep

+
    +
  • test the result of the change, not the change
  • +
  • https://github.com/openstack/openstack-ci-puppet/blob/master/modules/jenkins_slave/files/slave_scripts/gerrit-git-prep.sh
  • +
  • For each gerrit change: +
      +
    • grabs target branch
    • +
    • cleans tree
    • +
    • merges change to be tested
    • +
    +
  • +
+
+ +
+

Interrelated integration testing

+
    +
  • devstack-gate +
      +
    • spin up fresh node
    • +
    • run devstack
    • +
    • run integration tests
    • +
    +
  • Gate proposed change against current state of other projects
  • +
+
+ +
+

bottlenecking

+
    +
  • Serialize branches across all projects
  • +
  • optimistic branch prediction
  • +
  • Run in parallel in order triggered
  • +
  • Assume success
  • +
  • Start over on failure
  • +
+
+ +
+

devstack-gate problems

+
    +
  • Clouds suck
  • +
  • github sucks
  • +
  • pypi sucks
  • +
  • Ubuntu sucks
  • +
  • ALL NETWORK ACCESS IS FAILURE
  • +
+
+ +
+

devstack-gate solutions

+
    +
  • Create a new node
  • +
  • pre-fetch all needed packages, repos
  • +
  • snapshot to cloud image
  • +
  • maintain a pool of cloud nodes
  • +
  • slave can only be used for one test run
  • +
  • set of python and shell scripts triggered by jenkins
  • +
+
+ +
+

jclouds-plugin

+
    +
  • ec2 plugin useless to me (sorry)
  • +
  • Adrian Cole and Cloudsoft wrote jclouds-plugin
  • +
  • Provisions on any provider via jclouds
  • +
  • Image pre-creation and pooling features
  • +
  • single use slaves
  • +
  • Slave provisioning as build step
  • +
+
+ +
+

Templated jobs

+
    +
  • TONS of consistent projects
  • +
  • Manage everything through git and code review
  • +
  • https://github.com/openstack/openstack-ci-puppet/tree/master/modules/jenkins_jobs
  • +
  • Manage jobs as yaml files in git
  • +
  • Jobs updated via Jenkins API
  • +
  • groupings of jobs supported "nova: python_jobs"
  • +
+
+ +
+

Simple example

+
+project:
+  template: 'python_jobs'
+
+values:
+  name: 'python-novaclient'
+  site: 'openstack'
+  disabled: 'false'
+
+
+ +
+

complex example

+
+---
+modules:
+  - properties
+  - scm
+  - assignednode
+  - trigger_gerrit
+  - builders
+  - publisher_none
+
+main:
+  name: 'gate-ceilometer-merge'
+  site: 'stackforge'
+  project: 'ceilometer'
+  authenticatedBuild: 'true'
+  disabled: 'false'
+
+trigger:
+  triggerOnPatchsetUploadedEvent: 'false'
+  triggerOnChangeMergedEvent: 'false'
+  triggerOnCommentAddedEvent: 'true'
+  triggerOnRefUpdatedEvent: 'false'
+  triggerApprovalCategory: 'APRV'
+  triggerApprovalValue: 1
+  failureMessage: 'This change was unable to be automatically merged with the current state of the repository. Please rebase your change and upload a new patchset.'
+  projects:
+    - projectCompareType: 'PLAIN'
+      projectPattern: 'stackforge/ceilometer'
+      branchCompareType: 'ANT'
+      branchPattern: '**'
+
+builders:
+  - gerrit_git_prep
+
+scm:
+  scm: 'false'
+
+assignednode:
+  node: 'oneiric'
+
+
+ +
+ + +
+

Scaling hardware needs

+ +
+ +
+

Thanks!

+ +

+ +

+These slides available at: https://github.com/openstack-ci/publications +

+ +
+ + + diff --git a/jenkins/notes b/jenkins/notes new file mode 100644 index 0000000..671429f --- /dev/null +++ b/jenkins/notes @@ -0,0 +1,69 @@ +[title] +Hi. I'm Monty This is Jim. + +[Lineage] +Our build infrasturcture and many of its philosophies come from: +MySQL - Launchpad/bzr +Drizzle - gated trunk, using all of the launchpad features +OpenStack - automated gated trunk via tarmac + +[gated trunk] +So with openStack, we did automated checks of every proposed commit through +jenkins and everything was happy + +[Git Revolt] +Then we had a revolt, because the developers wanted to use git. +Launchpad has no git support (or in-line code reviews) +Github's pull-request have no approval state + +[Enter Gerrit] +Gerrit, from google used by android, has all of the things we needed +Except for Launchpad integration +So we added it + +[Bug Integration] +Gerrit review launchpad links on bug metions +Gerrit topics set from bugs + +[Launchpad side] +Gerrit sends bug control emails with links to the review and the commit +State changes- in progress when review is submitted. Fix committed when +patch is accepted + +[Blueprint Integration] +Blueprint links in commit messages +Topics set from blueprint mentions + +[Launchpad side] +Inject information on commits to blueprints just like bugs +Have to use the whiteboard +Link to review - but also to the general gerrit topic, since a blueprint +might have more than one branch + +[SSO] +Gerrit and Jenkins both use Launchpad OpenID for auth + +[Jenkins Integration] +Gerrit has deep jenkins integration. Listens on an ssh stream and takes +active action. Posts back to the review with jenkins links on success or +failure + +[Gerrit Verification] +Jenkins fills the gerrit role of verifier. +In addition to being approved or denied, a given change can be verified as +working or not. + +[Feature REquest time] +Subscribably event triggers +Verification status +launchpadlib api bindings in non-python + +[While we're at it] +Foreign merge props - bugs were cool, lots of people do code review +elsewhere +mirrored branches +Branch/merge prop integration with blueprints +Structured info in blueprints + + + diff --git a/jenkins/scripts/.htaccess b/jenkins/scripts/.htaccess new file mode 100644 index 0000000..d395348 --- /dev/null +++ b/jenkins/scripts/.htaccess @@ -0,0 +1,28 @@ +Options +MultiViews +LanguagePriority en +AddLanguage pt-br .pt-br + + + +ForceType 'text/html; charset=utf-8' + + + + + +ForceType 'application/xhtml+xml; charset=utf-8' + + + + + +ForceType 'text/css; charset=utf-8' + + + + + +ForceType 'text/javascript; charset=utf-8' + + +mkdir diff --git a/jenkins/scripts/slidy.js b/jenkins/scripts/slidy.js new file mode 100644 index 0000000..217a421 --- /dev/null +++ b/jenkins/scripts/slidy.js @@ -0,0 +1,2952 @@ +/* slidy.js + + 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 + + Defines single name "w3c_slidy" in global namespace + Adds event handlers without trampling on any others +*/ + +// the slidy object implementation +var w3c_slidy = { + // classify which kind of browser we're running under + ns_pos: (typeof window.pageYOffset!='undefined'), + khtml: ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false), + opera: ((navigator.userAgent).indexOf("Opera") >= 0 ? true : false), + ipad: ((navigator.userAgent).indexOf("iPad") >= 0 ? true : false), + iphone: ((navigator.userAgent).indexOf("iPhone") >= 0 ? true : false), + android: ((navigator.userAgent).indexOf("Android") >= 0 ? true : false), + ie: (typeof document.all != "undefined" && !this.opera), + ie6: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 6") != -1), + ie7: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 7") != -1), + ie8: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 8") != -1), + ie9: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 9") != -1), + + // data for swipe and double tap detection on touch screens + last_tap: 0, + prev_tap: 0, + start_x: 0, + start_y: 0, + delta_x: 0, + delta_y: 0, + + // are we running as XHTML? (doesn't work on Opera) + is_xhtml: /xml/.test(document.contentType), + + slide_number: 0, // integer slide count: 0, 1, 2, ... + slide_number_element: null, // element containing slide number + slides: [], // set to array of slide div's + notes: [], // set to array of handout div's + backgrounds: [], // set to array of background div's + toolbar: null, // element containing toolbar + title: null, // document title + last_shown: null, // last incrementally shown item + eos: null, // span element for end of slide indicator + toc: null, // table of contents + outline: null, // outline element with the focus + selected_text_len: 0, // length of drag selection on document + view_all: 0, // 1 to view all slides + handouts + want_toolbar: true, // user preference to show/hide toolbar + mouse_click_enabled: true, // enables left click for next slide + scroll_hack: 0, // IE work around for position: fixed + disable_slide_click: false, // used by clicked anchors + + lang: "en", // updated to language specified by html file + + help_anchor: null, // used for keyboard focus hack in showToolbar() + help_page: "http://www.w3.org/Talks/Tools/Slidy2/help/help.html", + help_text: "Navigate with mouse click, space bar, Cursor Left/Right, " + + "or Pg Up and Pg Dn. Use S and B to change font size.", + + size_index: 0, + size_adjustment: 0, + sizes: new Array("10pt", "12pt", "14pt", "16pt", "18pt", "20pt", + "22pt", "24pt", "26pt", "28pt", "30pt", "32pt"), + + // needed for efficient resizing + last_width: 0, + last_height: 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 + objects: [], + + // attach initialiation event handlers + set_up: function () { + var init = function() { w3c_slidy.init(); }; + if (typeof window.addEventListener != "undefined") + window.addEventListener("load", init, false); + else + window.attachEvent("onload", init); + }, + + hide_slides: function () { + if (document.body && !w3c_slidy.initialized) + document.body.style.visibility = "hidden"; + else + setTimeout(w3c_slidy.hide_slides, 50); + }, + + // hack to persuade IE to compute correct document height + // as needed for simulating fixed positioning of toolbar + ie_hack: function () { + window.resizeBy(0,-1); + window.resizeBy(0, 1); + }, + + init: function () { + //alert("slidy starting test 10"); + document.body.style.visibility = "visible"; + this.init_localization(); + this.add_toolbar(); + this.wrap_implicit_slides(); + this.collect_slides(); + this.collect_notes(); + this.collect_backgrounds(); + this.objects = document.body.getElementsByTagName("object"); + this.patch_anchors(); + this.slide_number = this.find_slide_number(location.href); + window.offscreenbuffering = true; + this.size_adjustment = this.find_size_adjust(); + this.time_left = this.find_duration(); + this.hide_image_toolbar(); // suppress IE image toolbar popup + this.init_outliner(); // activate fold/unfold support + this.title = document.title; + this.keyboardless = (this.ipad||this.iphone||this.android); + + if (this.keyboardless) + { + w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden") + this.want_toolbar = 0; + } + + // work around for opera bug + this.is_xhtml = (document.body.tagName == "BODY" ? false : true); + + if (this.slides.length > 0) + { + var slide = this.slides[this.slide_number]; + + if (this.slide_number > 0) + { + this.set_visibility_all_incremental("visible"); + this.last_shown = this.previous_incremental_item(null); + this.set_eos_status(true); + } + else + { + this.last_shown = null; + this.set_visibility_all_incremental("hidden"); + this.set_eos_status(!this.next_incremental_item(this.last_shown)); + } + + this.set_location(); + this.add_class(this.slides[0], "first-slide"); + w3c_slidy.show_slide(slide); + } + + this.toc = this.table_of_contents(); + + this.add_initial_prompt(); + + // bind event handlers without interfering with custom page scripts + // Tap events behave too weirdly to support clicks reliably on + // iPhone and iPad, so exclude these from click handler + + if (!this.keyboardless) + this.add_listener(document.body, "click", this.mouse_button_click); + + this.add_listener(document, "keydown", this.key_down); + this.add_listener(document, "keypress", this.key_press); + this.add_listener(window, "resize", this.resized); + this.add_listener(window, "scroll", this.scrolled); + this.add_listener(window, "unload", this.unloaded); + + this.add_listener(document, "touchstart", this.touchstart); + this.add_listener(document, "touchmove", this.touchmove); + this.add_listener(document, "touchend", this.touchend); + + // this seems to be a debugging hack + //if (!document.body.onclick) + // document.body.onclick = function () { }; + + this.single_slide_view(); + + //this.set_location(); + + this.resized(); + + if (this.ie7) + setTimeout(w3c_slidy.ie_hack, 100); + + this.show_toolbar(); + + // for back button detection + setInterval(function () { w3c_slidy.check_location(); }, 200); + w3c_slidy.initialized = true; + }, + + // create div element with links to each slide + table_of_contents: function () { + var toc = this.create_element("div"); + this.add_class(toc, "slidy_toc hidden"); + //toc.setAttribute("tabindex", "0"); + + var heading = this.create_element("div"); + this.add_class(heading, "toc-heading"); + heading.innerHTML = this.localize("Table of Contents"); + + toc.appendChild(heading); + var previous = null; + + for (var i = 0; i < this.slides.length; ++i) + { + var title = this.has_class(this.slides[i], "title"); + var num = document.createTextNode((i + 1) + ". "); + + toc.appendChild(num); + + var a = this.create_element("a"); + a.setAttribute("href", "#(" + (i+1) + ")"); + + if (title) + this.add_class(a, "titleslide"); + + var name = document.createTextNode(this.slide_name(i)); + a.appendChild(name); + a.onclick = w3c_slidy.toc_click; + a.onkeydown = w3c_slidy.toc_key_down; + a.previous = previous; + + if (previous) + previous.next = a; + + toc.appendChild(a); + + if (i == 0) + toc.first = a; + + if (i < this.slides.length - 1) + { + var br = this.create_element("br"); + toc.appendChild(br); + } + + previous = a; + } + + toc.focus = function () { + if (this.first) + this.first.focus(); + } + + toc.onmouseup = w3c_slidy.mouse_button_up; + + toc.onclick = function (e) { + e||(e=window.event); + + if (w3c_slidy.selected_text_len <= 0) + w3c_slidy.hide_table_of_contents(true); + + w3c_slidy.stop_propagation(e); + + if (e.cancel != undefined) + e.cancel = true; + + if (e.returnValue != undefined) + e.returnValue = false; + + return false; + }; + + document.body.insertBefore(toc, document.body.firstChild); + return toc; + }, + + is_shown_toc: function () { + return !w3c_slidy.has_class(w3c_slidy.toc, "hidden"); + }, + + show_table_of_contents: function () { + w3c_slidy.remove_class(w3c_slidy.toc, "hidden"); + var toc = w3c_slidy.toc; + toc.focus(); + + if (w3c_slidy.ie7 && w3c_slidy.slide_number == 0) + setTimeout(w3c_slidy.ie_hack, 100); + }, + + hide_table_of_contents: function (focus) { + w3c_slidy.add_class(w3c_slidy.toc, "hidden"); + + if (focus && !w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + }, + + toggle_table_of_contents: function () { + if (w3c_slidy.is_shown_toc()) + w3c_slidy.hide_table_of_contents(true); + else + w3c_slidy.show_table_of_contents(); + }, + + // called on clicking toc entry + toc_click: function (e) { + if (!e) + e = window.event; + + var target = w3c_slidy.get_target(e); + + if (target && target.nodeType == 1) + { + var uri = target.getAttribute("href"); + + if (uri) + { + //alert("going to " + uri); + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri); + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_location(); + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + w3c_slidy.show_slide(slide); + //target.focus(); + + try + { + if (!w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + } + catch (e) + { + } + } + } + + w3c_slidy.hide_table_of_contents(true); + if (w3c_slidy.ie7) w3c_slidy.ie_hack(); + w3c_slidy.stop_propagation(e); + return w3c_slidy.cancel(e); + }, + + // called onkeydown for toc entry + toc_key_down: function (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 == 13) + { + var uri = this.getAttribute("href"); + + if (uri) + { + //alert("going to " + uri); + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri); + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_location(); + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + w3c_slidy.show_slide(slide); + //target.focus(); + + try + { + if (!w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + } + catch (e) + { + } + } + + w3c_slidy.hide_table_of_contents(true); + + if (self.ie7) + w3c_slidy.ie_hack(); + + return w3c_slidy.cancel(event); + } + + if (key == 40 && this.next) + { + this.next.focus(); + return w3c_slidy.cancel(event); + } + + if (key == 38 && this.previous) + { + this.previous.focus(); + return w3c_slidy.cancel(event); + } + + return true; + }, + + touchstart: function (e) + { + //e.preventDefault(); + this.prev_tap = this.last_tap; + this.last_tap = (new Date).getTime(); + + var tap_delay = this.last_tap - this.prev_tap; + + if (tap_delay <= 200) + { + // double tap + } + + var touch = e.touches[0]; + + this.start_x = touch.pageX; + this.start_y = touch.pageY; + this.delta_x = this.delta_y = 0; + }, + + touchmove: function (e) + { + //e.preventDefault(); + var touch = e.touches[0]; + this.delta_x = touch.pageX - this.start_x; + this.delta_y = touch.pageY - this.start_y; + }, + + touchend: function (e) + { + //e.preventDefault(); + var delay = (new Date).getTime() - this.last_tap; + var dx = this.delta_x; + var dy = this.delta_y; + var abs_dx = Math.abs(dx); + var abs_dy = Math.abs(dy); + + if (delay < 500 && (abs_dx > 100 || abs_dy > 100)) + { + if (abs_dx > 0.5 * abs_dy) + { + if (dx > 0) + w3c_slidy.next_slide(true); + else + w3c_slidy.previous_slide(true); + } + else if (abs_dy > 2 * abs_dx) + { + w3c_slidy.toggle_table_of_contents(); + } + } + }, + + // ### OBSOLETE ### + before_print: function () { + this.show_all_slides(); + this.hide_toolbar(); + alert("before print"); + }, + + // ### OBSOLETE ### + after_print: function () { + if (!this.view_all) + { + this.single_slide_view(); + this.show_toolbar(); + } + alert("after print"); + }, + + // ### OBSOLETE ### + print_slides: function () { + this.before_print(); + window.print(); + this.after_print(); + }, + + // ### OBSOLETE ?? ### + toggle_view: function () { + if (this.view_all) + { + this.single_slide_view(); + this.show_toolbar(); + this.view_all = 0; + } + else + { + this.show_all_slides(); + this.hide_toolbar(); + this.view_all = 1; + } + }, + + // prepare for printing ### OBSOLETE ### + show_all_slides: function () { + this.remove_class(document.body, "single_slide"); + this.set_visibility_all_incremental("visible"); + }, + + // restore after printing ### OBSOLETE ### + single_slide_view: function () { + this.add_class(document.body, "single_slide"); + this.set_visibility_all_incremental("visible"); + this.last_shown = this.previous_incremental_item(null); + }, + + // suppress IE's image toolbar pop up + hide_image_toolbar: function () { + if (!this.ns_pos) + { + var images = document.getElementsByTagName("IMG"); + + for (var i = 0; i < images.length; ++i) + images[i].setAttribute("galleryimg", "no"); + } + }, + + unloaded: function (e) { + //alert("unloaded"); + }, + + // Safari and Konqueror don't yet support getComputedStyle() + // and they always reload page when location.href is updated + is_KHTML: function () { + var agent = navigator.userAgent; + return (agent.indexOf("KHTML") >= 0 ? true : false); + }, + + // find slide name from first h1 element + // default to document title + slide number + slide_name: function (index) { + var name = null; + var slide = this.slides[index]; + + var heading = this.find_heading(slide); + + if (heading) + name = this.extract_text(heading); + + if (!name) + name = this.title + "(" + (index + 1) + ")"; + + name.replace(/\&/g, "&"); + name.replace(/\/g, ">"); + + return name; + }, + + // find first h1 element in DOM tree + find_heading: function (node) { + if (!node || node.nodeType != 1) + return null; + + if (node.nodeName == "H1" || node.nodeName == "h1") + return node; + + var child = node.firstChild; + + while (child) + { + node = this.find_heading(child); + + if (node) + return node; + + child = child.nextSibling; + } + + return null; + }, + + // recursively extract text from DOM tree + extract_text: function (node) { + if (!node) + return ""; + + // text nodes + if (node.nodeType == 3) + return node.nodeValue; + + // elements + if (node.nodeType == 1) + { + node = node.firstChild; + var text = ""; + + while (node) + { + text = text + this.extract_text(node); + node = node.nextSibling; + } + + return text; + } + + return ""; + }, + + // find copyright text from meta element + find_copyright: function () { + 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; + }, + + find_size_adjust: function () { + var name, content, offset; + 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 == "font-size-adjustment") + return 1 * content; + } + + return 1; + }, + + // for 20 minutes + find_duration: function () { + var name, content, offset; + 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 == "duration") + return 60000 * content; + } + + return null; + }, + + replace_by_non_breaking_space: function (str) { + for (var i = 0; i < str.length; ++i) + str[i] = 160; + }, + + // ### CHECK ME ### is use of "li" okay for text/html? + // for XHTML do we also need to specify namespace? + init_outliner: function () { + var items = document.getElementsByTagName("li"); + + for (var i = 0; i < items.length; ++i) + { + var target = items[i]; + + if (!this.has_class(target.parentNode, "outline")) + continue; + + target.onclick = this.outline_click; +/* ### more work needed for IE6 + if (!this.ns_pos) + { + target.onmouseover = this.hover_outline; + target.onmouseout = this.unhover_outline; + } +*/ + if (this.foldable(target)) + { + target.foldable = true; + target.onfocus = function () {w3c_slidy.outline = this;}; + target.onblur = function () {w3c_slidy.outline = null;}; + + if (!target.getAttribute("tabindex")) + target.setAttribute("tabindex", "0"); + + if (this.has_class(target, "expand")) + this.unfold(target); + else + this.fold(target); + } + else + { + this.add_class(target, "nofold"); + target.visible = true; + target.foldable = false; + } + } + }, + + foldable: function (item) { + if (!item || item.nodeType != 1) + return false; + + var node = item.firstChild; + + while (node) + { + if (node.nodeType == 1 && this.is_block(node)) + return true; + + node = node.nextSibling; + } + + return false; + }, + + // ### CHECK ME ### switch to add/remove "hidden" class + fold: function (item) { + if (item) + { + this.remove_class(item, "unfolded"); + this.add_class(item, "folded"); + } + + var node = item ? item.firstChild : null; + + while (node) + { + if (node.nodeType == 1 && this.is_block(node)) // element + { + w3c_slidy.add_class(node, "hidden"); + } + + node = node.nextSibling; + } + + item.visible = false; + }, + + // ### CHECK ME ### switch to add/remove "hidden" class + unfold: function (item) { + if (item) + { + this.add_class(item, "unfolded"); + this.remove_class(item, "folded"); + } + + var node = item ? item.firstChild : null; + + while (node) + { + if (node.nodeType == 1 && this.is_block(node)) // element + { + w3c_slidy.remove_class(node, "hidden"); + } + + node = node.nextSibling; + } + + item.visible = true; + }, + + outline_click: function (e) { + if (!e) + e = window.event; + + var rightclick = false; + var target = w3c_slidy.get_target(e); + + while (target && target.visible == undefined) + target = target.parentNode; + + if (!target) + return true; + + if (e.which) + rightclick = (e.which == 3); + else if (e.button) + rightclick = (e.button == 2); + + if (!rightclick && target.visible != undefined) + { + if (target.foldable) + { + if (target.visible) + w3c_slidy.fold(target); + else + w3c_slidy.unfold(target); + } + + w3c_slidy.stop_propagation(e); + e.cancel = true; + e.returnValue = false; + } + + return false; + }, + + add_initial_prompt: function () { + var prompt = this.create_element("div"); + prompt.setAttribute("class", "initial_prompt"); + + var p1 = this.create_element("p"); + prompt.appendChild(p1); + p1.setAttribute("class", "help"); + + if (this.keyboardless) + p1.innerHTML = "swipe right to move to next slide"; + else + p1.innerHTML = "Space, Right Arrow or swipe right to move to " + + "next slide, click help below for more details"; + + this.add_listener(prompt, "click", function (e) { + document.body.removeChild(prompt); + w3c_slidy.stop_propagation(e); + + if (e.cancel != undefined) + e.cancel = true; + + if (e.returnValue != undefined) + e.returnValue = false; + + return false; + }); + + document.body.appendChild(prompt); + this.initial_prompt = prompt; + setTimeout(function() {document.body.removeChild(prompt);}, 5000); + }, + + add_toolbar: function () { + var counter, page; + + this.toolbar = this.create_element("div"); + this.toolbar.setAttribute("class", "toolbar"); + + // a reasonably behaved browser + if (this.ns_pos || !this.ie6) + { + var right = this.create_element("div"); + right.setAttribute("style", "float: right; text-align: right"); + + counter = this.create_element("span") + counter.innerHTML = this.localize("slide") + " n/m"; + right.appendChild(counter); + this.toolbar.appendChild(right); + + var left = this.create_element("div"); + left.setAttribute("style", "text-align: left"); + + // global end of slide indicator + this.eos = this.create_element("span"); + this.eos.innerHTML = "* "; + left.appendChild(this.eos); + + var help = this.create_element("a"); + help.setAttribute("href", this.help_page); + help.setAttribute("title", this.localize(this.help_text)); + help.innerHTML = this.localize("help?"); + left.appendChild(help); + this.help_anchor = help; // save for focus hack + + var gap1 = document.createTextNode(" "); + left.appendChild(gap1); + + var contents = this.create_element("a"); + contents.setAttribute("href", "javascript:w3c_slidy.toggle_table_of_contents()"); + contents.setAttribute("title", this.localize("table of contents")); + contents.innerHTML = this.localize("contents?"); + left.appendChild(contents); + + var gap2 = document.createTextNode(" "); + left.appendChild(gap2); + + var copyright = this.find_copyright(); + + if (copyright) + { + var span = this.create_element("span"); + span.className = "copyright"; + span.innerHTML = copyright; + left.appendChild(span); + } + + this.toolbar.setAttribute("tabindex", "0"); + this.toolbar.appendChild(left); + } + else // IE6 so need to work around its poor CSS support + { + this.toolbar.style.position = (this.ie7 ? "fixed" : "absolute"); + this.toolbar.style.zIndex = "200"; + this.toolbar.style.width = "99.9%"; + this.toolbar.style.height = "1.2em"; + this.toolbar.style.top = "auto"; + this.toolbar.style.bottom = "0"; + this.toolbar.style.left = "0"; + this.toolbar.style.right = "0"; + this.toolbar.style.textAlign = "left"; + this.toolbar.style.fontSize = "60%"; + this.toolbar.style.color = "red"; + this.toolbar.borderWidth = 0; + this.toolbar.className = "toolbar"; + this.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 = this.create_element("span"); + sp.innerHTML = "  * "; + this.toolbar.appendChild(sp); + this.eos = sp; // end of slide indicator + + var help = this.create_element("a"); + help.setAttribute("href", this.help_page); + help.setAttribute("title", this.localize(this.help_text)); + help.innerHTML = this.localize("help?"); + this.toolbar.appendChild(help); + this.help_anchor = help; // save for focus hack + + var gap1 = document.createTextNode(" "); + this.toolbar.appendChild(gap1); + + var contents = this.create_element("a"); + contents.setAttribute("href", "javascript:toggleTableOfContents()"); + contents.setAttribute("title", this.localize("table of contents".localize)); + contents.innerHTML = this.localize("contents?"); + this.toolbar.appendChild(contents); + + var gap2 = document.createTextNode(" "); + this.toolbar.appendChild(gap2); + + var copyright = this.find_copyright(); + + if (copyright) + { + var span = this.create_element("span"); + span.innerHTML = copyright; + span.style.color = "black"; + span.style.marginLeft = "0.5em"; + this.toolbar.appendChild(span); + } + + counter = this.create_element("div") + counter.style.position = "absolute"; + counter.style.width = "auto"; //"20%"; + counter.style.height = "1.2em"; + counter.style.top = "auto"; + counter.style.bottom = 0; + counter.style.right = "0"; + counter.style.textAlign = "right"; + counter.style.color = "red"; + counter.style.background = "rgb(240,240,240)"; + + counter.innerHTML = this.localize("slide") + " n/m"; + this.toolbar.appendChild(counter); + } + + // ensure that click isn't passed through to the page + this.toolbar.onclick = + function (e) { + if (!e) + e = window.event; + + var target = e.target; + + if (!target && e.srcElement) + target = e.srcElement; + + // work around Safari bug + if (target && target.nodeType == 3) + target = target.parentNode; + + w3c_slidy.stop_propagation(e); + + if (target && target.nodeName.toLowerCase() != "a") + w3c_slidy.mouse_button_click(e); + }; + + this.slide_number_element = counter; + this.set_eos_status(false); + document.body.appendChild(this.toolbar); + }, + + // wysiwyg editors make it hard to use div elements + // e.g. amaya loses the div when you copy and paste + // this function wraps div elements around implicit + // slides which start with an h1 element and continue + // up to the next heading or div element + wrap_implicit_slides: function () { + var i, heading, node, next, div; + var headings = document.getElementsByTagName("h1"); + + if (!headings) + return; + + for (i = 0; i < headings.length; ++i) + { + heading = headings[i]; + + if (heading.parentNode != document.body) + continue; + + node = heading.nextSibling; + + div = document.createElement("div"); + this.add_class(div, "slide"); + document.body.replaceChild(div, heading); + div.appendChild(heading); + + while (node) + { + if (node.nodeType == 1 && // an element + (node.nodeName == "H1" || + node.nodeName == "h1" || + node.nodeName == "DIV" || + node.nodeName == "div")) + break; + + next = node.nextSibling; + node = document.body.removeChild(node); + div.appendChild(node); + node = next; + } + } + }, + +// return new array of all slides + collect_slides: function () { + var slides = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (this.has_class(div, "slide")) + { + // add slide to collection + slides[slides.length] = div; + + // hide each slide as it is found + this.add_class(div, "hidden"); + + // add dummy
at end for scrolling hack + var node1 = document.createElement("br"); + div.appendChild(node1); + var node2 = document.createElement("br"); + div.appendChild(node2); + } + else if (this.has_class(div, "background")) + { // work around for Firefox SVG reload bug + // which otherwise replaces 1st SVG graphic with 2nd + div.style.display = "block"; + } + } + + this.slides = slides; + }, + + // return new array of all
+ collect_notes: function () { + var notes = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (this.has_class(div, "handout")) + { + // add note to collection + notes[notes.length] = div; + + // and hide it + this.add_class(div, "hidden"); + } + } + + this.notes = notes; + }, + + // return new array of all
+ // including named backgrounds e.g. class="background titlepage" + collect_backgrounds: function () { + var backgrounds = new Array(); + var divs = document.body.getElementsByTagName("div"); + + for (var i = 0; i < divs.length; ++i) + { + div = divs.item(i); + + if (this.has_class(div, "background")) + { + // add background to collection + backgrounds[backgrounds.length] = div; + + // and hide it + this.add_class(div, "hidden"); + } + } + + this.backgrounds = backgrounds; + }, + + // set click handlers on all anchors + patch_anchors: function () { + var self = w3c_slidy; + var handler = function (event) { + // compare this.href with location.href + // for link to another slide in this doc + + if (self.page_address(this.href) == self.page_address(location.href)) + { + // yes, so find new slide number + var newslidenum = self.find_slide_number(this.href); + + if (newslidenum != self.slide_number) + { + var slide = self.slides[self.slide_number]; + self.hide_slide(slide); + self.slide_number = newslidenum; + slide = self.slides[self.slide_number]; + self.show_slide(slide); + self.set_location(); + } + } + else + w3c_slidy.stop_propagation(event); + +// else if (this.target == null) +// location.href = this.href; + + this.blur(); + self.disable_slide_click = true; + }; + + var anchors = document.body.getElementsByTagName("a"); + + for (var i = 0; i < anchors.length; ++i) + { + if (window.addEventListener) + anchors[i].addEventListener("click", handler, false); + else + anchors[i].attachEvent("onclick", handler); + } + }, + + // ### CHECK ME ### see which functions are invoked via setTimeout + // either directly or indirectly for use of w3c_slidy vs this + show_slide_number: function () { + var timer = w3c_slidy.get_timer(); + w3c_slidy.slide_number_element.innerHTML = timer + w3c_slidy.localize("slide") + " " + + (w3c_slidy.slide_number + 1) + "/" + w3c_slidy.slides.length; + }, + + // every 200mS check if the location has been changed as a + // result of the user activating the Back button/menu item + // doesn't work for Opera < 9.5 + check_location: function () { + var hash = location.hash; + + if (w3c_slidy.slide_number > 0 && (hash == "" || hash == "#")) + w3c_slidy.goto_slide(0); + else if (hash.length > 2 && hash != "#("+(w3c_slidy.slide_number+1)+")") + { + var num = parseInt(location.hash.substr(2)); + + if (!isNaN(num)) + w3c_slidy.goto_slide(num-1); + } + + if (w3c_slidy.time_left && w3c_slidy.slide_number > 0) + { + w3c_slidy.show_slide_number(); + + if (w3c_slidy.time_left > 0) + w3c_slidy.time_left -= 200; + } + }, + + get_timer: function () { + var timer = ""; + if (w3c_slidy.time_left) + { + var mins, secs; + secs = Math.floor(w3c_slidy.time_left/1000); + mins = Math.floor(secs / 60); + secs = secs % 60; + timer = (mins ? mins+"m" : "") + secs + "s "; + } + + return timer; + }, + + // this doesn't push location onto history stack for IE + // for which a hidden iframe hack is needed: load page into + // the iframe with script that set's parent's location.hash + // but that won't work for standalone use unless we can + // create the page dynamically via a javascript: URL + set_location: function () { + var uri = w3c_slidy.page_address(location.href); + var hash = "#(" + (w3c_slidy.slide_number+1) + ")"; + + if (w3c_slidy.slide_number >= 0) + uri = uri + hash; + + if (w3c_slidy.ie && (w3c_slidy.ie6 || w3c_slidy.ie7)) + w3c_slidy.push_hash(hash); + + if (uri != location.href) // && !khtml + location.href = uri; + + if (this.khtml) + hash = "(" + (w3c_slidy.slide_number+1) + ")"; + + if (!this.ie && location.hash != hash && location.hash != "") + location.hash = hash; + + document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")"; + w3c_slidy.show_slide_number(); + }, + + page_address: function (uri) { + var i = uri.indexOf("#"); + + if (i < 0) + i = uri.indexOf("%23"); + + // check if anchor is entire page + + if (i < 0) + return uri; // yes + + return uri.substr(0, i); + }, + + // only used for IE6 and IE7 + on_frame_loaded: function (hash) { + location.hash = hash; + var uri = w3c_slidy.page_address(location.href); + location.href = uri + hash; + }, + + // history hack with thanks to Bertrand Le Roy + push_hash: function (hash) { + if (hash == "") hash = "#(1)"; + window.location.hash = hash; + + var doc = document.getElementById("historyFrame").contentWindow.document; + doc.open("javascript:''"); + doc.write("hello mum"); + doc.close(); + }, + + // 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 + find_slide_number: function (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 = unescape(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 > this.slides.length) + num = 1; + + if (--num < 0) + num = 0; + + return num; + } + + // accept [2] for backwards compatibility + re = /\[(\d)+\]/; + + if (anchor.match(re)) + { + var num = parseInt(anchor.substring(1, anchor.length-1)); + + if (num > this.slides.length) + num = 1; + + if (--num < 0) + num = 0; + + return num; + } + + // oh dear unknown anchor + return 0; + } + + // search for enclosing slide + + while (true) + { + // browser coerces html elements to uppercase! + if (target.nodeName.toLowerCase() == "div" && + this.has_class(target, "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; + }, + + previous_slide: function (incremental) { + if (!w3c_slidy.view_all) + { + var slide; + + if ((incremental || w3c_slidy.slide_number == 0) && w3c_slidy.last_shown != null) + { + w3c_slidy.last_shown = w3c_slidy.hide_previous_item(w3c_slidy.last_shown); + w3c_slidy.set_eos_status(false); + } + else if (w3c_slidy.slide_number > 0) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + + w3c_slidy.slide_number = w3c_slidy.slide_number - 1; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.set_visibility_all_incremental("visible"); + w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null); + w3c_slidy.set_eos_status(true); + w3c_slidy.show_slide(slide); + } + + w3c_slidy.set_location(); + + if (!w3c_slidy.ns_pos) + w3c_slidy.refresh_toolbar(200); + } + }, + + next_slide: function (incremental) { + if (!w3c_slidy.view_all) + { + var slide, last = w3c_slidy.last_shown; + + if (incremental || w3c_slidy.slide_number == w3c_slidy.slides.length - 1) + w3c_slidy.last_shown = w3c_slidy.reveal_next_item(w3c_slidy.last_shown); + + if ((!incremental || w3c_slidy.last_shown == null) && + w3c_slidy.slide_number < w3c_slidy.slides.length - 1) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + + w3c_slidy.slide_number = w3c_slidy.slide_number + 1; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.show_slide(slide); + } + else if (!w3c_slidy.last_shown) + { + if (last && incremental) + w3c_slidy.last_shown = last; + } + + w3c_slidy.set_location(); + + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + + if (!w3c_slidy.ns_pos) + w3c_slidy.refresh_toolbar(200); + } + }, + + // to first slide with nothing revealed + // i.e. state at start of presentation + first_slide: function () { + if (!w3c_slidy.view_all) + { + var slide; + + if (w3c_slidy.slide_number != 0) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + + w3c_slidy.slide_number = 0; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.show_slide(slide); + } + + w3c_slidy.set_eos_status( + !w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + w3c_slidy.set_location(); + } + }, + + // goto last slide with everything revealed + // i.e. state at end of presentation + last_slide: function () { + if (!w3c_slidy.view_all) + { + var slide; + + w3c_slidy.last_shown = null; //revealNextItem(lastShown); + + if (w3c_slidy.last_shown == null && + w3c_slidy.slide_number < w3c_slidy.slides.length - 1) + { + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = w3c_slidy.slides.length - 1; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.set_visibility_all_incremental("visible"); + w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null); + + w3c_slidy.show_slide(slide); + } + else + { + w3c_slidy.set_visibility_all_incremental("visible"); + w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null); + } + + w3c_slidy.set_eos_status(true); + w3c_slidy.set_location(); + } + }, + + + // ### check this and consider add/remove class + set_eos_status: function (state) { + if (this.eos) + this.eos.style.color = (state ? "rgb(240,240,240)" : "red"); + }, + + // first slide is 0 + goto_slide: function (num) { + //alert("going to slide " + (num+1)); + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.slide_number = num; + slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.last_shown = null; + w3c_slidy.set_visibility_all_incremental("hidden"); + w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown)); + document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")"; + w3c_slidy.show_slide(slide); + w3c_slidy.show_slide_number(); + }, + + + show_slide: function (slide) { + this.sync_background(slide); + window.scrollTo(0,0); + this.remove_class(slide, "hidden"); + }, + + hide_slide: function (slide) { + this.add_class(slide, "hidden"); + }, + + // show just the backgrounds pertinent to this slide + // when slide background-color is transparent + // this should now work with rgba color values + sync_background: function (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" || + bgColor.indexOf("rgba") >= 0 || + bgColor.indexOf("opacity") >= 0) + { + var slideClass = this.get_class_list(slide); + + for (var i = 0; i < this.backgrounds.length; i++) + { + background = this.backgrounds[i]; + + var bgClass = this.get_class_list(background); + + if (this.matching_background(slideClass, bgClass)) + this.remove_class(background, "hidden"); + else + this.add_class(background, "hidden"); + } + } + else // forcibly hide all backgrounds + this.hide_backgrounds(); + }, + + hide_backgrounds: function () { + for (var i = 0; i < this.backgrounds.length; i++) + { + background = this.backgrounds[i]; + this.add_class(background, "hidden"); + } + }, + + // compare classes for slide and background + matching_background: function (slideClass, bgClass) { + var i, count, pattern, result; + + // define pattern as regular expression + pattern = /\w+/g; + + // check background class names + result = bgClass.match(pattern); + + for (i = count = 0; i < result.length; i++) + { + if (result[i] == "hidden") + continue; + + if (result[i] == "background") + continue; + + ++count; + } + + if (count == 0) // default match + return true; + + // check for matches and place result in array + result = slideClass.match(pattern); + + // now check if desired name is present for background + for (i = count = 0; i < result.length; i++) + { + if (result[i] == "hidden") + continue; + + if (this.has_token(bgClass, result[i])) + return true; + } + + return false; + }, + + resized: function () { + 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 + + if (height && (width/height > 1.05*1024/768)) + { + width = height * 1024.0/768; + } + + // IE fires onresize even when only font size is changed! + // so we do a check to avoid blocking < and > actions + if (width != w3c_slidy.last_width || height != w3c_slidy.last_height) + { + if (width >= 1100) + w3c_slidy.size_index = 5; // 4 + else if (width >= 1000) + w3c_slidy.size_index = 4; // 3 + else if (width >= 800) + w3c_slidy.size_index = 3; // 2 + else if (width >= 600) + w3c_slidy.size_index = 2; // 1 + else if (width) + w3c_slidy.size_index = 0; + + // add in font size adjustment from meta element e.g. + // + // useful when slides have too much content ;-) + + if (0 <= w3c_slidy.size_index + w3c_slidy.size_adjustment && + w3c_slidy.size_index + w3c_slidy.size_adjustment < w3c_slidy.sizes.length) + w3c_slidy.size_index = w3c_slidy.size_index + w3c_slidy.size_adjustment; + + // enables cross browser use of relative width/height + // on object elements for use with SVG and Flash media + w3c_slidy.adjust_object_dimensions(width, height); + + if (document.body.style.fontSize != w3c_slidy.sizes[w3c_slidy.size_index]) + { + document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + } + + w3c_slidy.last_width = width; + w3c_slidy.last_height = height; + + // force reflow to work around Mozilla bug + if (w3c_slidy.ns_pos) + { + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.show_slide(slide); + } + + // force correct positioning of toolbar + w3c_slidy.refresh_toolbar(200); + } + }, + + scrolled: function () { + if (w3c_slidy.toolbar && !w3c_slidy.ns_pos && !w3c_slidy.ie7) + { + w3c_slidy.hack_offset = w3c_slidy.scroll_x_offset(); + // hide toolbar + w3c_slidy.toolbar.style.display = "none"; + + // make it reappear later + if (w3c_slidy.scrollhack == 0 && !w3c_slidy.view_all) + { + setTimeout(function () {w3c_slidy.show_toolbar(); }, 1000); + w3c_slidy.scrollhack = 1; + } + } + }, + + hide_toolbar: function () { + w3c_slidy.add_class(w3c_slidy.toolbar, "hidden"); + window.focus(); + }, + + // used to ensure IE refreshes toolbar in correct position + refresh_toolbar: function (interval) { + if (!w3c_slidy.ns_pos && !w3c_slidy.ie7) + { + w3c_slidy.hide_toolbar(); + setTimeout(function () {w3c_slidy.show_toolbar(); }, interval); + } + }, + + // restores toolbar after short delay + show_toolbar: function () { + if (w3c_slidy.want_toolbar) + { + w3c_slidy.toolbar.style.display = "block"; + + if (!w3c_slidy.ns_pos) + { + // adjust position to allow for scrolling + var xoffset = w3c_slidy.scroll_x_offset(); + w3c_slidy.toolbar.style.left = xoffset; + w3c_slidy.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 + + w3c_slidy.toolbar.style.bottom = 0; //bottom; + } + + w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden"); + } + + w3c_slidy.scrollhack = 0; + + + // set the keyboard focus to the help link on the + // toolbar to ensure that document has the focus + // IE doesn't always work with window.focus() + // and this hack has benefit of Enter for help + + try + { + if (!w3c_slidy.opera) + w3c_slidy.help_anchor.focus(); + } + catch (e) + { + } + }, + +// invoked via F key + toggle_toolbar: function () { + if (!w3c_slidy.view_all) + { + if (w3c_slidy.has_class(w3c_slidy.toolbar, "hidden")) + { + w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden") + w3c_slidy.want_toolbar = 1; + } + else + { + w3c_slidy.add_class(w3c_slidy.toolbar, "hidden") + w3c_slidy.want_toolbar = 0; + } + } + }, + + scroll_x_offset: function () { + 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; + }, + + scroll_y_offset: function () { + 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; + }, + + // looking for a way to determine height of slide content + // the slide itself is set to the height of the window + optimize_font_size: function () { + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + + //var dh = documentHeight(); //getDocHeight(document); + var dh = slide.scrollHeight; + var wh = getWindowHeight(); + var u = 100 * dh / wh; + + alert("window utilization = " + u + "% (doc " + + dh + " win " + wh + ")"); + }, + + // from document object + get_doc_height: function (doc) { + if (!doc) + doc = document; + + if (doc && doc.body && doc.body.offsetHeight) + return doc.body.offsetHeight; // ns/gecko syntax + + if (doc && doc.body && doc.body.scrollHeight) + return doc.body.scrollHeight; + + alert("couldn't determine document height"); + }, + + get_window_height: function () { + if ( typeof( window.innerHeight ) == 'number' ) + return window.innerHeight; // Non IE browser + + if (document.documentElement && document.documentElement.clientHeight) + return document.documentElement.clientHeight; // IE6 + + if (document.body && document.body.clientHeight) + return document.body.clientHeight; // IE4 + }, + + document_height: function () { + var sh, oh; + + sh = document.body.scrollHeight; + oh = document.body.offsetHeight; + + if (sh && oh) + { + return (sh > oh ? sh : oh); + } + + // no idea! + return 0; + }, + + smaller: function () { + if (w3c_slidy.size_index > 0) + { + --w3c_slidy.size_index; + } + + w3c_slidy.toolbar.style.display = "none"; + document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.show_slide(slide); + setTimeout(function () {w3c_slidy.show_toolbar(); }, 50); + }, + + bigger: function () { + if (w3c_slidy.size_index < w3c_slidy.sizes.length - 1) + { + ++w3c_slidy.size_index; + } + + w3c_slidy.toolbar.style.display = "none"; + document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index]; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + w3c_slidy.hide_slide(slide); + w3c_slidy.show_slide(slide); + setTimeout(function () {w3c_slidy.show_toolbar(); }, 50); + }, + + // 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 + adjust_object_dimensions: function (width, height) { + for( var i = 0; i < w3c_slidy.objects.length; i++ ) + { + var obj = this.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); + } + } + } + }, + + // needed for Opera to inhibit default behavior + // since Opera delivers keyPress even if keyDown + // was cancelled + key_press: function (event) { + if (!event) + event = window.event; + + if (!w3c_slidy.key_wanted) + return w3c_slidy.cancel(event); + + return true; + }, + + // See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes + key_down: function (event) { + var key, target, tag; + + w3c_slidy.key_wanted = true; + + if (!event) + event = window.event; + + // kludge around NS/IE differences + if (window.event) + { + key = window.event.keyCode; + target = window.event.srcElement; + } + else if (event.which) + { + key = event.which; + target = event.target; + } + else + return true; // Yikes! unknown browser + + // ignore event if key value is zero + // as for alt on Opera and Konqueror + if (!key) + return true; + + // avoid interfering with keystroke + // behavior for non-slidy chrome elements + if (!w3c_slidy.slidy_chrome(target) && + w3c_slidy.special_element(target)) + return true; + + // check for concurrent control/command/alt key + // but are these only present on mouse events? + + if (event.ctrlKey || event.altKey || event.metaKey) + return true; + + // dismiss table of contents if visible + if (w3c_slidy.is_shown_toc() && key != 9 && key != 16 && key != 38 && key != 40) + { + w3c_slidy.hide_table_of_contents(true); + + if (key == 27 || key == 84 || key == 67) + return w3c_slidy.cancel(event); + } + + if (key == 34) // Page Down + { + w3c_slidy.next_slide(!event.shiftKey); + return w3c_slidy.cancel(event); + } + else if (key == 33) // Page Up + { + w3c_slidy.previous_slide(!event.shiftKey); + return w3c_slidy.cancel(event); + } + else if (key == 32) // space bar + { + w3c_slidy.next_slide(true); + return w3c_slidy.cancel(event); + } + else if (key == 37) // Left arrow + { + if (w3c_slidy.view_all) + return true; + + w3c_slidy.previous_slide(false); + return w3c_slidy.cancel(event); + } + else if (key == 36) // Home + { + w3c_slidy.first_slide(); + return w3c_slidy.cancel(event); + } + else if (key == 35) // End + { + w3c_slidy.last_slide(); + return w3c_slidy.cancel(event); + } + else if (key == 39) // Right arrow + { + if (w3c_slidy.view_all) + return true; + + w3c_slidy.next_slide(false); + return w3c_slidy.cancel(event); + } + else if (key == 13) // Enter + { + if (w3c_slidy.outline) + { + if (w3c_slidy.outline.visible) + w3c_slidy.fold(w3c_slidy.outline); + else + w3c_slidy.unfold(w3c_slidy.outline); + + return w3c_slidy.cancel(event); + } + } + else if (key == 188) // < for smaller fonts + { + w3c_slidy.smaller(); + return w3c_slidy.cancel(event); + } + else if (key == 190) // > for larger fonts + { + w3c_slidy.bigger(); + return w3c_slidy.cancel(event); + } + else if (key == 189 || key == 109) // - for smaller fonts + { + w3c_slidy.smaller(); + return w3c_slidy.cancel(event); + } + else if (key == 187 || key == 191 || key == 107) // = + for larger fonts + { + w3c_slidy.bigger(); + return w3c_slidy.cancel(event); + } + else if (key == 83) // S for smaller fonts + { + w3c_slidy.smaller(); + return w3c_slidy.cancel(event); + } + else if (key == 66) // B for larger fonts + { + w3c_slidy.bigger(); + return w3c_slidy.cancel(event); + } + else if (key == 90) // Z for last slide + { + w3c_slidy.last_slide(); + return w3c_slidy.cancel(event); + } + else if (key == 70) // F for toggle toolbar + { + w3c_slidy.toggle_toolbar(); + return w3c_slidy.cancel(event); + } + else if (key == 65) // A for toggle view single/all slides + { + w3c_slidy.toggle_view(); + return w3c_slidy.cancel(event); + } + else if (key == 75) // toggle action of left click for next page + { + w3c_slidy.mouse_click_enabled = !w3c_slidy.mouse_click_enabled; + var alert_msg = (w3c_slidy.mouse_click_enabled ? + "enabled" : "disabled") + " mouse click advance"; + + alert(w3c_slidy.localize(alert_msg)); + return w3c_slidy.cancel(event); + } + else if (key == 84 || key == 67) // T or C for table of contents + { + if (w3c_slidy.toc) + w3c_slidy.toggle_table_of_contents(); + + return w3c_slidy.cancel(event); + } + else if (key == 72) // H for help + { + window.location = w3c_slidy.help_page; + return w3c_slidy.cancel(event); + } + //else alert("key code is "+ key); + + return true; + }, + + // safe for both text/html and application/xhtml+xml + create_element: function (name) { + if (this.xhtml && (typeof document.createElementNS != 'undefined')) + return document.createElementNS("http://www.w3.org/1999/xhtml", name) + + return document.createElement(name); + }, + + get_element_style: function (elem, IEStyleProp, CSSStyleProp) { + if (elem.currentStyle) + { + return elem.currentStyle[IEStyleProp]; + } + else if (window.getComputedStyle) + { + var compStyle = window.getComputedStyle(elem, ""); + return compStyle.getPropertyValue(CSSStyleProp); + } + return ""; + }, + + // the string str is a whitespace separated list of tokens + // test if str contains a particular token, e.g. "slide" + has_token: function (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; + }, + + get_class_list: function (element) { + if (typeof element.className != 'undefined') + return element.className; + + return element.getAttribute("class"); + }, + + has_class: function (element, name) { + if (element.nodeType != 1) + return false; + + var regexp = new RegExp("(^| )" + name + "\W*"); + + if (typeof element.className != 'undefined') + return regexp.test(element.className); + + return regexp.test(element.getAttribute("class")); + }, + + remove_class: function (element, name) { + var regexp = new RegExp("(^| )" + name + "\W*"); + var clsval = ""; + + if (typeof element.className != 'undefined') + { + clsval = element.className; + + if (clsval) + { + clsval = clsval.replace(regexp, ""); + element.className = clsval; + } + } + else + { + clsval = element.getAttribute("class"); + + if (clsval) + { + clsval = clsval.replace(regexp, ""); + element.setAttribute("class", clsval); + } + } + }, + + add_class: function (element, name) { + if (!this.has_class(element, name)) + { + if (typeof element.className != 'undefined') + element.className += " " + name; + else + { + var clsval = element.getAttribute("class"); + clsval = clsval ? clsval + " " + name : name; + element.setAttribute("class", clsval); + } + } + }, + + // 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). + incremental_elements: null, + okay_for_incremental: function (name) { + if (!this.incremental_elements) + { + 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; + this.incremental_elements = inclist; + } + return this.incremental_elements[name.toLowerCase()]; + }, + + next_incremental_item: function (node) { + var br = this.is_xhtml ? "br" : "BR"; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + + for (;;) + { + node = w3c_slidy.next_node(slide, node); + + if (node == null || node.parentNode == null) + break; + + if (node.nodeType == 1) // ELEMENT + { + if (node.nodeName == br) + continue; + + if (w3c_slidy.has_class(node, "incremental") + && w3c_slidy.okay_for_incremental(node.nodeName)) + return node; + + if (w3c_slidy.has_class(node.parentNode, "incremental") + && !w3c_slidy.has_class(node, "non-incremental")) + return node; + } + } + + return node; + }, + + previous_incremental_item: function (node) { + var br = this.is_xhtml ? "br" : "BR"; + var slide = w3c_slidy.slides[w3c_slidy.slide_number]; + + for (;;) + { + node = w3c_slidy.previous_node(slide, node); + + if (node == null || node.parentNode == null) + break; + + if (node.nodeType == 1) + { + if (node.nodeName == br) + continue; + + if (w3c_slidy.has_class(node, "incremental") + && w3c_slidy.okay_for_incremental(node.nodeName)) + return node; + + if (w3c_slidy.has_class(node.parentNode, "incremental") + && !w3c_slidy.has_class(node, "non-incremental")) + return node; + } + } + + return node; + }, + + // set visibility for all elements on current slide with + // a parent element with attribute class="incremental" + set_visibility_all_incremental: function (value) { + var node = this.next_incremental_item(null); + + if (value == "hidden") + { + while (node) + { + w3c_slidy.add_class(node, "invisible"); + node = w3c_slidy.next_incremental_item(node); + } + } + else // value == "visible" + { + while (node) + { + w3c_slidy.remove_class(node, "invisible"); + node = w3c_slidy.next_incremental_item(node); + } + } + }, + + // reveal the next hidden item on the slide + // node is null or the node that was last revealed + reveal_next_item: function (node) { + node = w3c_slidy.next_incremental_item(node); + + if (node && node.nodeType == 1) // an element + w3c_slidy.remove_class(node, "invisible"); + + return node; + }, + + // exact inverse of revealNextItem(node) + hide_previous_item: function (node) { + if (node && node.nodeType == 1) // an element + w3c_slidy.add_class(node, "invisible"); + + return this.previous_incremental_item(node); + }, + + // left to right traversal of root's content + next_node: function (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 || node == root) + break; + + if (node && node.nextSibling) + return node.nextSibling; + } + + return null; + }, + + // right to left traversal of root's content + previous_node: function (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; + }, + + previous_sibling_element: function (el) { + el = el.previousSibling; + + while (el && el.nodeType != 1) + el = el.previousSibling; + + return el; + }, + + next_sibling_element: function (el) { + el = el.nextSibling; + + while (el && el.nodeType != 1) + el = el.nextSibling; + + return el; + }, + + first_child_element: function (el) { + var node; + + for (node = el.firstChild; node; node = node.nextSibling) + { + if (node.nodeType == 1) + break; + } + + return node; + }, + + first_tag: function (element, tag) { + var node; + + if (!this.is_xhtml) + tag = tag.toUpperCase(); + + for (node = element.firstChild; node; node = node.nextSibling) + { + if (node.nodeType == 1 && node.nodeName == tag) + break; + } + + return node; + }, + + hide_selection: function () { + if (window.getSelection) // Firefox, Chromium, Safari, Opera + { + var selection = window.getSelection(); + + if (selection.rangeCount > 0) + { + var range = selection.getRangeAt(0); + range.collapse (false); + } + } + else // Internet Explorer + { + var textRange = document.selection.createRange (); + textRange.collapse (false); + } + }, + + get_selected_text: function () { + try + { + if (window.getSelection) + return window.getSelection().toString(); + + if (document.getSelection) + return document.getSelection().toString(); + + if (document.selection) + return document.selection.createRange().text; + } + catch (e) + { + } + + return ""; + }, + + // make note of length of selected text + // as this evaluates to zero in click event + mouse_button_up: function (e) { + w3c_slidy.selected_text_len = w3c_slidy.get_selected_text().length; + }, + + // right mouse button click is reserved for context menus + // it is more reliable to detect rightclick than leftclick + mouse_button_click: function (e) { + var rightclick = false; + var leftclick = false; + var middleclick = 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) // all browsers except IE + { + leftclick = (e.which == 1); + middleclick = (e.which == 2); + rightclick = (e.which == 3); + } + else if (e.button) + { + // Konqueror gives 1 for left, 4 for middle + // IE6 gives 0 for left and not 1 as I expected + + if (e.button == 4) + middleclick = true; + + // all browsers agree on 2 for right button + rightclick = (e.button == 2); + } + else + leftclick = true; + + if (w3c_slidy.selected_text_len > 0) + { + w3c_slidy.stop_propagation(e); + e.cancel = true; + e.returnValue = false; + return false; + } + + // dismiss table of contents + w3c_slidy.hide_table_of_contents(false); + + // check if target is something that probably want's clicks + // e.g. a, embed, object, input, textarea, select, option + var tag = target.nodeName.toLowerCase(); + + if (w3c_slidy.mouse_click_enabled && leftclick && + !w3c_slidy.special_element(target) && + !target.onclick) + { + w3c_slidy.next_slide(true); + w3c_slidy.stop_propagation(e); + e.cancel = true; + e.returnValue = false; + return false; + } + + return true; + }, + + special_element: function (e) { + var tag = e.nodeName.toLowerCase(); + + return e.onkeydown || + e.onclick || + tag == "a" || + tag == "embed" || + tag == "object" || + tag == "video" || + tag == "audio" || + tag == "input" || + tag == "textarea" || + tag == "select" || + tag == "option"; + }, + + slidy_chrome: function (el) { + while (el) + { + if (el == w3c_slidy.toc || + el == w3c_slidy.toolbar || + w3c_slidy.has_class(el, "outline")) + return true; + + el = el.parentNode; + } + + return false; + }, + + get_key: function (e) + { + var key; + + // kludge around NS/IE differences + if (typeof window.event != "undefined") + key = window.event.keyCode; + else if (e.which) + key = e.which; + + return key; + }, + + get_target: function (e) { + var target; + + if (!e) + e = window.event; + + if (e.target) + target = e.target; + else if (e.srcElement) + target = e.srcElement; + + if (target.nodeType != 1) + target = target.parentNode; + + return target; + }, + + // does display property provide correct defaults? + is_block: function (elem) { + var tag = elem.nodeName.toLowerCase(); + + return tag == "ol" || tag == "ul" || tag == "p" || + tag == "li" || tag == "table" || tag == "pre" || + tag == "h1" || tag == "h2" || tag == "h3" || + tag == "h4" || tag == "h5" || tag == "h6" || + tag == "blockquote" || tag == "address"; + }, + + add_listener: function (element, event, handler) { + if (window.addEventListener) + element.addEventListener(event, handler, false); + else + element.attachEvent("on"+event, handler); + }, + + // used to prevent event propagation from field controls + stop_propagation: function (event) { + event = event ? event : window.event; + event.cancelBubble = true; // for IE + + if (event.stopPropagation) + event.stopPropagation(); + + return true; + }, + + cancel: function (event) { + if (event) + { + event.cancel = true; + event.returnValue = false; + + if (event.preventDefault) + event.preventDefault(); + } + + w3c_slidy.key_wanted = false; + return false; + }, + +// for each language define an associative array +// and also the help text which is longer + + strings_es: { + "slide":"pág.", + "help?":"Ayuda", + "contents?":"Índice", + "table of contents":"tabla de contenidos", + "Table of Contents":"Tabla de Contenidos", + "restart presentation":"Reiniciar presentación", + "restart?":"Inicio" + }, + help_es: + "Utilice el ratón, barra espaciadora, teclas Izda/Dcha, " + + "o Re pág y Av pág. Use S y B para cambiar el tamaño de fuente.", + + strings_ca: { + "slide":"pàg..", + "help?":"Ajuda", + "contents?":"Índex", + "table of contents":"taula de continguts", + "Table of Contents":"Taula de Continguts", + "restart presentation":"Reiniciar presentació", + "restart?":"Inici" + }, + help_ca: + "Utilitzi el ratolí, barra espaiadora, tecles Esq./Dta. " + + "o Re pàg y Av pàg. Usi S i B per canviar grandària de font.", + + strings_cs: { + "slide":"snímek", + "help?":"nápověda", + "contents?":"obsah", + "table of contents":"obsah prezentace", + "Table of Contents":"Obsah prezentace", + "restart presentation":"znovu spustit prezentaci", + "restart?":"restart" + }, + help_cs: + "Prezentaci můžete procházet pomocí kliknutí myši, mezerníku, " + + "šipek vlevo a vpravo nebo kláves PageUp a PageDown. Písmo se " + + "dá zvětšit a zmenšit pomocí kláves B a S.", + + strings_nl: { + "slide":"pagina", + "help?":"Help?", + "contents?":"Inhoud?", + "table of contents":"inhoudsopgave", + "Table of Contents":"Inhoudsopgave", + "restart presentation":"herstart presentatie", + "restart?":"Herstart?" + }, + help_nl: + "Navigeer d.m.v. het muis, spatiebar, Links/Rechts toetsen, " + + "of PgUp en PgDn. Gebruik S en B om de karaktergrootte te veranderen.", + + strings_de: { + "slide":"Seite", + "help?":"Hilfe", + "contents?":"Übersicht", + "table of contents":"Inhaltsverzeichnis", + "Table of Contents":"Inhaltsverzeichnis", + "restart presentation":"Präsentation neu starten", + "restart?":"Neustart" + }, + help_de: + "Benutzen Sie die Maus, Leerschlag, die Cursortasten links/rechts oder " + + "Page up/Page Down zum Wechseln der Seiten und S und B für die Schriftgrösse.", + + strings_pl: { + "slide":"slajd", + "help?":"pomoc?", + "contents?":"spis treści?", + "table of contents":"spis treści", + "Table of Contents":"Spis Treści", + "restart presentation":"Restartuj prezentację", + "restart?":"restart?" + }, + help_pl: + "Zmieniaj slajdy klikając myszą, naciskając spację, strzałki lewo/prawo" + + "lub PgUp / PgDn. Użyj klawiszy S i B, aby zmienić rozmiar czczionki.", + + strings_fr: { + "slide":"page", + "help?":"Aide", + "contents?":"Index", + "table of contents":"table des matières", + "Table of Contents":"Table des matières", + "restart presentation":"Recommencer l'exposé", + "restart?":"Début" + }, + help_fr: + "Naviguez avec la souris, la barre d'espace, les flèches " + + "gauche/droite ou les touches Pg Up, Pg Dn. Utilisez " + + "les touches S et B pour modifier la taille de la police.", + + strings_hu: { + "slide":"oldal", + "help?":"segítség", + "contents?":"tartalom", + "table of contents":"tartalomjegyzék", + "Table of Contents":"Tartalomjegyzék", + "restart presentation":"bemutató újraindítása", + "restart?":"újraindítás" + }, + help_hu: + "Az oldalak közti lépkedéshez kattintson az egérrel, vagy " + + "használja a szóköz, a bal, vagy a jobb nyíl, illetve a Page Down, " + + "Page Up billentyűket. Az S és a B billentyűkkel változtathatja " + + "a szöveg méretét.", + + strings_it: { + "slide":"pag.", + "help?":"Aiuto", + "contents?":"Indice", + "table of contents":"indice", + "Table of Contents":"Indice", + "restart presentation":"Ricominciare la presentazione", + "restart?":"Inizio" + }, + help_it: + "Navigare con mouse, barra spazio, frecce sinistra/destra o " + + "PgUp e PgDn. Usare S e B per cambiare la dimensione dei caratteri.", + + strings_el: { + "slide":"σελίδα", + "help?":"βοήθεια;", + "contents?":"περιεχόμενα;", + "table of contents":"πίνακας περιεχομένων", + "Table of Contents":"Πίνακας Περιεχομένων", + "restart presentation":"επανεκκίνηση παρουσίασης", + "restart?":"επανεκκίνηση;" + }, + help_el: + "Πλοηγηθείτε με το κλίκ του ποντικιού, το space, τα βέλη αριστερά/δεξιά, " + + "ή Page Up και Page Down. Χρησιμοποιήστε τα πλήκτρα S και B για να αλλάξετε " + + "το μέγεθος της γραμματοσειράς.", + + strings_ja: { + "slide":"スライド", + "help?":"ヘルプ", + "contents?":"目次", + "table of contents":"目次を表示", + "Table of Contents":"目次", + "restart presentation":"最初から再生", + "restart?":"最初から" + }, + help_ja: + "マウス左クリック ・ スペース ・ 左右キー " + + "または Page Up ・ Page Downで操作, S ・ Bでフォントサイズ変更", + + strings_zh: { + "slide":"幻灯片", + "help?":"帮助?", + "contents?":"内容?", + "table of contents":"目录", + "Table of Contents":"目录", + "restart presentation":"重新启动展示", + "restart?":"重新启动?" + }, + help_zh: + "用鼠标点击, 空格条, 左右箭头, Pg Up 和 Pg Dn 导航. " + + "用 S, B 改变字体大小.", + + strings_ru: { + "slide":"слайд", + "help?":"помощь?", + "contents?":"содержание?", + "table of contents":"оглавление", + "Table of Contents":"Оглавление", + "restart presentation":"перезапустить презентацию", + "restart?":"перезапуск?" + }, + help_ru: + "Перемещайтесь кликая мышкой, используя клавишу пробел, стрелки" + + "влево/вправо или Pg Up и Pg Dn. Клавиши S и B меняют размер шрифта.", + + strings_sv: { + "slide":"sida", + "help?":"hjälp", + "contents?":"innehåll", + "table of contents":"innehållsförteckning", + "Table of Contents":"Innehållsförteckning", + "restart presentation":"visa presentationen från början", + "restart?":"börja om" + }, + help_sv: + "Bläddra med ett klick med vänstra musknappen, mellanslagstangenten, " + + "vänster- och högerpiltangenterna eller tangenterna Pg Up, Pg Dn. " + + "Använd tangenterna S och B för att ändra textens storlek.", + + strings: { }, + + localize: function (src) { + if (src == "") + return src; + + // try full language code, e.g. en-US + var s, lookup = w3c_slidy.strings[w3c_slidy.lang]; + + if (lookup) + { + s = lookup[src]; + + if (s) + return s; + } + + // strip country code suffix, e.g. + // try en if undefined for en-US + var lg = w3c_slidy.lang.split("-"); + + if (lg.length > 1) + { + lookup = w3c_slidy.strings[lg[0]]; + + if (lookup) + { + s = lookup[src]; + + if (s) + return s; + } + } + + // otherwise string as is + return src; + }, + + init_localization: function () { + var i18n = w3c_slidy; + var help_text = w3c_slidy.help_text; + + // each such language array is declared in the localize array + // this is used as in w3c_slidy.localize("foo"); + this.strings = { + "es":this.strings_es, + "ca":this.strings_ca, + "cs":this.strings_cs, + "nl":this.strings_nl, + "de":this.strings_de, + "pl":this.strings_pl, + "fr":this.strings_fr, + "hu":this.strings_hu, + "it":this.strings_it, + "el":this.strings_el, + "jp":this.strings_ja, + "zh":this.strings_zh, + "ru":this.strings_ru, + "sv":this.strings_sv + }, + + i18n.strings_es[help_text] = i18n.help_es; + i18n.strings_ca[help_text] = i18n.help_ca; + i18n.strings_cs[help_text] = i18n.help_cs; + i18n.strings_nl[help_text] = i18n.help_nl; + i18n.strings_de[help_text] = i18n.help_de; + i18n.strings_pl[help_text] = i18n.help_pl; + i18n.strings_fr[help_text] = i18n.help_fr; + i18n.strings_hu[help_text] = i18n.help_hu; + i18n.strings_it[help_text] = i18n.help_it; + i18n.strings_el[help_text] = i18n.help_el; + i18n.strings_ja[help_text] = i18n.help_ja; + i18n.strings_zh[help_text] = i18n.help_zh; + i18n.strings_ru[help_text] = i18n.help_ru; + i18n.strings_sv[help_text] = i18n.help_sv; + + w3c_slidy.lang = document.body.parentNode.getAttribute("lang"); + + if (!w3c_slidy.lang) + w3c_slidy.lang = document.body.parentNode.getAttribute("xml:lang"); + + if (!w3c_slidy.lang) + w3c_slidy.lang = "en"; + } +}; + +// hack for back button behavior +if (w3c_slidy.ie6 || w3c_slidy.ie7) +{ + document.write(""); +} + +// attach event listeners for initialization +w3c_slidy.set_up(); + +// hide the slides as soon as body element is available +// to reduce annoying screen mess before the onload event +setTimeout(w3c_slidy.hide_slides, 50); + diff --git a/jenkins/scripts/slidy.js.gz b/jenkins/scripts/slidy.js.gz new file mode 100644 index 0000000000000000000000000000000000000000..35746cb3d747e3597c504e7bee2e76e2891e499b GIT binary patch literal 12797 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

{s9zCkx}+(g P8 + +ForceType 'text/html; charset=utf-8' + + + + + +ForceType 'application/xhtml+xml; charset=utf-8' + + + + + +ForceType 'text/css; charset=utf-8' + + + + + +ForceType 'text/javascript; charset=utf-8' + + +mkdir diff --git a/jenkins/styles/openstack.css b/jenkins/styles/openstack.css new file mode 100644 index 0000000..add7cd0 --- /dev/null +++ b/jenkins/styles/openstack.css @@ -0,0 +1,441 @@ +/* openstack.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 +*/ +/* Based on w3c-blue.css */ + +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.slide.titlepage { + text-align: center; +} + +div.slide.titlepage h1 { + padding-top: 40%; +} + +div.slide { + z-index: 20; + margin: 0 0 0 0; + padding: 0; + border-width: 0; + top: 0; + bottom: 0; + left: 0; + right: 0; + line-height: 120%; + background-color: transparent; +} + +div.background { + z-index: 1; + position: absolute; + vertical-align: bottom; + left: 0; + right: 0; + top: 0; + bottom: auto; + height: 4.1em; + padding: 0 0 0 0.2em; + margin: 0 0 0 0; + border-width: 0; +} + +div.background img { + height: 4em; +} + +/* this rule is hidden from IE which doesn't support + selector */ +div.slide + div[class].slide { page-break-before: always;} + +div.slide h1 { + padding-left: 8em; + padding-top: 1em; + margin-bottom: 0; + margin-top: -0.05em; + margin-left: 0; + margin-right: 0; + height: 1.6em; + font-size: 160%; + line-height: 1.1em; +} + +div.slide h1 a { + text-decoration: none; +} + +div.slide h1 a:link { + color: white; + text-decoration: none; +} + +div.slide h1 a:visited { + color: white; + text-decoration: none; +} + +div.slide h1 a:hover { + color: white; + text-decoration: underline; +} + +div.slide h1 a:active { + color: red; + text-decoration: underline; +} + +#head-icon { + margin-top: 0.5em; + margin-bottom: 0; + margin-left: 0; + margin-right: 1em; + border-width: 0; + z-index: 2; + float: left; +} + +/* the next two classes support vertical and horizontal centering */ + +div.vbox { + float: left; + height: 40%; + width: 50%; + margin-top: -240px; +} +div.hbox { + width:60%; + margin-top: 0; + margin-left:auto; + margin-right:auto; + height: 60%; + border:1px solid silver; + background:#F0F0F0; + overflow:auto; + text-align:left; + clear:both; +} + +/* styling for named background */ +div.background.slanty { + z-index: 2; + bottom: 0; + height: 100%; + background: transparent; +} + +div.background.slanty img { margin-top: 4em; width: 100%; height: 80% } + +/* the following makes the pre background translucent */ +/* opacity is a CSS3 property but supported by Mozilla family */ +/* filter is an IE specific feature that also requires width */ +div.slide.slanty pre { + width: 93%; /* needed for IE filter to work */ + opacity: .8; + filter: alpha(opacity=80); +} + +img.withBorder { + border: 2px solid #c60; + padding: 4px; +} + +li pre { margin-left: 0; } + +@media print { pre { font-size: 60% } } + +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; } + +div.cover p.explanation { + font-style: italic; + margin-top: 3em; +} + + +.smaller { font-size: smaller } + +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; } +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 } + + +ul li { + list-style: none; + margin: 0.1em 0em 0.6em 0; + padding: 0 0 0 40px; + background: transparent url(../graphics/bullet.png) no-repeat 5px 0.3em; + line-height: 140%; +} + +/* workaround IE's failure to support background on li for print media */ +@media print { ul li { list-style: disc; padding-left: 0; background: none; } } + +ol li { + margin: 0.1em 0em 0.6em 1.5em; + padding: 0 0 0 0px; + line-height: 140%; +} + +li li { + font-size: 85%; + font-style: italic; + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} +li li li { + font-size: 85%; + font-style: normal; + list-style-type: circle; + background: transparent; + padding: 0 0 0 0; +} +li li li li { + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} + +/* rectangular blue bullet + unfold/nofold/fold widget */ + +/* + 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.3em; +} +ol.outline li.unfolded { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.3em; +} +ol.outline li.folded { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.3em; +} +ol.outline li.unfolded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold.gif) no-repeat 0px 0.3em; +} +ol.outline li.folded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.3em; +} + +ul.outline li.nofold { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-nofold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.unfolded { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-fold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.folded { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-unfold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.unfolded:hover { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-fold.gif) no-repeat 5px 0.3em; +} +ul.outline li.folded:hover { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-unfold.gif) no-repeat 5px 0.3em; +} + +li ul.outline li.nofold { + padding: 0 0 0 21px; + background: transparent url(../graphics/nofold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.unfolded { + padding: 0 0 0 21px; + background: transparent url(../graphics/fold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.folded { + padding: 0 0 0 21px; + background: transparent url(../graphics/unfold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.unfolded:hover { + padding: 0 0 0 21px; + background: transparent url(../graphics/fold.gif) no-repeat 5px 0.3em; +} +li ul.outline li.folded:hover { + padding: 0 0 0 21px; + background: transparent url(../graphics/unfold.gif) no-repeat 5px 0.3em; +} + +img.withBorder { + border: 2px solid #c60; + padding: 4px; +} + +div.header { + position: absolute; + z-index: 2; + left: 0; + right: 0; + top: 0; + bottom: auto; + height: 2.95em; + width: 100%; + padding: 0 0 0 0; + margin: 0 0 0 0; + border-width: 0; + border-style: solid; + background-color: #005A9C; + border-bottom-width: thick; + border-bottom-color: #95ABD0; +} + +div.footer { + position: absolute; + z-index: 80; + left: 0; + right: 0; + top: auto; + bottom: 0; + height: 3.5em; + margin: 0; + font-size: 80%; + font-weight: bold; + padding-left: 1em; + padding-right: 0; + padding-top: 0.3em; + padding-bottom: 0; + color: #003366; + background-color: #95ABD0; +} + +/* this is a hack to hide property from IE6 and below */ +div[class="footer"] { + position: fixed; +} + +#hidden-bullet { + visibility: hidden; + display: none; +} + +div.slide.cover { + background-color: white; + padding-top: 0; + padding-right: 0; + padding-left: 3em; + height: 100%; +} + +div.slide.cover h1 { + margin: 0; + padding: 0.5em; + height: auto; +} + +div.slide.cover img.cover { + margin: 1em 0 0 0; + float: right; + padding-bottom: 3em; + width: 50%; + overflow: hidden; +} +/* for Bert as an ardent user of the old W3C slidemaker tool */ + +div.comment { display: none; visibility: hidden } + +@media print { + div.slide h1 { background: transparent; color: black } + div.slide.cover { background: transparent; color: black } + div.slide.cover h1 { background: transparent; color: black } + div.comment { display: block; visibility: visible } +} diff --git a/jenkins/styles/slidy.css b/jenkins/styles/slidy.css new file mode 100644 index 0000000..96e3da7 --- /dev/null +++ b/jenkins/styles/slidy.css @@ -0,0 +1,401 @@ +/* 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; +} + +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/jenkins/styles/w3c-blue.css b/jenkins/styles/w3c-blue.css new file mode 100644 index 0000000..83bd238 --- /dev/null +++ b/jenkins/styles/w3c-blue.css @@ -0,0 +1,493 @@ +/* w3c-blue.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.slide.titlepage { + text-align: center; +} + +div.slide.titlepage h1 { + padding-top: 40%; +} + +div.slide { + z-index: 20; + margin: 0 0 0 0; + padding: 0; + border-width: 0; + top: 0; + bottom: 0; + left: 0; + right: 0; + line-height: 120%; + background-color: transparent; +} + +div.background { + z-index: 1; + position: absolute; + vertical-align: bottom; + left: 0; + right: 0; + top: 0; + bottom: auto; + height: 4.1em; + padding: 0 0 0 0.2em; + margin: 0 0 0 0; + border-width: 0; + background-color: #728ec2; +} + +div.background img { + height: 4em; +} + +/* this rule is hidden from IE which doesn't support + selector */ +div.slide + div[class].slide { page-break-before: always;} + +div.slide h1 { + padding-left: 3em; + padding-right: 3em; + padding-top: 0.1em; + margin-bottom: 0.8em; + margin-top: -0.05em; + margin-left: 0; + margin-right: 0; + min-height: 2.3em; + color: white; + height: 2.2em; + font-size: 160%; + line-height: 1.1em; +} + +div.slide h1 a { + color: white; + text-decoration: none; +} + +div.slide h1 a:link { + color: white; + text-decoration: none; +} + +div.slide h1 a:visited { + color: white; + text-decoration: none; +} + +div.slide h1 a:hover { + color: white; + text-decoration: underline; +} + +div.slide h1 a:active { + color: red; + text-decoration: underline; +} + +#head-icon { + margin-top: 0.5em; + margin-bottom: 0; + margin-left: 0; + margin-right: 1em; + background: #728ec2; + border-width: 0; + height: 3em; + max-width: 3em; + z-index: 2; + float: left; +} + +#head-logo { + margin: 0; + margin-top: 0.25em; + padding-top: 0.25em; + padding-bottom: 0.2em; + padding-left: 0; + padding-right: 0; + height: 3.2em; + width: 4.8em; + float: right; + z-index: 2; + background: #728ec2; +} + +#head-logo-fallback { + margin: 0; + padding: 0; + margin-top: -0.8em; + width: 4.8em; + float: right; + z-index: 2; +} + +/* the next two classes support vertical and horizontal centering */ +div.vbox { + float: left; + height: 40%; + width: 50%; + margin-top: -240px; +} +div.hbox { + width:60%; + margin-top: 0; + margin-left:auto; + margin-right:auto; + height: 60%; + border:1px solid silver; + background:#F0F0F0; + overflow:auto; + text-align:left; + clear:both; +} + +/* styling for named background */ +div.background.slanty { + z-index: 2; + bottom: 0; + height: 100%; + background: transparent; +} + +div.background.slanty img { margin-top: 4em; width: 100%; height: 80% } + +/* the following makes the pre background translucent */ +/* opacity is a CSS3 property but supported by Mozilla family */ +/* filter is an IE specific feature that also requires width */ +div.slide.slanty pre { + width: 93%; /* needed for IE filter to work */ + opacity: .8; + filter: alpha(opacity=80); +} + +img.withBorder { + border: 2px solid #c60; + padding: 4px; +} + +li pre { margin-left: 0; } + +@media print { pre { font-size: 60% } } + +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; } + +div.cover p.explanation { + font-style: italic; + margin-top: 3em; +} + + +.smaller { font-size: smaller } + +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; } +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 } + + +ul li { + list-style: none; + margin: 0.1em 0em 0.6em 0; + padding: 0 0 0 40px; + background: transparent url(../graphics/bullet.png) no-repeat 5px 0.3em; + line-height: 140%; +} + +/* workaround IE's failure to support background on li for print media */ +@media print { ul li { list-style: disc; padding-left: 0; background: none; } } + +ol li { + margin: 0.1em 0em 0.6em 1.5em; + padding: 0 0 0 0px; + line-height: 140%; +} + +li li { + font-size: 85%; + font-style: italic; + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} +li li li { + font-size: 85%; + font-style: normal; + list-style-type: circle; + background: transparent; + padding: 0 0 0 0; +} +li li li li { + list-style-type: disc; + background: transparent; + padding: 0 0 0 0; +} + +/* rectangular blue bullet + unfold/nofold/fold widget */ + +/* + 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.3em; +} +ol.outline li.unfolded { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold-dim.gif) no-repeat 0px 0.3em; +} +ol.outline li.folded { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold-dim.gif) no-repeat 0px 0.3em; +} +ol.outline li.unfolded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/fold.gif) no-repeat 0px 0.3em; +} +ol.outline li.folded:hover { + padding: 0 0 0 20px; + background: transparent url(../graphics/unfold.gif) no-repeat 0px 0.3em; +} + +ul.outline li.nofold { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-nofold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.unfolded { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-fold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.folded { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-unfold-dim.gif) no-repeat 5px 0.3em; +} +ul.outline li.unfolded:hover { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-fold.gif) no-repeat 5px 0.3em; +} +ul.outline li.folded:hover { + padding: 0 0 0 52px; + background: transparent url(../graphics/bullet-unfold.gif) no-repeat 5px 0.3em; +} + +li ul.outline li.nofold { + padding: 0 0 0 21px; + background: transparent url(../graphics/nofold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.unfolded { + padding: 0 0 0 21px; + background: transparent url(../graphics/fold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.folded { + padding: 0 0 0 21px; + background: transparent url(../graphics/unfold-dim.gif) no-repeat 5px 0.3em; +} +li ul.outline li.unfolded:hover { + padding: 0 0 0 21px; + background: transparent url(../graphics/fold.gif) no-repeat 5px 0.3em; +} +li ul.outline li.folded:hover { + padding: 0 0 0 21px; + background: transparent url(../graphics/unfold.gif) no-repeat 5px 0.3em; +} + +img.withBorder { + border: 2px solid #c60; + padding: 4px; +} + +div.header { + position: absolute; + z-index: 2; + left: 0; + right: 0; + top: 0; + bottom: auto; + height: 2.95em; + width: 100%; + padding: 0 0 0 0; + margin: 0 0 0 0; + border-width: 0; + border-style: solid; + background-color: #005A9C; + border-bottom-width: thick; + border-bottom-color: #95ABD0; +} + +div.footer { + position: absolute; + z-index: 80; + left: 0; + right: 0; + top: auto; + bottom: 0; + height: 3.5em; + margin: 0; + font-size: 80%; + font-weight: bold; + padding-left: 1em; + padding-right: 0; + padding-top: 0.3em; + padding-bottom: 0; + color: #003366; + background-color: #95ABD0; +} + +/* this is a hack to hide property from IE6 and below */ +div[class="footer"] { + position: fixed; +} + +#hidden-bullet { + visibility: hidden; + display: none; +} + +div.slide.cover { + color: white; + background-color: #728ec2; + padding-top: 0; + padding-right: 0; + padding-left: 3em; + height: 100%; +} + +div.slide.cover h1 { + margin: 0; + padding: 0.5em; + color: white; + height: auto; +} + +div.slide.cover h2 { + color: white; +} + +div.slide.cover a { + color: white; +} + +div.slide.cover a:visited { color: white } +div.slide.cover a:link { color: white } +div.slide.cover a:hover { color: yellow; text-decoration: underline } +div.slide.cover a:active { color: yellow; text-decoration: underline } + +div.slide.cover a:hover, div.slide.cover a:active { + color: yellow; text-decoration: underline; +} + +div.slide.cover img.cover { + margin: 0 0 0 0; + float: right; + padding-bottom: 4em; + width: 50%; + overflow: hidden; +} + +div.slide.cover a:hover, div.slide.cover a:active { + color: yellow; text-decoration: underline; +} + +/* for Bert as an ardent user of the old W3C slidemaker tool */ + +div.comment { display: none; visibility: hidden } + +@media print { + div.slide h1 { background: transparent; color: black } + div.slide.cover { background: transparent; color: black } + div.slide.cover h1 { background: transparent; color: black } + div.comment { display: block; visibility: visible } +}