[1fa2099] | 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);} |
---|