1 | // S5 v1.2a1 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 s5NotesWindow;
|
---|
17 | var s5NotesWindowLoaded = false;
|
---|
18 | var previousSlide = 0;
|
---|
19 | var presentationStart = new Date();
|
---|
20 | var slideStart = new Date();
|
---|
21 |
|
---|
22 | var countdown = {
|
---|
23 | timer: 0,
|
---|
24 | state: 'pause',
|
---|
25 | start: new Date(),
|
---|
26 | end: 0,
|
---|
27 | remaining: 0
|
---|
28 | };
|
---|
29 |
|
---|
30 |
|
---|
31 | var isIE = navigator.appName == 'Microsoft Internet Explorer' && navigator.userAgent.indexOf('Opera') < 1 ? 1 : 0;
|
---|
32 | var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
|
---|
33 | var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
|
---|
34 |
|
---|
35 | function hasClass(object, className) {
|
---|
36 | if (!object.className) return false;
|
---|
37 | return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
|
---|
38 | }
|
---|
39 |
|
---|
40 | function hasValue(object, value) {
|
---|
41 | if (!object) return false;
|
---|
42 | return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
|
---|
43 | }
|
---|
44 |
|
---|
45 | function removeClass(object,className) {
|
---|
46 | if (!object || !hasClass(object,className)) return;
|
---|
47 | object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
|
---|
48 | }
|
---|
49 |
|
---|
50 | function addClass(object,className) {
|
---|
51 | if (!object || hasClass(object, className)) return;
|
---|
52 | if (object.className) {
|
---|
53 | object.className += ' '+className;
|
---|
54 | } else {
|
---|
55 | object.className = className;
|
---|
56 | }
|
---|
57 | }
|
---|
58 |
|
---|
59 | function GetElementsWithClassName(elementName,className) {
|
---|
60 | var allElements = document.getElementsByTagName(elementName);
|
---|
61 | var elemColl = new Array();
|
---|
62 | for (var i = 0; i< allElements.length; i++) {
|
---|
63 | if (hasClass(allElements[i], className)) {
|
---|
64 | elemColl[elemColl.length] = allElements[i];
|
---|
65 | }
|
---|
66 | }
|
---|
67 | return elemColl;
|
---|
68 | }
|
---|
69 |
|
---|
70 | function isParentOrSelf(element, id) {
|
---|
71 | if (element == null || element.nodeName=='BODY') return false;
|
---|
72 | else if (element.id == id) return true;
|
---|
73 | else return isParentOrSelf(element.parentNode, id);
|
---|
74 | }
|
---|
75 |
|
---|
76 | function nodeValue(node) {
|
---|
77 | var result = "";
|
---|
78 | if (node.nodeType == 1) {
|
---|
79 | var children = node.childNodes;
|
---|
80 | for (var i = 0; i < children.length; ++i) {
|
---|
81 | result += nodeValue(children[i]);
|
---|
82 | }
|
---|
83 | }
|
---|
84 | else if (node.nodeType == 3) {
|
---|
85 | result = node.nodeValue;
|
---|
86 | }
|
---|
87 | return(result);
|
---|
88 | }
|
---|
89 |
|
---|
90 | function slideLabel() {
|
---|
91 | var slideColl = GetElementsWithClassName('*','slide');
|
---|
92 | var list = document.getElementById('jumplist');
|
---|
93 | smax = slideColl.length;
|
---|
94 | for (var n = 0; n < smax; n++) {
|
---|
95 | var obj = slideColl[n];
|
---|
96 |
|
---|
97 | var did = 'slide' + n.toString();
|
---|
98 | obj.setAttribute('id',did);
|
---|
99 |
|
---|
100 | // if (isOp) continue; // Opera fix (hallvord)
|
---|
101 |
|
---|
102 | var otext = '';
|
---|
103 | var menu = obj.firstChild;
|
---|
104 | if (!menu) continue; // to cope with empty slides
|
---|
105 | while (menu && menu.nodeType == 3) {
|
---|
106 | menu = menu.nextSibling;
|
---|
107 | }
|
---|
108 | if (!menu) continue; // to cope with slides with only text nodes
|
---|
109 |
|
---|
110 | var menunodes = menu.childNodes;
|
---|
111 | for (var o = 0; o < menunodes.length; o++) {
|
---|
112 | otext += nodeValue(menunodes[o]);
|
---|
113 | }
|
---|
114 | list.options[list.length] = new Option(n + ' : ' + otext, n);
|
---|
115 | }
|
---|
116 | }
|
---|
117 |
|
---|
118 | function currentSlide() {
|
---|
119 | var cs;
|
---|
120 | if (document.getElementById) {
|
---|
121 | cs = document.getElementById('currentSlide');
|
---|
122 | } else {
|
---|
123 | cs = document.currentSlide;
|
---|
124 | }
|
---|
125 | cs.innerHTML = '<a id="plink" href="">' +
|
---|
126 | '<span id="csHere">' + snum + '<\/span> ' +
|
---|
127 | '<span id="csSep">\/<\/span> ' +
|
---|
128 | '<span id="csTotal">' + (smax-1) + '<\/span>' +
|
---|
129 | '<\/a>'
|
---|
130 | ;
|
---|
131 | if (snum == 0) {
|
---|
132 | cs.style.visibility = 'hidden';
|
---|
133 | } else {
|
---|
134 | cs.style.visibility = 'visible';
|
---|
135 | }
|
---|
136 | }
|
---|
137 |
|
---|
138 | function go(step) {
|
---|
139 | if (document.getElementById('slideProj').disabled || step == 0) return;
|
---|
140 | var jl = document.getElementById('jumplist');
|
---|
141 | var cid = 'slide' + snum;
|
---|
142 | var ce = document.getElementById(cid);
|
---|
143 | if (incrementals[snum].length > 0) {
|
---|
144 | for (var i = 0; i < incrementals[snum].length; i++) {
|
---|
145 | removeClass(incrementals[snum][i], 'current');
|
---|
146 | removeClass(incrementals[snum][i], 'incremental');
|
---|
147 | }
|
---|
148 | }
|
---|
149 | if (step != 'j') {
|
---|
150 | snum += step;
|
---|
151 | lmax = smax - 1;
|
---|
152 | if (snum > lmax) snum = lmax;
|
---|
153 | if (snum < 0) snum = 0;
|
---|
154 | } else
|
---|
155 | snum = parseInt(jl.value);
|
---|
156 | var nid = 'slide' + snum;
|
---|
157 | var ne = document.getElementById(nid);
|
---|
158 | if (!ne) {
|
---|
159 | ne = document.getElementById('slide0');
|
---|
160 | snum = 0;
|
---|
161 | }
|
---|
162 | if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
|
---|
163 | if (incrementals[snum].length > 0 && incpos == 0) {
|
---|
164 | for (var i = 0; i < incrementals[snum].length; i++) {
|
---|
165 | if (hasClass(incrementals[snum][i], 'current'))
|
---|
166 | incpos = i + 1;
|
---|
167 | else
|
---|
168 | addClass(incrementals[snum][i], 'incremental');
|
---|
169 | }
|
---|
170 | }
|
---|
171 | if (incrementals[snum].length > 0 && incpos > 0)
|
---|
172 | addClass(incrementals[snum][incpos - 1], 'current');
|
---|
173 | if (isOp) { //hallvord
|
---|
174 | location.hash = nid;
|
---|
175 | } else {
|
---|
176 | ce.style.visibility = 'hidden';
|
---|
177 | ne.style.visibility = 'visible';
|
---|
178 | } // /hallvord
|
---|
179 | jl.selectedIndex = snum;
|
---|
180 | currentSlide();
|
---|
181 | loadNote();
|
---|
182 | permaLink();
|
---|
183 | number = undef;
|
---|
184 | }
|
---|
185 |
|
---|
186 | function goTo(target) {
|
---|
187 | if (target >= smax || target == snum) return;
|
---|
188 | go(target - snum);
|
---|
189 | }
|
---|
190 |
|
---|
191 | function subgo(step) {
|
---|
192 | if (step > 0) {
|
---|
193 | removeClass(incrementals[snum][incpos - 1],'current');
|
---|
194 | removeClass(incrementals[snum][incpos], 'incremental');
|
---|
195 | addClass(incrementals[snum][incpos],'current');
|
---|
196 | incpos++;
|
---|
197 | } else {
|
---|
198 | incpos--;
|
---|
199 | removeClass(incrementals[snum][incpos],'current');
|
---|
200 | addClass(incrementals[snum][incpos], 'incremental');
|
---|
201 | addClass(incrementals[snum][incpos - 1],'current');
|
---|
202 | }
|
---|
203 | loadNote();
|
---|
204 | }
|
---|
205 |
|
---|
206 | function toggle() {
|
---|
207 | var slideColl = GetElementsWithClassName('*','slide');
|
---|
208 | var slides = document.getElementById('slideProj');
|
---|
209 | var outline = document.getElementById('outlineStyle');
|
---|
210 | if (!slides.disabled) {
|
---|
211 | slides.disabled = true;
|
---|
212 | outline.disabled = false;
|
---|
213 | s5mode = false;
|
---|
214 | fontSize('1em');
|
---|
215 | for (var n = 0; n < smax; n++) {
|
---|
216 | var slide = slideColl[n];
|
---|
217 | slide.style.visibility = 'visible';
|
---|
218 | }
|
---|
219 | } else {
|
---|
220 | slides.disabled = false;
|
---|
221 | outline.disabled = true;
|
---|
222 | s5mode = true;
|
---|
223 | fontScale();
|
---|
224 | for (var n = 0; n < smax; n++) {
|
---|
225 | var slide = slideColl[n];
|
---|
226 | slide.style.visibility = 'hidden';
|
---|
227 | }
|
---|
228 | slideColl[snum].style.visibility = 'visible';
|
---|
229 | }
|
---|
230 | }
|
---|
231 |
|
---|
232 | function showHide(action) {
|
---|
233 | var obj = GetElementsWithClassName('*','hideme')[0];
|
---|
234 | switch (action) {
|
---|
235 | case 's': obj.style.visibility = 'visible'; break;
|
---|
236 | case 'h': obj.style.visibility = 'hidden'; break;
|
---|
237 | case 'k':
|
---|
238 | if (obj.style.visibility != 'visible') {
|
---|
239 | obj.style.visibility = 'visible';
|
---|
240 | } else {
|
---|
241 | obj.style.visibility = 'hidden';
|
---|
242 | }
|
---|
243 | break;
|
---|
244 | }
|
---|
245 | }
|
---|
246 |
|
---|
247 | // 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
|
---|
248 | function keys(key) {
|
---|
249 | if (!key) {
|
---|
250 | key = event;
|
---|
251 | key.which = key.keyCode;
|
---|
252 | }
|
---|
253 | if (key.which == 84) {
|
---|
254 | toggle();
|
---|
255 | return;
|
---|
256 | }
|
---|
257 | if (s5mode) {
|
---|
258 | switch (key.which) {
|
---|
259 | case 10: // return
|
---|
260 | case 13: // enter
|
---|
261 | if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
|
---|
262 | if (key.target && isParentOrSelf(key.target, 'controls')) return;
|
---|
263 | if(number != undef) {
|
---|
264 | goTo(number);
|
---|
265 | break;
|
---|
266 | }
|
---|
267 | case 32: // spacebar
|
---|
268 | case 34: // page down
|
---|
269 | case 39: // rightkey
|
---|
270 | case 40: // downkey
|
---|
271 | if(number != undef) {
|
---|
272 | go(number);
|
---|
273 | } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
|
---|
274 | go(1);
|
---|
275 | } else {
|
---|
276 | subgo(1);
|
---|
277 | }
|
---|
278 | break;
|
---|
279 | case 33: // page up
|
---|
280 | case 37: // leftkey
|
---|
281 | case 38: // upkey
|
---|
282 | if(number != undef) {
|
---|
283 | go(-1 * number);
|
---|
284 | } else if (!incrementals[snum] || incpos <= 0) {
|
---|
285 | go(-1);
|
---|
286 | } else {
|
---|
287 | subgo(-1);
|
---|
288 | }
|
---|
289 | break;
|
---|
290 | case 36: // home
|
---|
291 | goTo(0);
|
---|
292 | break;
|
---|
293 | case 35: // end
|
---|
294 | goTo(smax-1);
|
---|
295 | break;
|
---|
296 | case 67: // c
|
---|
297 | showHide('k');
|
---|
298 | break;
|
---|
299 | case 78: // n
|
---|
300 | createNotesWindow();
|
---|
301 | break;
|
---|
302 | }
|
---|
303 | if (key.which < 48 || key.which > 57) {
|
---|
304 | number = undef;
|
---|
305 | } else {
|
---|
306 | if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
|
---|
307 | if (key.target && isParentOrSelf(key.target, 'controls')) return;
|
---|
308 | number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
|
---|
309 | }
|
---|
310 | }
|
---|
311 | return false;
|
---|
312 | }
|
---|
313 |
|
---|
314 | function clicker(e) {
|
---|
315 | number = undef;
|
---|
316 | var target;
|
---|
317 | if (window.event) {
|
---|
318 | target = window.event.srcElement;
|
---|
319 | e = window.event;
|
---|
320 | } else target = e.target;
|
---|
321 | if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true;
|
---|
322 | if (!e.which || e.which == 1) {
|
---|
323 | if (!incrementals[snum] || incpos >= incrementals[snum].length) {
|
---|
324 | go(1);
|
---|
325 | } else {
|
---|
326 | subgo(1);
|
---|
327 | }
|
---|
328 | }
|
---|
329 | }
|
---|
330 |
|
---|
331 | function findSlide(hash) {
|
---|
332 | var target = null;
|
---|
333 | var slides = GetElementsWithClassName('*','slide');
|
---|
334 | for (var i = 0; i < slides.length; i++) {
|
---|
335 | var targetSlide = slides[i];
|
---|
336 | if ( (targetSlide.name && targetSlide.name == hash)
|
---|
337 | || (targetSlide.id && targetSlide.id == hash) ) {
|
---|
338 | target = targetSlide;
|
---|
339 | break;
|
---|
340 | }
|
---|
341 | }
|
---|
342 | while(target != null && target.nodeName != 'BODY') {
|
---|
343 | if (hasClass(target, 'slide')) {
|
---|
344 | return parseInt(target.id.slice(5));
|
---|
345 | }
|
---|
346 | target = target.parentNode;
|
---|
347 | }
|
---|
348 | return null;
|
---|
349 | }
|
---|
350 |
|
---|
351 | function slideJump() {
|
---|
352 | if (window.location.hash == null) return;
|
---|
353 | var sregex = /^#slide(\d+)$/;
|
---|
354 | var matches = sregex.exec(window.location.hash);
|
---|
355 | var dest = null;
|
---|
356 | if (matches != null) {
|
---|
357 | dest = parseInt(matches[1]);
|
---|
358 | } else {
|
---|
359 | dest = findSlide(window.location.hash.slice(1));
|
---|
360 | }
|
---|
361 | if (dest != null)
|
---|
362 | go(dest - snum);
|
---|
363 | }
|
---|
364 |
|
---|
365 | function fixLinks() {
|
---|
366 | var thisUri = window.location.href;
|
---|
367 | thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
|
---|
368 | var aelements = document.getElementsByTagName('A');
|
---|
369 | for (var i = 0; i < aelements.length; i++) {
|
---|
370 | var a = aelements[i].href;
|
---|
371 | var slideID = a.match('\#slide[0-9]{1,2}');
|
---|
372 | if ((slideID) && (slideID[0].slice(0,1) == '#')) {
|
---|
373 | var dest = findSlide(slideID[0].slice(1));
|
---|
374 | if (dest != null) {
|
---|
375 | if (aelements[i].addEventListener) {
|
---|
376 | aelements[i].addEventListener("click", new Function("e",
|
---|
377 | "if (document.getElementById('slideProj').disabled) return;" +
|
---|
378 | "go("+dest+" - snum); " +
|
---|
379 | "if (e.preventDefault) e.preventDefault();"), true);
|
---|
380 | } else if (aelements[i].attachEvent) {
|
---|
381 | aelements[i].attachEvent("onclick", new Function("",
|
---|
382 | "if (document.getElementById('slideProj').disabled) return;" +
|
---|
383 | "go("+dest+" - snum); " +
|
---|
384 | "event.returnValue = false;"));
|
---|
385 | }
|
---|
386 | }
|
---|
387 | }
|
---|
388 | }
|
---|
389 | }
|
---|
390 |
|
---|
391 | function externalLinks() {
|
---|
392 | if (!document.getElementsByTagName) return;
|
---|
393 | var anchors = document.getElementsByTagName('a');
|
---|
394 | for (var i=0; i<anchors.length; i++) {
|
---|
395 | var anchor = anchors[i];
|
---|
396 | if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
|
---|
397 | anchor.target = '_blank';
|
---|
398 | addClass(anchor,'external');
|
---|
399 | }
|
---|
400 | }
|
---|
401 | }
|
---|
402 |
|
---|
403 | function permaLink() {
|
---|
404 | document.getElementById('plink').href = window.location.pathname + '#slide' + snum;
|
---|
405 | }
|
---|
406 |
|
---|
407 | function createControls() {
|
---|
408 | var controlsDiv = document.getElementById("controls");
|
---|
409 | if (!controlsDiv) return;
|
---|
410 | var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
|
---|
411 | var hideDiv, hideList = '';
|
---|
412 | if (controlVis == 'hidden') {
|
---|
413 | hideDiv = hider;
|
---|
414 | } else {
|
---|
415 | hideList = hider;
|
---|
416 | }
|
---|
417 | controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
|
---|
418 | '<div id="navLinks">' +
|
---|
419 | '<a accesskey="n" id="show-notes" href="javascript:createNotesWindow();" title="Show Notes">≡<\/a>' +
|
---|
420 | '<a accesskey="t" id="toggle" href="javascript:toggle();">Ø<\/a>' +
|
---|
421 | '<a accesskey="z" id="prev" href="javascript:go(-1);">«<\/a>' +
|
---|
422 | '<a accesskey="x" id="next" href="javascript:go(1);">»<\/a>' +
|
---|
423 | '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
|
---|
424 | '<\/div><\/form>';
|
---|
425 | if (controlVis == 'hidden') {
|
---|
426 | var hidden = document.getElementById('navLinks');
|
---|
427 | } else {
|
---|
428 | var hidden = document.getElementById('jumplist');
|
---|
429 | }
|
---|
430 | addClass(hidden,'hideme');
|
---|
431 | }
|
---|
432 |
|
---|
433 | 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
|
---|
434 | if (!s5mode) return false;
|
---|
435 | var vScale = 48; // both yield 16 (the usual browser default) at 1024x768
|
---|
436 | var hScale = 64; // perhaps should auto-calculate based on theme's declared value?
|
---|
437 | if (window.innerHeight) {
|
---|
438 | var vSize = window.innerHeight;
|
---|
439 | var hSize = window.innerWidth;
|
---|
440 | } else if (document.documentElement.clientHeight) {
|
---|
441 | var vSize = document.documentElement.clientHeight;
|
---|
442 | var hSize = document.documentElement.clientWidth;
|
---|
443 | } else if (document.body.clientHeight) {
|
---|
444 | var vSize = document.body.clientHeight;
|
---|
445 | var hSize = document.body.clientWidth;
|
---|
446 | } else {
|
---|
447 | var vSize = 700; // assuming 1024x768, minus chrome and such
|
---|
448 | var hSize = 1024; // these do not account for kiosk mode or Opera Show
|
---|
449 | }
|
---|
450 | var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
|
---|
451 | fontSize(newSize + 'px');
|
---|
452 | if (isGe) { // hack to counter incremental reflow bugs
|
---|
453 | var obj = document.getElementsByTagName('body')[0];
|
---|
454 | obj.style.display = 'none';
|
---|
455 | obj.style.display = 'block';
|
---|
456 | }
|
---|
457 | }
|
---|
458 |
|
---|
459 | function fontSize(value) {
|
---|
460 | if (!(s5ss = document.getElementById('s5ss'))) {
|
---|
461 | if (!document.createStyleSheet) {
|
---|
462 | document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
|
---|
463 | s5ss.setAttribute('media','screen, projection');
|
---|
464 | s5ss.setAttribute('id','s5ss');
|
---|
465 | } else {
|
---|
466 | document.createStyleSheet();
|
---|
467 | document.s5ss = document.styleSheets[document.styleSheets.length - 1];
|
---|
468 | }
|
---|
469 | }
|
---|
470 | if (!(document.s5ss && document.s5ss.addRule)) {
|
---|
471 | while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
|
---|
472 | s5ss.appendChild(document.createTextNode('html {font-size: ' + value + ' !important;}'));
|
---|
473 | } else {
|
---|
474 | document.s5ss.addRule('html','font-size: ' + value + ' !important;');
|
---|
475 | }
|
---|
476 | }
|
---|
477 |
|
---|
478 | function notOperaFix() {
|
---|
479 | slideCSS = document.getElementById('slideProj').href;
|
---|
480 | var slides = document.getElementById('slideProj');
|
---|
481 | var outline = document.getElementById('outlineStyle');
|
---|
482 | slides.setAttribute('media','screen');
|
---|
483 | outline.disabled = true;
|
---|
484 | if (isGe) {
|
---|
485 | slides.setAttribute('href','null'); // Gecko fix
|
---|
486 | slides.setAttribute('href',slideCSS); // Gecko fix
|
---|
487 | }
|
---|
488 | if (isIE && document.styleSheets && document.styleSheets[0]) {
|
---|
489 | document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
|
---|
490 | document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
|
---|
491 | document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
|
---|
492 | }
|
---|
493 | }
|
---|
494 |
|
---|
495 | function getIncrementals(obj) {
|
---|
496 | var incrementals = new Array();
|
---|
497 | if (!obj)
|
---|
498 | return incrementals;
|
---|
499 | var children = obj.childNodes;
|
---|
500 | for (var i = 0; i < children.length; i++) {
|
---|
501 | var child = children[i];
|
---|
502 | if (hasClass(child, 'incremental')) {
|
---|
503 | if (child.nodeName == 'OL' || child.nodeName == 'UL') {
|
---|
504 | removeClass(child, 'incremental');
|
---|
505 | for (var j = 0; j < child.childNodes.length; j++) {
|
---|
506 | if (child.childNodes[j].nodeType == 1) {
|
---|
507 | addClass(child.childNodes[j], 'incremental');
|
---|
508 | }
|
---|
509 | }
|
---|
510 | } else {
|
---|
511 | incrementals[incrementals.length] = child;
|
---|
512 | removeClass(child,'incremental');
|
---|
513 | }
|
---|
514 | }
|
---|
515 | if (hasClass(child, 'show-first')) {
|
---|
516 | if (child.nodeName == 'OL' || child.nodeName == 'UL') {
|
---|
517 | removeClass(child, 'show-first');
|
---|
518 | if (child.childNodes[isGe].nodeType == 1) {
|
---|
519 | removeClass(child.childNodes[isGe], 'incremental');
|
---|
520 | }
|
---|
521 | } else {
|
---|
522 | incrementals[incrementals.length] = child;
|
---|
523 | }
|
---|
524 | }
|
---|
525 | incrementals = incrementals.concat(getIncrementals(child));
|
---|
526 | }
|
---|
527 | return incrementals;
|
---|
528 | }
|
---|
529 |
|
---|
530 | function createIncrementals() {
|
---|
531 | var incrementals = new Array();
|
---|
532 | for (var i = 0; i < smax; i++) {
|
---|
533 | incrementals[i] = getIncrementals(document.getElementById('slide'+i));
|
---|
534 | }
|
---|
535 | return incrementals;
|
---|
536 | }
|
---|
537 |
|
---|
538 | function defaultCheck() {
|
---|
539 | var allMetas = document.getElementsByTagName('meta');
|
---|
540 | for (var i = 0; i< allMetas.length; i++) {
|
---|
541 | if (allMetas[i].name == 'defaultView') {
|
---|
542 | defaultView = allMetas[i].content;
|
---|
543 | }
|
---|
544 | if (allMetas[i].name == 'controlVis') {
|
---|
545 | controlVis = allMetas[i].content;
|
---|
546 | }
|
---|
547 | }
|
---|
548 | }
|
---|
549 |
|
---|
550 | // Key trap fix, new function body for trap()
|
---|
551 | function trap(e) {
|
---|
552 | if (!e) {
|
---|
553 | e = event;
|
---|
554 | e.which = e.keyCode;
|
---|
555 | }
|
---|
556 | try {
|
---|
557 | modifierKey = e.ctrlKey || e.altKey || e.metaKey;
|
---|
558 | }
|
---|
559 | catch(e) {
|
---|
560 | modifierKey = false;
|
---|
561 | }
|
---|
562 | return modifierKey || e.which == 0;
|
---|
563 | }
|
---|
564 |
|
---|
565 | function noteLabel() { // Gives notes id's to match parent slides
|
---|
566 | var notes = GetElementsWithClassName('div','notes');
|
---|
567 | for (var i = 0; i < notes.length; i++) {
|
---|
568 | var note = notes[i];
|
---|
569 | var id = 'note' + note.parentNode.id.substring(5);
|
---|
570 | note.setAttribute('id',id);
|
---|
571 | }
|
---|
572 | resetElapsedSlide();
|
---|
573 | resetRemainingTime();
|
---|
574 | window.setInterval('updateElaspedTime()', 1000);
|
---|
575 | }
|
---|
576 |
|
---|
577 | function createNotesWindow() { // creates a window for our notes
|
---|
578 | if (!s5NotesWindow || s5NotesWindow.closed) { // Create the window if it doesn't exist
|
---|
579 | s5NotesWindowLoaded = false;
|
---|
580 | // Note: Safari has a tendency to ignore window options preferring to default to the settings of the parent window, grr.
|
---|
581 | s5NotesWindow = window.open('ui/s5-notes.html', 's5NotesWindow', 'top=0,left=0');
|
---|
582 | }
|
---|
583 | if (s5NotesWindowLoaded) { // Load the current note if the Note HTML has loaded
|
---|
584 | loadNote();
|
---|
585 | } else { // Keep trying...
|
---|
586 | window.setTimeout('createNotesWindow()', 50);
|
---|
587 | }
|
---|
588 | }
|
---|
589 |
|
---|
590 | function loadNote() {
|
---|
591 | // Loads a note into the note window
|
---|
592 | var notes = nextNotes = '<em class="disclaimer">There are no notes for this slide.</em>';
|
---|
593 | if (document.getElementById('note' + snum)) {
|
---|
594 | notes = document.getElementById('note' + snum).innerHTML;
|
---|
595 | }
|
---|
596 | if (document.getElementById('note' + (snum + 1))) {
|
---|
597 | nextNotes = document.getElementById('note' + (snum + 1)).innerHTML;
|
---|
598 | }
|
---|
599 |
|
---|
600 | var jl = document.getElementById('jumplist');
|
---|
601 | var slideTitle = jl.options[jl.selectedIndex].text.replace(/^\d+\s+:\s+/, '') + ((jl.selectedIndex) ? ' (' + jl.selectedIndex + '/' + (smax - 1) + ')' : '');
|
---|
602 | if (incrementals[snum].length > 0) {
|
---|
603 | // alert('howdy');
|
---|
604 | slideTitle += ' <small>[' + incpos + '/' + incrementals[snum].length + ']</small>';
|
---|
605 | }
|
---|
606 | if (jl.selectedIndex < smax - 1) {
|
---|
607 | var nextTitle = jl.options[jl.selectedIndex + 1].text.replace(/^\d+\s+:\s+/, '') + ((jl.selectedIndex + 1) ? ' (' + (jl.selectedIndex + 1) + '/' + (smax - 1) + ')' : '');
|
---|
608 | } else {
|
---|
609 | var nextTitle = '[end of slide show]';
|
---|
610 | }
|
---|
611 |
|
---|
612 | if (s5NotesWindow && !s5NotesWindow.closed && s5NotesWindow.document) {
|
---|
613 | s5NotesWindow.document.getElementById('slide').innerHTML = slideTitle;
|
---|
614 | s5NotesWindow.document.getElementById('notes').innerHTML = notes;
|
---|
615 | s5NotesWindow.document.getElementById('next').innerHTML = nextTitle;
|
---|
616 | s5NotesWindow.document.getElementById('nextnotes').innerHTML = nextNotes;
|
---|
617 | }
|
---|
618 | resetElapsedSlide();
|
---|
619 | }
|
---|
620 |
|
---|
621 | function minimizeTimer(id) {
|
---|
622 | var obj = s5NotesWindow.document.getElementById(id);
|
---|
623 | if (hasClass(obj,'collapsed')) {
|
---|
624 | removeClass(obj,'collapsed');
|
---|
625 | } else {
|
---|
626 | addClass(obj,'collapsed');
|
---|
627 | }
|
---|
628 | }
|
---|
629 |
|
---|
630 | function resetElapsedTime() {
|
---|
631 | presentationStart = new Date();
|
---|
632 | slideStart = new Date();
|
---|
633 | updateElaspedTime();
|
---|
634 | }
|
---|
635 |
|
---|
636 | function resetElapsedSlide() {
|
---|
637 | if (snum != previousSlide) {
|
---|
638 | slideStart = new Date();
|
---|
639 | previousSlide = snum;
|
---|
640 | updateElaspedTime();
|
---|
641 | }
|
---|
642 | }
|
---|
643 |
|
---|
644 | function updateElaspedTime() {
|
---|
645 | if (!s5NotesWindowLoaded || !s5NotesWindow || s5NotesWindow.closed) return;
|
---|
646 | var now = new Date();
|
---|
647 | var ep = s5NotesWindow.document.getElementById('elapsed-presentation');
|
---|
648 | var es = s5NotesWindow.document.getElementById('elapsed-slide');
|
---|
649 | ep.innerHTML = formatTime(now.valueOf() - presentationStart.valueOf());
|
---|
650 | es.innerHTML = formatTime(now.valueOf() - slideStart.valueOf());
|
---|
651 | }
|
---|
652 |
|
---|
653 | function resetRemainingTime() {
|
---|
654 | if (!s5NotesWindowLoaded || !s5NotesWindow || s5NotesWindow.closed) return;
|
---|
655 | var startField = s5NotesWindow.document.getElementById('startFrom');
|
---|
656 | startFrom = readTime(startField.value);
|
---|
657 | countdown.remaining = startFrom * 60000; // convert to msecs
|
---|
658 | countdown.start = new Date().valueOf();
|
---|
659 | countdown.end = countdown.start + countdown.remaining;
|
---|
660 | var tl = s5NotesWindow.document.getElementById('timeLeft');
|
---|
661 | var timeLeft = formatTime(countdown.remaining);
|
---|
662 | tl.innerHTML = timeLeft;
|
---|
663 | }
|
---|
664 |
|
---|
665 | function updateRemainingTime() {
|
---|
666 | if (!s5NotesWindowLoaded || !s5NotesWindow || s5NotesWindow.closed) return;
|
---|
667 | var tl = s5NotesWindow.document.getElementById('timeLeft');
|
---|
668 | var now = new Date();
|
---|
669 | if (countdown.state == 'run') {
|
---|
670 | countdown.remaining = countdown.end - now;
|
---|
671 | }
|
---|
672 | tl.style.color = '';
|
---|
673 | tl.style.backgroundColor = '';
|
---|
674 | if (countdown.remaining >= 0) {
|
---|
675 | var timeLeft = formatTime(countdown.remaining);
|
---|
676 | removeClass(tl,'overtime');
|
---|
677 | if (countdown.remaining < 300000) {
|
---|
678 | tl.style.color = 'rgb(' + (255-Math.round(countdown.remaining/2000)) + ',0,0)';
|
---|
679 | tl.style.backgroundColor = 'rgb(255,255,' + (Math.round(countdown.remaining/2000)) + ')';
|
---|
680 | }
|
---|
681 | } else {
|
---|
682 | var timeLeft = '-' + formatTime(-countdown.remaining);
|
---|
683 | addClass(tl,'overtime');
|
---|
684 | }
|
---|
685 | tl.innerHTML = timeLeft;
|
---|
686 | }
|
---|
687 |
|
---|
688 | function toggleRemainingTime() {
|
---|
689 | if (countdown.state == 'pause') countdown.state = 'run'; else countdown.state = 'pause';
|
---|
690 | if (countdown.state == 'pause') {
|
---|
691 | window.clearInterval(countdown.timer);
|
---|
692 | }
|
---|
693 | if (countdown.state == 'run') {
|
---|
694 | countdown.start = new Date().valueOf();
|
---|
695 | countdown.end = countdown.start + countdown.remaining;
|
---|
696 | countdown.timer = window.setInterval('updateRemainingTime()', 1000);
|
---|
697 | }
|
---|
698 | }
|
---|
699 |
|
---|
700 | function alterRemainingTime(amt) {
|
---|
701 | var change = amt * 60000; // convert to msecs
|
---|
702 | countdown.end += change;
|
---|
703 | countdown.remaining += change;
|
---|
704 | updateRemainingTime();
|
---|
705 | }
|
---|
706 |
|
---|
707 | function formatTime(msecs) {
|
---|
708 | var time = new Date(msecs);
|
---|
709 |
|
---|
710 | var hrs = time.getUTCHours() + ((time.getUTCDate() -1) * 24); // I doubt anyone will spend more than 24 hours on a presentation or single slide but just in case...
|
---|
711 | hrs = (hrs < 10) ? '0'+hrs : hrs;
|
---|
712 | if (hrs == 'NaN' || isNaN(hrs)) hrs = '--';
|
---|
713 |
|
---|
714 | var min = time.getUTCMinutes();
|
---|
715 | min = (min < 10) ? '0'+min : min;
|
---|
716 | if (min == 'NaN' || isNaN(min)) min = '--';
|
---|
717 |
|
---|
718 | var sec = time.getUTCSeconds();
|
---|
719 | sec = (sec < 10) ? '0'+sec : sec;
|
---|
720 | if (sec == 'NaN' || isNaN(sec)) sec = '--';
|
---|
721 |
|
---|
722 | return hrs + ':' + min + ':' + sec;
|
---|
723 | }
|
---|
724 |
|
---|
725 | function readTime(val) {
|
---|
726 | var sregex = /:/;
|
---|
727 | var matches = sregex.exec(val);
|
---|
728 | if (matches == null) {
|
---|
729 | return val;
|
---|
730 | } else {
|
---|
731 | var times = val.split(':');
|
---|
732 | var hours = parseInt(times[0]);
|
---|
733 | var mins = parseInt(times[1]);
|
---|
734 | var total = (hours * 60) + mins;
|
---|
735 | return total;
|
---|
736 | }
|
---|
737 | }
|
---|
738 |
|
---|
739 | function windowChange() {
|
---|
740 | fontScale();
|
---|
741 | }
|
---|
742 |
|
---|
743 | function startup() {
|
---|
744 | defaultCheck();
|
---|
745 | createControls(); // hallvord
|
---|
746 | slideLabel();
|
---|
747 | incrementals = createIncrementals();
|
---|
748 | noteLabel(); // [SI:060104] must follow slideLabel()
|
---|
749 | loadNote();
|
---|
750 | fixLinks();
|
---|
751 | externalLinks();
|
---|
752 | fontScale();
|
---|
753 | if (!isOp) notOperaFix();
|
---|
754 | slideJump();
|
---|
755 | if (defaultView == 'outline') {
|
---|
756 | toggle();
|
---|
757 | }
|
---|
758 | document.onkeyup = keys;
|
---|
759 | document.onkeypress = trap;
|
---|
760 | document.onclick = clicker;
|
---|
761 | }
|
---|
762 |
|
---|
763 | window.onload = startup;
|
---|
764 | window.onresize = function(){setTimeout('windowChange()',5);} |
---|