Commit | Line | Data |
720accfe |
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);} |