dokkit-slides 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. data/History.txt +3 -0
  2. data/Manifest.txt +35 -0
  3. data/README.txt +60 -0
  4. data/Rakefile +21 -0
  5. data/lib/dokkit-slides.rb +56 -0
  6. data/lib/dokkit-slides/environment/slides.rb +20 -0
  7. data/lib/models/slides/Rakefile +6 -0
  8. data/lib/models/slides/doc/data/ui/default/blank.gif +0 -0
  9. data/lib/models/slides/doc/data/ui/default/bodybg.gif +0 -0
  10. data/lib/models/slides/doc/data/ui/default/framing.css +23 -0
  11. data/lib/models/slides/doc/data/ui/default/iepngfix.htc +42 -0
  12. data/lib/models/slides/doc/data/ui/default/opera.css +7 -0
  13. data/lib/models/slides/doc/data/ui/default/outline.css +15 -0
  14. data/lib/models/slides/doc/data/ui/default/pretty.css +86 -0
  15. data/lib/models/slides/doc/data/ui/default/print.css +1 -0
  16. data/lib/models/slides/doc/data/ui/default/s5-core.css +9 -0
  17. data/lib/models/slides/doc/data/ui/default/slides.css +3 -0
  18. data/lib/models/slides/doc/data/ui/default/slides.js +553 -0
  19. data/lib/models/slides/doc/layouts/presentation.html +45 -0
  20. data/lib/models/slides/doc/presentations/COMMON.yaml +4 -0
  21. data/lib/models/slides/doc/presentations/presentation +16 -0
  22. data/lib/models/slides/setup/setup.rb +12 -0
  23. data/tasks/ann.rake +81 -0
  24. data/tasks/bones.rake +21 -0
  25. data/tasks/gem.rake +126 -0
  26. data/tasks/git.rake +41 -0
  27. data/tasks/manifest.rake +49 -0
  28. data/tasks/notes.rake +28 -0
  29. data/tasks/post_load.rake +39 -0
  30. data/tasks/rdoc.rake +51 -0
  31. data/tasks/rubyforge.rake +57 -0
  32. data/tasks/setup.rb +268 -0
  33. data/tasks/spec.rake +55 -0
  34. data/tasks/svn.rake +48 -0
  35. data/tasks/test.rake +38 -0
  36. metadata +106 -0
data/History.txt ADDED
@@ -0,0 +1,3 @@
1
+ == 0.1.0 / 2008-08-19
2
+
3
+ * first release
data/Manifest.txt ADDED
@@ -0,0 +1,35 @@
1
+ History.txt
2
+ Manifest.txt
3
+ README.txt
4
+ Rakefile
5
+ lib/dokkit-slides.rb
6
+ lib/dokkit-slides/environment/slides.rb
7
+ lib/models/slides/Rakefile
8
+ lib/models/slides/doc/data/ui/default/blank.gif
9
+ lib/models/slides/doc/data/ui/default/bodybg.gif
10
+ lib/models/slides/doc/data/ui/default/framing.css
11
+ lib/models/slides/doc/data/ui/default/iepngfix.htc
12
+ lib/models/slides/doc/data/ui/default/opera.css
13
+ lib/models/slides/doc/data/ui/default/outline.css
14
+ lib/models/slides/doc/data/ui/default/pretty.css
15
+ lib/models/slides/doc/data/ui/default/print.css
16
+ lib/models/slides/doc/data/ui/default/s5-core.css
17
+ lib/models/slides/doc/data/ui/default/slides.css
18
+ lib/models/slides/doc/data/ui/default/slides.js
19
+ lib/models/slides/doc/layouts/presentation.html
20
+ lib/models/slides/doc/presentations/COMMON.yaml
21
+ lib/models/slides/doc/presentations/presentation
22
+ lib/models/slides/setup/setup.rb
23
+ tasks/ann.rake
24
+ tasks/bones.rake
25
+ tasks/gem.rake
26
+ tasks/git.rake
27
+ tasks/manifest.rake
28
+ tasks/notes.rake
29
+ tasks/post_load.rake
30
+ tasks/rdoc.rake
31
+ tasks/rubyforge.rake
32
+ tasks/setup.rb
33
+ tasks/spec.rake
34
+ tasks/svn.rake
35
+ tasks/test.rake
data/README.txt ADDED
@@ -0,0 +1,60 @@
1
+ dokkit-slides
2
+ by Andrea Fazzi
3
+ http://dokkit.rubyforge.org/
4
+
5
+ == DESCRIPTION:
6
+
7
+ dokkit-slides is a dokkit documentation model for the generation of html S5 presentation.
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * based on S5 format
12
+ * uses haml markup
13
+
14
+ == SYNOPSIS:
15
+
16
+ To create a dokkit-slides environment run:
17
+
18
+ dokkit -m dokkit-slides my_presentation
19
+
20
+ == EXAMPLE:
21
+
22
+ Create the environment:
23
+
24
+ dokkit -m dokkit-slides my_presentation
25
+
26
+ Enter in my_presentation directory and run rake:
27
+
28
+ cd my_presentation
29
+ rake
30
+
31
+ Modify my_presentation/doc/presentations/presentation to fit your
32
+ needs.
33
+
34
+ See http://meyerweb.com/eric/tools/s5/ for further informations about S5.
35
+
36
+ == REQUIREMENTS:
37
+
38
+ * dokkit >= 0.5.0
39
+ * haml
40
+
41
+ == INSTALL:
42
+
43
+ sudo gem install dokkit-slides
44
+
45
+ == LICENSE:
46
+
47
+ Copyright (c) 2008 Andrea Fazzi
48
+
49
+ This program is free software: you can redistribute it and/or modify
50
+ it under the terms of the GNU General Public License as published by
51
+ the Free Software Foundation, either version 3 of the License, or
52
+ (at your option) any later version.
53
+
54
+ This program is distributed in the hope that it will be useful,
55
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
56
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
57
+ GNU General Public License for more details.
58
+
59
+ You should have received a copy of the GNU General Public License
60
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
data/Rakefile ADDED
@@ -0,0 +1,21 @@
1
+ # Look in the tasks/setup.rb file for the various options that can be
2
+ # configured in this Rakefile. The .rake files in the tasks directory
3
+ # are where the options are used.
4
+
5
+ load 'tasks/setup.rb'
6
+
7
+ ensure_in_path 'lib'
8
+ require 'dokkit-slides'
9
+
10
+ task :default => 'spec:run'
11
+
12
+ PROJ.name = 'dokkit-slides'
13
+ PROJ.authors = 'Andrea Fazzi'
14
+ PROJ.email = 'andrea.fazzi@alca.le.it'
15
+ PROJ.url = 'http://dokkit.rubyforge.org'
16
+ PROJ.rubyforge.name = 'dokkit-slides'
17
+ PROJ.version = DokkitSlides::VERSION
18
+ PROJ.gem.dependencies = [['dokkit', '>= 0.5.0'], 'haml']
19
+ PROJ.spec.opts = %w(--color --format specdoc)
20
+ PROJ.rdoc.exclude << "models/slides"
21
+ # EOF
@@ -0,0 +1,56 @@
1
+ # $Id$
2
+
3
+ # Equivalent to a header guard in C/C++
4
+ # Used to prevent the class/module from being loaded more than once
5
+ unless defined? DokkitSlides
6
+
7
+ module DokkitSlides
8
+
9
+ # :stopdoc:
10
+ VERSION = '0.1.0'
11
+ LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
12
+ PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
13
+ # :startdoc:
14
+
15
+ # Returns the version string for the library.
16
+ #
17
+ def self.version
18
+ VERSION
19
+ end
20
+
21
+ # Returns the library path for the module. If any arguments are given,
22
+ # they will be joined to the end of the libray path using
23
+ # <tt>File.join</tt>.
24
+ #
25
+ def self.libpath( *args )
26
+ args.empty? ? LIBPATH : ::File.join(LIBPATH, *args)
27
+ end
28
+
29
+ # Returns the lpath for the module. If any arguments are given,
30
+ # they will be joined to the end of the path using
31
+ # <tt>File.join</tt>.
32
+ #
33
+ def self.path( *args )
34
+ args.empty? ? PATH : ::File.join(PATH, *args)
35
+ end
36
+
37
+ # Utility method used to rquire all files ending in .rb that lie in the
38
+ # directory below this file that has the same name as the filename passed
39
+ # in. Optionally, a specific _directory_ name can be passed in such that
40
+ # the _filename_ does not have to be equivalent to the directory.
41
+ #
42
+ def self.require_all_libs_relative_to( fname, dir = nil )
43
+ dir ||= ::File.basename(fname, '.*')
44
+ search_me = ::File.expand_path(
45
+ ::File.join(::File.dirname(fname), dir, '**', '*.rb'))
46
+
47
+ Dir.glob(search_me).sort.each {|rb| require rb}
48
+ end
49
+
50
+ end # module DokkitSlides
51
+
52
+ DokkitSlides.require_all_libs_relative_to __FILE__
53
+
54
+ end # unless defined?
55
+
56
+ # EOF
@@ -0,0 +1,20 @@
1
+ require 'rubygems'
2
+ require 'dokkit/environment/basic'
3
+
4
+ module Dokkit
5
+ module Environment
6
+
7
+ def environment(&blk)
8
+ Slides.new(&blk)
9
+ end
10
+
11
+ class Slides < Basic
12
+
13
+ def default_configuration
14
+ super.merge( :document_dir => 'doc/presentations' )
15
+ end
16
+
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,6 @@
1
+
2
+ require 'rake/clean'
3
+ require 'setup/setup'
4
+
5
+ task :clobber => [:clean, 'clean:all']
6
+ task :default => 'render:all'
@@ -0,0 +1,23 @@
1
+ /* The following styles size, place, and layer the slide components.
2
+ Edit these if you want to change the overall slide layout.
3
+ The commented lines can be uncommented (and modified, if necessary)
4
+ to help you with the rearrangement process. */
5
+
6
+ /* target = 1024x768 */
7
+
8
+ div#header, div#footer, .slide {width: 100%; top: 0; left: 0;}
9
+ div#header {top: 0; height: 3em; z-index: 1;}
10
+ div#footer {top: auto; bottom: 0; height: 2.5em; z-index: 5;}
11
+ .slide {top: 0; width: 92%; padding: 3.5em 4% 4%; z-index: 2; list-style: none;}
12
+ div#controls {left: 50%; bottom: 0; width: 50%; z-index: 100;}
13
+ div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
14
+ margin: 0;}
15
+ #currentSlide {position: absolute; width: 10%; left: 45%; bottom: 1em; z-index: 10;}
16
+ html>body #currentSlide {position: fixed;}
17
+
18
+ /*
19
+ div#header {background: #FCC;}
20
+ div#footer {background: #CCF;}
21
+ div#controls {background: #BBD;}
22
+ div#currentSlide {background: #FFC;}
23
+ */
@@ -0,0 +1,42 @@
1
+ <public:component>
2
+ <public:attach event="onpropertychange" onevent="doFix()" />
3
+
4
+ <script>
5
+
6
+ // IE5.5+ PNG Alpha Fix v1.0 by Angus Turnbull http://www.twinhelix.com
7
+ // Free usage permitted as long as this notice remains intact.
8
+
9
+ // This must be a path to a blank image. That's all the configuration you need here.
10
+ var blankImg = 'ui/default/blank.gif';
11
+
12
+ var f = 'DXImageTransform.Microsoft.AlphaImageLoader';
13
+
14
+ function filt(s, m) {
15
+ if (filters[f]) {
16
+ filters[f].enabled = s ? true : false;
17
+ if (s) with (filters[f]) { src = s; sizingMethod = m }
18
+ } else if (s) style.filter = 'progid:'+f+'(src="'+s+'",sizingMethod="'+m+'")';
19
+ }
20
+
21
+ function doFix() {
22
+ if ((parseFloat(navigator.userAgent.match(/MSIE (\S+)/)[1]) < 5.5) ||
23
+ (event && !/(background|src)/.test(event.propertyName))) return;
24
+
25
+ if (tagName == 'IMG') {
26
+ if ((/\.png$/i).test(src)) {
27
+ filt(src, 'image'); // was 'scale'
28
+ src = blankImg;
29
+ } else if (src.indexOf(blankImg) < 0) filt();
30
+ } else if (style.backgroundImage) {
31
+ if (style.backgroundImage.match(/^url[("']+(.*\.png)[)"']+$/i)) {
32
+ var s = RegExp.$1;
33
+ style.backgroundImage = '';
34
+ filt(s, 'crop');
35
+ } else filt();
36
+ }
37
+ }
38
+
39
+ doFix();
40
+
41
+ </script>
42
+ </public:component>
@@ -0,0 +1,7 @@
1
+ /* DO NOT CHANGE THESE unless you really want to break Opera Show */
2
+ .slide {
3
+ visibility: visible !important;
4
+ position: static !important;
5
+ page-break-before: always;
6
+ }
7
+ #slide0 {page-break-before: avoid;}
@@ -0,0 +1,15 @@
1
+ /* don't change this unless you want the layout stuff to show up in the outline view! */
2
+
3
+ .layout div, #footer *, #controlForm * {display: none;}
4
+ #footer, #controls, #controlForm, #navLinks, #toggle {
5
+ display: block; visibility: visible; margin: 0; padding: 0;}
6
+ #toggle {float: right; padding: 0.5em;}
7
+ html>body #toggle {position: fixed; top: 0; right: 0;}
8
+
9
+ /* making the outline look pretty-ish */
10
+
11
+ #slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;}
12
+ #slide0 h1 {padding-top: 1.5em;}
13
+ .slide h1 {margin: 1.5em 0 0; padding-top: 0.25em;
14
+ border-top: 1px solid #888; border-bottom: 1px solid #AAA;}
15
+ #toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;}
@@ -0,0 +1,86 @@
1
+ /* Following are the presentation styles -- edit away! */
2
+
3
+ body {background: #FFF url(bodybg.gif) -16px 0 no-repeat; color: #000; font-size: 2em;}
4
+ :link, :visited {text-decoration: none; color: #00C;}
5
+ #controls :active {color: #88A !important;}
6
+ #controls :focus {outline: 1px dotted #227;}
7
+ h1, h2, h3, h4 {font-size: 100%; margin: 0; padding: 0; font-weight: inherit;}
8
+ ul, pre {margin: 0; line-height: 1em;}
9
+ html, body {margin: 0; padding: 0;}
10
+
11
+ blockquote, q {font-style: italic;}
12
+ blockquote {padding: 0 2em 0.5em; margin: 0 1.5em 0.5em; text-align: center; font-size: 1em;}
13
+ blockquote p {margin: 0;}
14
+ blockquote i {font-style: normal;}
15
+ blockquote b {display: block; margin-top: 0.5em; font-weight: normal; font-size: smaller; font-style: normal;}
16
+ blockquote b i {font-style: italic;}
17
+
18
+ kbd {font-weight: bold; font-size: 1em;}
19
+ sup {font-size: smaller; line-height: 1px;}
20
+
21
+ .slide code {padding: 2px 0.25em; font-weight: bold; color: #533;}
22
+ .slide code.bad, code del {color: red;}
23
+ .slide code.old {color: silver;}
24
+ .slide pre {padding: 0; margin: 0.25em 0 0.5em 0.5em; color: #533; font-size: 90%;}
25
+ .slide pre code {display: block;}
26
+ .slide ul {margin-left: 5%; margin-right: 7%; list-style: disc;}
27
+ .slide li {margin-top: 0.75em; margin-right: 0;}
28
+ .slide ul ul {line-height: 1;}
29
+ .slide ul ul li {margin: .2em; font-size: 85%; list-style: square;}
30
+ .slide img.leader {display: block; margin: 0 auto;}
31
+
32
+ div#header, div#footer {background: #005; color: #AAB;
33
+ font-family: Verdana, Helvetica, sans-serif;}
34
+ div#header {background: #005 url(bodybg.gif) -16px 0 no-repeat;
35
+ line-height: 1px;}
36
+ div#footer {font-size: 0.5em; font-weight: bold; padding: 1em 0;}
37
+ #footer h1, #footer h2 {display: block; padding: 0 1em;}
38
+ #footer h2 {font-style: italic;}
39
+
40
+ div.long {font-size: 0.75em;}
41
+ .slide h1 {position: absolute; top: 0.7em; left: 87px; z-index: 1;
42
+ margin: 0; padding: 0.3em 0 0 50px; white-space: nowrap;
43
+ font: bold 150%/1em Helvetica, sans-serif; text-transform: capitalize;
44
+ color: #DDE; background: #005;}
45
+ .slide h3 {font-size: 130%;}
46
+ h1 abbr {font-variant: small-caps;}
47
+
48
+ div#controls {position: absolute; left: 50%; bottom: 0;
49
+ width: 50%;
50
+ text-align: right; font: bold 0.9em Verdana, Helvetica, sans-serif;}
51
+ html>body div#controls {position: fixed; padding: 0 0 1em 0;
52
+ top: auto;}
53
+ div#controls form {position: absolute; bottom: 0; right: 0; width: 100%;
54
+ margin: 0; padding: 0;}
55
+ #controls #navLinks a {padding: 0; margin: 0 0.5em;
56
+ background: #005; border: none; color: #779;
57
+ cursor: pointer;}
58
+ #controls #navList {height: 1em;}
59
+ #controls #navList #jumplist {position: absolute; bottom: 0; right: 0; background: #DDD; color: #227;}
60
+
61
+ #currentSlide {text-align: center; font-size: 0.5em; color: #449;}
62
+
63
+ #slide0 {padding-top: 3.5em; font-size: 90%;}
64
+ #slide0 h1 {position: static; margin: 1em 0 0; padding: 0;
65
+ font: bold 2em Helvetica, sans-serif; white-space: normal;
66
+ color: #000; background: transparent;}
67
+ #slide0 h2 {font: bold italic 1em Helvetica, sans-serif; margin: 0.25em;}
68
+ #slide0 h3 {margin-top: 1.5em; font-size: 1.5em;}
69
+ #slide0 h4 {margin-top: 0; font-size: 1em;}
70
+
71
+ ul.urls {list-style: none; display: inline; margin: 0;}
72
+ .urls li {display: inline; margin: 0;}
73
+ .note {display: none;}
74
+ .external {border-bottom: 1px dotted gray;}
75
+ html>body .external {border-bottom: none;}
76
+ .external:after {content: " \274F"; font-size: smaller; color: #77B;}
77
+
78
+ .incremental, .incremental *, .incremental *:after {color: #DDE; visibility: visible;}
79
+ img.incremental {visibility: hidden;}
80
+ .slide .current {color: #B02;}
81
+
82
+
83
+ /* diagnostics
84
+
85
+ li:after {content: " [" attr(class) "]"; color: #F88;}
86
+ */
@@ -0,0 +1 @@
1
+ /* The following rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */
@@ -0,0 +1,9 @@
1
+ /* Do not edit or override these styles! The system will likely break if you do. */
2
+
3
+ div#header, div#footer, div#controls, .slide {position: absolute;}
4
+ html>body div#header, html>body div#footer,
5
+ html>body div#controls, html>body .slide {position: fixed;}
6
+ .handout {display: none;}
7
+ .layout {display: block;}
8
+ .slide, .hideme, .incremental {visibility: hidden;}
9
+ #slide0 {visibility: visible;}
@@ -0,0 +1,3 @@
1
+ @import url(s5-core.css); /* required to make the slide show run at all */
2
+ @import url(framing.css); /* sets basic placement and size of slide components */
3
+ @import url(pretty.css); /* stuff that makes the slides look better than blah */
@@ -0,0 +1,553 @@
1
+ // S5 v1.1 slides.js -- released into the Public Domain
2
+ //
3
+ // Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information
4
+ // about all the wonderful and talented contributors to this code!
5
+
6
+ var undef;
7
+ var slideCSS = '';
8
+ var snum = 0;
9
+ var smax = 1;
10
+ var incpos = 0;
11
+ var number = undef;
12
+ var s5mode = true;
13
+ var defaultView = 'slideshow';
14
+ var controlVis = 'visible';
15
+
16
+ var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
17
+ var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
18
+ var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
19
+
20
+ function hasClass(object, className) {
21
+ if (!object.className) return false;
22
+ return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
23
+ }
24
+
25
+ function hasValue(object, value) {
26
+ if (!object) return false;
27
+ return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
28
+ }
29
+
30
+ function removeClass(object,className) {
31
+ if (!object) return;
32
+ object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
33
+ }
34
+
35
+ function addClass(object,className) {
36
+ if (!object || hasClass(object, className)) return;
37
+ if (object.className) {
38
+ object.className += ' '+className;
39
+ } else {
40
+ object.className = className;
41
+ }
42
+ }
43
+
44
+ function GetElementsWithClassName(elementName,className) {
45
+ var allElements = document.getElementsByTagName(elementName);
46
+ var elemColl = new Array();
47
+ for (var i = 0; i< allElements.length; i++) {
48
+ if (hasClass(allElements[i], className)) {
49
+ elemColl[elemColl.length] = allElements[i];
50
+ }
51
+ }
52
+ return elemColl;
53
+ }
54
+
55
+ function isParentOrSelf(element, id) {
56
+ if (element == null || element.nodeName=='BODY') return false;
57
+ else if (element.id == id) return true;
58
+ else return isParentOrSelf(element.parentNode, id);
59
+ }
60
+
61
+ function nodeValue(node) {
62
+ var result = "";
63
+ if (node.nodeType == 1) {
64
+ var children = node.childNodes;
65
+ for (var i = 0; i < children.length; ++i) {
66
+ result += nodeValue(children[i]);
67
+ }
68
+ }
69
+ else if (node.nodeType == 3) {
70
+ result = node.nodeValue;
71
+ }
72
+ return(result);
73
+ }
74
+
75
+ function slideLabel() {
76
+ var slideColl = GetElementsWithClassName('*','slide');
77
+ var list = document.getElementById('jumplist');
78
+ smax = slideColl.length;
79
+ for (var n = 0; n < smax; n++) {
80
+ var obj = slideColl[n];
81
+
82
+ var did = 'slide' + n.toString();
83
+ obj.setAttribute('id',did);
84
+ if (isOp) continue;
85
+
86
+ var otext = '';
87
+ var menu = obj.firstChild;
88
+ if (!menu) continue; // to cope with empty slides
89
+ while (menu && menu.nodeType == 3) {
90
+ menu = menu.nextSibling;
91
+ }
92
+ if (!menu) continue; // to cope with slides with only text nodes
93
+
94
+ var menunodes = menu.childNodes;
95
+ for (var o = 0; o < menunodes.length; o++) {
96
+ otext += nodeValue(menunodes[o]);
97
+ }
98
+ list.options[list.length] = new Option(n + ' : ' + otext, n);
99
+ }
100
+ }
101
+
102
+ function currentSlide() {
103
+ var cs;
104
+ if (document.getElementById) {
105
+ cs = document.getElementById('currentSlide');
106
+ } else {
107
+ cs = document.currentSlide;
108
+ }
109
+ cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
110
+ '<span id="csSep">\/<\/span> ' +
111
+ '<span id="csTotal">' + (smax-1) + '<\/span>';
112
+ if (snum == 0) {
113
+ cs.style.visibility = 'hidden';
114
+ } else {
115
+ cs.style.visibility = 'visible';
116
+ }
117
+ }
118
+
119
+ function go(step) {
120
+ if (document.getElementById('slideProj').disabled || step == 0) return;
121
+ var jl = document.getElementById('jumplist');
122
+ var cid = 'slide' + snum;
123
+ var ce = document.getElementById(cid);
124
+ if (incrementals[snum].length > 0) {
125
+ for (var i = 0; i < incrementals[snum].length; i++) {
126
+ removeClass(incrementals[snum][i], 'current');
127
+ removeClass(incrementals[snum][i], 'incremental');
128
+ }
129
+ }
130
+ if (step != 'j') {
131
+ snum += step;
132
+ lmax = smax - 1;
133
+ if (snum > lmax) snum = lmax;
134
+ if (snum < 0) snum = 0;
135
+ } else
136
+ snum = parseInt(jl.value);
137
+ var nid = 'slide' + snum;
138
+ var ne = document.getElementById(nid);
139
+ if (!ne) {
140
+ ne = document.getElementById('slide0');
141
+ snum = 0;
142
+ }
143
+ if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
144
+ if (incrementals[snum].length > 0 && incpos == 0) {
145
+ for (var i = 0; i < incrementals[snum].length; i++) {
146
+ if (hasClass(incrementals[snum][i], 'current'))
147
+ incpos = i + 1;
148
+ else
149
+ addClass(incrementals[snum][i], 'incremental');
150
+ }
151
+ }
152
+ if (incrementals[snum].length > 0 && incpos > 0)
153
+ addClass(incrementals[snum][incpos - 1], 'current');
154
+ ce.style.visibility = 'hidden';
155
+ ne.style.visibility = 'visible';
156
+ jl.selectedIndex = snum;
157
+ currentSlide();
158
+ number = 0;
159
+ }
160
+
161
+ function goTo(target) {
162
+ if (target >= smax || target == snum) return;
163
+ go(target - snum);
164
+ }
165
+
166
+ function subgo(step) {
167
+ if (step > 0) {
168
+ removeClass(incrementals[snum][incpos - 1],'current');
169
+ removeClass(incrementals[snum][incpos], 'incremental');
170
+ addClass(incrementals[snum][incpos],'current');
171
+ incpos++;
172
+ } else {
173
+ incpos--;
174
+ removeClass(incrementals[snum][incpos],'current');
175
+ addClass(incrementals[snum][incpos], 'incremental');
176
+ addClass(incrementals[snum][incpos - 1],'current');
177
+ }
178
+ }
179
+
180
+ function toggle() {
181
+ var slideColl = GetElementsWithClassName('*','slide');
182
+ var slides = document.getElementById('slideProj');
183
+ var outline = document.getElementById('outlineStyle');
184
+ if (!slides.disabled) {
185
+ slides.disabled = true;
186
+ outline.disabled = false;
187
+ s5mode = false;
188
+ fontSize('1em');
189
+ for (var n = 0; n < smax; n++) {
190
+ var slide = slideColl[n];
191
+ slide.style.visibility = 'visible';
192
+ }
193
+ } else {
194
+ slides.disabled = false;
195
+ outline.disabled = true;
196
+ s5mode = true;
197
+ fontScale();
198
+ for (var n = 0; n < smax; n++) {
199
+ var slide = slideColl[n];
200
+ slide.style.visibility = 'hidden';
201
+ }
202
+ slideColl[snum].style.visibility = 'visible';
203
+ }
204
+ }
205
+
206
+ function showHide(action) {
207
+ var obj = GetElementsWithClassName('*','hideme')[0];
208
+ switch (action) {
209
+ case 's': obj.style.visibility = 'visible'; break;
210
+ case 'h': obj.style.visibility = 'hidden'; break;
211
+ case 'k':
212
+ if (obj.style.visibility != 'visible') {
213
+ obj.style.visibility = 'visible';
214
+ } else {
215
+ obj.style.visibility = 'hidden';
216
+ }
217
+ break;
218
+ }
219
+ }
220
+
221
+ // 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
222
+ function keys(key) {
223
+ if (!key) {
224
+ key = event;
225
+ key.which = key.keyCode;
226
+ }
227
+ if (key.which == 84) {
228
+ toggle();
229
+ return;
230
+ }
231
+ if (s5mode) {
232
+ switch (key.which) {
233
+ case 10: // return
234
+ case 13: // enter
235
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
236
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
237
+ if(number != undef) {
238
+ goTo(number);
239
+ break;
240
+ }
241
+ case 32: // spacebar
242
+ case 34: // page down
243
+ case 39: // rightkey
244
+ case 40: // downkey
245
+ if(number != undef) {
246
+ go(number);
247
+ } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
248
+ go(1);
249
+ } else {
250
+ subgo(1);
251
+ }
252
+ break;
253
+ case 33: // page up
254
+ case 37: // leftkey
255
+ case 38: // upkey
256
+ if(number != undef) {
257
+ go(-1 * number);
258
+ } else if (!incrementals[snum] || incpos <= 0) {
259
+ go(-1);
260
+ } else {
261
+ subgo(-1);
262
+ }
263
+ break;
264
+ case 36: // home
265
+ goTo(0);
266
+ break;
267
+ case 35: // end
268
+ goTo(smax-1);
269
+ break;
270
+ case 67: // c
271
+ showHide('k');
272
+ break;
273
+ }
274
+ if (key.which < 48 || key.which > 57) {
275
+ number = undef;
276
+ } else {
277
+ if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
278
+ if (key.target && isParentOrSelf(key.target, 'controls')) return;
279
+ number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
280
+ }
281
+ }
282
+ return false;
283
+ }
284
+
285
+ function clicker(e) {
286
+ number = undef;
287
+ var target;
288
+ if (window.event) {
289
+ target = window.event.srcElement;
290
+ e = window.event;
291
+ } else target = e.target;
292
+ if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
293
+ if (!e.which || e.which == 1) {
294
+ if (!incrementals[snum] || incpos >= incrementals[snum].length) {
295
+ go(1);
296
+ } else {
297
+ subgo(1);
298
+ }
299
+ }
300
+ }
301
+
302
+ function findSlide(hash) {
303
+ var target = null;
304
+ var slides = GetElementsWithClassName('*','slide');
305
+ for (var i = 0; i < slides.length; i++) {
306
+ var targetSlide = slides[i];
307
+ if ( (targetSlide.name && targetSlide.name == hash)
308
+ || (targetSlide.id && targetSlide.id == hash) ) {
309
+ target = targetSlide;
310
+ break;
311
+ }
312
+ }
313
+ while(target != null && target.nodeName != 'BODY') {
314
+ if (hasClass(target, 'slide')) {
315
+ return parseInt(target.id.slice(5));
316
+ }
317
+ target = target.parentNode;
318
+ }
319
+ return null;
320
+ }
321
+
322
+ function slideJump() {
323
+ if (window.location.hash == null) return;
324
+ var sregex = /^#slide(\d+)$/;
325
+ var matches = sregex.exec(window.location.hash);
326
+ var dest = null;
327
+ if (matches != null) {
328
+ dest = parseInt(matches[1]);
329
+ } else {
330
+ dest = findSlide(window.location.hash.slice(1));
331
+ }
332
+ if (dest != null)
333
+ go(dest - snum);
334
+ }
335
+
336
+ function fixLinks() {
337
+ var thisUri = window.location.href;
338
+ thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
339
+ var aelements = document.getElementsByTagName('A');
340
+ for (var i = 0; i < aelements.length; i++) {
341
+ var a = aelements[i].href;
342
+ var slideID = a.match('\#slide[0-9]{1,2}');
343
+ if ((slideID) && (slideID[0].slice(0,1) == '#')) {
344
+ var dest = findSlide(slideID[0].slice(1));
345
+ if (dest != null) {
346
+ if (aelements[i].addEventListener) {
347
+ aelements[i].addEventListener("click", new Function("e",
348
+ "if (document.getElementById('slideProj').disabled) return;" +
349
+ "go("+dest+" - snum); " +
350
+ "if (e.preventDefault) e.preventDefault();"), true);
351
+ } else if (aelements[i].attachEvent) {
352
+ aelements[i].attachEvent("onclick", new Function("",
353
+ "if (document.getElementById('slideProj').disabled) return;" +
354
+ "go("+dest+" - snum); " +
355
+ "event.returnValue = false;"));
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+
362
+ function externalLinks() {
363
+ if (!document.getElementsByTagName) return;
364
+ var anchors = document.getElementsByTagName('a');
365
+ for (var i=0; i<anchors.length; i++) {
366
+ var anchor = anchors[i];
367
+ if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
368
+ anchor.target = '_blank';
369
+ addClass(anchor,'external');
370
+ }
371
+ }
372
+ }
373
+
374
+ function createControls() {
375
+ var controlsDiv = document.getElementById("controls");
376
+ if (!controlsDiv) return;
377
+ var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
378
+ var hideDiv, hideList = '';
379
+ if (controlVis == 'hidden') {
380
+ hideDiv = hider;
381
+ } else {
382
+ hideList = hider;
383
+ }
384
+ controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
385
+ '<div id="navLinks">' +
386
+ '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
387
+ '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
388
+ '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
389
+ '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
390
+ '<\/div><\/form>';
391
+ if (controlVis == 'hidden') {
392
+ var hidden = document.getElementById('navLinks');
393
+ } else {
394
+ var hidden = document.getElementById('jumplist');
395
+ }
396
+ addClass(hidden,'hideme');
397
+ }
398
+
399
+ function fontScale() { // causes layout problems in FireFox that get fixed if browser's Reload is used; same may be true of other Gecko-based browsers
400
+ if (!s5mode) return false;
401
+ var vScale = 22; // both yield 32 (after rounding) at 1024x768
402
+ var hScale = 32; // perhaps should auto-calculate based on theme's declared value?
403
+ if (window.innerHeight) {
404
+ var vSize = window.innerHeight;
405
+ var hSize = window.innerWidth;
406
+ } else if (document.documentElement.clientHeight) {
407
+ var vSize = document.documentElement.clientHeight;
408
+ var hSize = document.documentElement.clientWidth;
409
+ } else if (document.body.clientHeight) {
410
+ var vSize = document.body.clientHeight;
411
+ var hSize = document.body.clientWidth;
412
+ } else {
413
+ var vSize = 700; // assuming 1024x768, minus chrome and such
414
+ var hSize = 1024; // these do not account for kiosk mode or Opera Show
415
+ }
416
+ var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
417
+ fontSize(newSize + 'px');
418
+ if (isGe) { // hack to counter incremental reflow bugs
419
+ var obj = document.getElementsByTagName('body')[0];
420
+ obj.style.display = 'none';
421
+ obj.style.display = 'block';
422
+ }
423
+ }
424
+
425
+ function fontSize(value) {
426
+ if (!(s5ss = document.getElementById('s5ss'))) {
427
+ if (!isIE) {
428
+ document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
429
+ s5ss.setAttribute('media','screen, projection');
430
+ s5ss.setAttribute('id','s5ss');
431
+ } else {
432
+ document.createStyleSheet();
433
+ document.s5ss = document.styleSheets[document.styleSheets.length - 1];
434
+ }
435
+ }
436
+ if (!isIE) {
437
+ while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
438
+ s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
439
+ } else {
440
+ document.s5ss.addRule('body','font-size: ' + value + ' !important;');
441
+ }
442
+ }
443
+
444
+ function notOperaFix() {
445
+ slideCSS = document.getElementById('slideProj').href;
446
+ var slides = document.getElementById('slideProj');
447
+ var outline = document.getElementById('outlineStyle');
448
+ slides.setAttribute('media','screen');
449
+ outline.disabled = true;
450
+ if (isGe) {
451
+ slides.setAttribute('href','null'); // Gecko fix
452
+ slides.setAttribute('href',slideCSS); // Gecko fix
453
+ }
454
+ if (isIE && document.styleSheets && document.styleSheets[0]) {
455
+ document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
456
+ document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
457
+ document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
458
+ }
459
+ }
460
+
461
+ function getIncrementals(obj) {
462
+ var incrementals = new Array();
463
+ if (!obj)
464
+ return incrementals;
465
+ var children = obj.childNodes;
466
+ for (var i = 0; i < children.length; i++) {
467
+ var child = children[i];
468
+ if (hasClass(child, 'incremental')) {
469
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
470
+ removeClass(child, 'incremental');
471
+ for (var j = 0; j < child.childNodes.length; j++) {
472
+ if (child.childNodes[j].nodeType == 1) {
473
+ addClass(child.childNodes[j], 'incremental');
474
+ }
475
+ }
476
+ } else {
477
+ incrementals[incrementals.length] = child;
478
+ removeClass(child,'incremental');
479
+ }
480
+ }
481
+ if (hasClass(child, 'show-first')) {
482
+ if (child.nodeName == 'OL' || child.nodeName == 'UL') {
483
+ removeClass(child, 'show-first');
484
+ if (child.childNodes[isGe].nodeType == 1) {
485
+ removeClass(child.childNodes[isGe], 'incremental');
486
+ }
487
+ } else {
488
+ incrementals[incrementals.length] = child;
489
+ }
490
+ }
491
+ incrementals = incrementals.concat(getIncrementals(child));
492
+ }
493
+ return incrementals;
494
+ }
495
+
496
+ function createIncrementals() {
497
+ var incrementals = new Array();
498
+ for (var i = 0; i < smax; i++) {
499
+ incrementals[i] = getIncrementals(document.getElementById('slide'+i));
500
+ }
501
+ return incrementals;
502
+ }
503
+
504
+ function defaultCheck() {
505
+ var allMetas = document.getElementsByTagName('meta');
506
+ for (var i = 0; i< allMetas.length; i++) {
507
+ if (allMetas[i].name == 'defaultView') {
508
+ defaultView = allMetas[i].content;
509
+ }
510
+ if (allMetas[i].name == 'controlVis') {
511
+ controlVis = allMetas[i].content;
512
+ }
513
+ }
514
+ }
515
+
516
+ // Key trap fix, new function body for trap()
517
+ function trap(e) {
518
+ if (!e) {
519
+ e = event;
520
+ e.which = e.keyCode;
521
+ }
522
+ try {
523
+ modifierKey = e.ctrlKey || e.altKey || e.metaKey;
524
+ }
525
+ catch(e) {
526
+ modifierKey = false;
527
+ }
528
+ return modifierKey || e.which == 0;
529
+ }
530
+
531
+ function startup() {
532
+ defaultCheck();
533
+ if (!isOp)
534
+ createControls();
535
+ slideLabel();
536
+ fixLinks();
537
+ externalLinks();
538
+ fontScale();
539
+ if (!isOp) {
540
+ notOperaFix();
541
+ incrementals = createIncrementals();
542
+ slideJump();
543
+ if (defaultView == 'outline') {
544
+ toggle();
545
+ }
546
+ document.onkeyup = keys;
547
+ document.onkeypress = trap;
548
+ document.onclick = clicker;
549
+ }
550
+ }
551
+
552
+ window.onload = startup;
553
+ window.onresize = function(){setTimeout('fontScale()', 50);}