~openerp-community/openobject-server/training

« back to all changes in this revision

Viewing changes to presentation.en/output/s5/default/slides.js

  • Committer: Fabien Pinckaers
  • Date: 2009-08-04 16:14:19 UTC
  • Revision ID: fp@tinyerp.com-20090804161419-vwan9tdtjheeua87
add

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
// S5 v1.1 slides.js -- released into the Public Domain
 
2
// Modified for Docutils (http://docutils.sf.net) by David Goodger
 
3
//
 
4
// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for
 
5
// information about all the wonderful and talented contributors to this code!
 
6
 
 
7
var undef;
 
8
var slideCSS = '';
 
9
var snum = 0;
 
10
var smax = 1;
 
11
var slideIDs = new Array();
 
12
var incpos = 0;
 
13
var number = undef;
 
14
var s5mode = true;
 
15
var defaultView = 'slideshow';
 
16
var controlVis = 'visible';
 
17
 
 
18
var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0;
 
19
var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0;
 
20
var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0;
 
21
 
 
22
function hasClass(object, className) {
 
23
  if (!object.className) return false;
 
24
  return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1);
 
25
}
 
26
 
 
27
function hasValue(object, value) {
 
28
  if (!object) return false;
 
29
  return (object.search('(^|\\s)' + value + '(\\s|$)') != -1);
 
30
}
 
31
 
 
32
function removeClass(object,className) {
 
33
  if (!object) return;
 
34
  object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2);
 
35
}
 
36
 
 
37
function addClass(object,className) {
 
38
  if (!object || hasClass(object, className)) return;
 
39
  if (object.className) {
 
40
    object.className += ' '+className;
 
41
  } else {
 
42
    object.className = className;
 
43
  }
 
44
}
 
45
 
 
46
function GetElementsWithClassName(elementName,className) {
 
47
  var allElements = document.getElementsByTagName(elementName);
 
48
  var elemColl = new Array();
 
49
  for (var i = 0; i< allElements.length; i++) {
 
50
    if (hasClass(allElements[i], className)) {
 
51
      elemColl[elemColl.length] = allElements[i];
 
52
    }
 
53
  }
 
54
  return elemColl;
 
55
}
 
56
 
 
57
function isParentOrSelf(element, id) {
 
58
  if (element == null || element.nodeName=='BODY') return false;
 
59
  else if (element.id == id) return true;
 
60
  else return isParentOrSelf(element.parentNode, id);
 
61
}
 
62
 
 
63
function nodeValue(node) {
 
64
  var result = "";
 
65
  if (node.nodeType == 1) {
 
66
    var children = node.childNodes;
 
67
    for (var i = 0; i < children.length; ++i) {
 
68
      result += nodeValue(children[i]);
 
69
    }
 
70
  }
 
71
  else if (node.nodeType == 3) {
 
72
    result = node.nodeValue;
 
73
  }
 
74
  return(result);
 
75
}
 
76
 
 
77
function slideLabel() {
 
78
  var slideColl = GetElementsWithClassName('*','slide');
 
79
  var list = document.getElementById('jumplist');
 
80
  smax = slideColl.length;
 
81
  for (var n = 0; n < smax; n++) {
 
82
    var obj = slideColl[n];
 
83
 
 
84
    var did = 'slide' + n.toString();
 
85
    if (obj.getAttribute('id')) {
 
86
      slideIDs[n] = obj.getAttribute('id');
 
87
    }
 
88
    else {
 
89
      obj.setAttribute('id',did);
 
90
      slideIDs[n] = did;
 
91
    }
 
92
    if (isOp) continue;
 
93
 
 
94
    var otext = '';
 
95
    var menu = obj.firstChild;
 
96
    if (!menu) continue; // to cope with empty slides
 
97
    while (menu && menu.nodeType == 3) {
 
98
      menu = menu.nextSibling;
 
99
    }
 
100
     if (!menu) continue; // to cope with slides with only text nodes
 
101
 
 
102
    var menunodes = menu.childNodes;
 
103
    for (var o = 0; o < menunodes.length; o++) {
 
104
      otext += nodeValue(menunodes[o]);
 
105
    }
 
106
    list.options[list.length] = new Option(n + ' : '  + otext, n);
 
107
  }
 
108
}
 
109
 
 
110
function currentSlide() {
 
111
  var cs;
 
112
  var footer_nodes;
 
113
  var vis = 'visible';
 
114
  if (document.getElementById) {
 
115
    cs = document.getElementById('currentSlide');
 
116
    footer_nodes = document.getElementById('footer').childNodes;
 
117
  } else {
 
118
    cs = document.currentSlide;
 
119
    footer = document.footer.childNodes;
 
120
  }
 
121
  cs.innerHTML = '<span id="csHere">' + snum + '<\/span> ' +
 
122
    '<span id="csSep">\/<\/span> ' +
 
123
    '<span id="csTotal">' + (smax-1) + '<\/span>';
 
124
  if (snum == 0) {
 
125
    vis = 'hidden';
 
126
  }
 
127
  cs.style.visibility = vis;
 
128
  for (var i = 0; i < footer_nodes.length; i++) {
 
129
    if (footer_nodes[i].nodeType == 1) {
 
130
      footer_nodes[i].style.visibility = vis;
 
131
    }
 
132
  }
 
133
}
 
134
 
 
135
function go(step) {
 
136
  if (document.getElementById('slideProj').disabled || step == 0) return;
 
137
  var jl = document.getElementById('jumplist');
 
138
  var cid = slideIDs[snum];
 
139
  var ce = document.getElementById(cid);
 
140
  if (incrementals[snum].length > 0) {
 
141
    for (var i = 0; i < incrementals[snum].length; i++) {
 
142
      removeClass(incrementals[snum][i], 'current');
 
143
      removeClass(incrementals[snum][i], 'incremental');
 
144
    }
 
145
  }
 
146
  if (step != 'j') {
 
147
    snum += step;
 
148
    lmax = smax - 1;
 
149
    if (snum > lmax) snum = lmax;
 
150
    if (snum < 0) snum = 0;
 
151
  } else
 
152
    snum = parseInt(jl.value);
 
153
  var nid = slideIDs[snum];
 
154
  var ne = document.getElementById(nid);
 
155
  if (!ne) {
 
156
    ne = document.getElementById(slideIDs[0]);
 
157
    snum = 0;
 
158
  }
 
159
  if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;}
 
160
  if (incrementals[snum].length > 0 && incpos == 0) {
 
161
    for (var i = 0; i < incrementals[snum].length; i++) {
 
162
      if (hasClass(incrementals[snum][i], 'current'))
 
163
        incpos = i + 1;
 
164
      else
 
165
        addClass(incrementals[snum][i], 'incremental');
 
166
    }
 
167
  }
 
168
  if (incrementals[snum].length > 0 && incpos > 0)
 
169
    addClass(incrementals[snum][incpos - 1], 'current');
 
170
  ce.style.visibility = 'hidden';
 
171
  ne.style.visibility = 'visible';
 
172
  jl.selectedIndex = snum;
 
173
  currentSlide();
 
174
  number = 0;
 
175
}
 
176
 
 
177
function goTo(target) {
 
178
  if (target >= smax || target == snum) return;
 
179
  go(target - snum);
 
180
}
 
181
 
 
182
function subgo(step) {
 
183
  if (step > 0) {
 
184
    removeClass(incrementals[snum][incpos - 1],'current');
 
185
    removeClass(incrementals[snum][incpos], 'incremental');
 
186
    addClass(incrementals[snum][incpos],'current');
 
187
    incpos++;
 
188
  } else {
 
189
    incpos--;
 
190
    removeClass(incrementals[snum][incpos],'current');
 
191
    addClass(incrementals[snum][incpos], 'incremental');
 
192
    addClass(incrementals[snum][incpos - 1],'current');
 
193
  }
 
194
}
 
195
 
 
196
function toggle() {
 
197
  var slideColl = GetElementsWithClassName('*','slide');
 
198
  var slides = document.getElementById('slideProj');
 
199
  var outline = document.getElementById('outlineStyle');
 
200
  if (!slides.disabled) {
 
201
    slides.disabled = true;
 
202
    outline.disabled = false;
 
203
    s5mode = false;
 
204
    fontSize('1em');
 
205
    for (var n = 0; n < smax; n++) {
 
206
      var slide = slideColl[n];
 
207
      slide.style.visibility = 'visible';
 
208
    }
 
209
  } else {
 
210
    slides.disabled = false;
 
211
    outline.disabled = true;
 
212
    s5mode = true;
 
213
    fontScale();
 
214
    for (var n = 0; n < smax; n++) {
 
215
      var slide = slideColl[n];
 
216
      slide.style.visibility = 'hidden';
 
217
    }
 
218
    slideColl[snum].style.visibility = 'visible';
 
219
  }
 
220
}
 
221
 
 
222
function showHide(action) {
 
223
  var obj = GetElementsWithClassName('*','hideme')[0];
 
224
  switch (action) {
 
225
  case 's': {
 
226
    obj.style.visibility = 'visible';
 
227
  }
 
228
  break;
 
229
  case 'h': {
 
230
    //obj.style.visibility = 'hidden';
 
231
  }
 
232
  break;
 
233
  case 'k': {
 
234
    if (obj.style.visibility != 'visible') {
 
235
      obj.style.visibility = 'visible';
 
236
    } else {
 
237
      //obj.style.visibility = 'hidden';
 
238
    }
 
239
  }
 
240
  break;
 
241
  }
 
242
}
 
243
 
 
244
// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/)
 
245
function keys(key) {
 
246
  if (!key) {
 
247
    key = event;
 
248
    key.which = key.keyCode;
 
249
  }
 
250
  if (key.which == 84) {
 
251
    toggle();
 
252
    return;
 
253
  }
 
254
  if (s5mode) {
 
255
    switch (key.which) {
 
256
      case 10: // return
 
257
      case 13: // enter
 
258
        if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
 
259
        if (key.target && isParentOrSelf(key.target, 'controls')) return;
 
260
        if(number != undef) {
 
261
          goTo(number);
 
262
          break;
 
263
        }
 
264
      case 32: // spacebar
 
265
      case 34: // page down
 
266
      case 39: // rightkey
 
267
      case 40: // downkey
 
268
        if(number != undef) {
 
269
          go(number);
 
270
        } else if (!incrementals[snum] || incpos >= incrementals[snum].length) {
 
271
          go(1);
 
272
        } else {
 
273
          subgo(1);
 
274
        }
 
275
        break;
 
276
      case 33: // page up
 
277
      case 37: // leftkey
 
278
      case 38: // upkey
 
279
        if(number != undef) {
 
280
          go(-1 * number);
 
281
        } else if (!incrementals[snum] || incpos <= 0) {
 
282
          go(-1);
 
283
        } else {
 
284
          subgo(-1);
 
285
        }
 
286
        break;
 
287
      case 36: // home
 
288
        goTo(0);
 
289
        break;
 
290
      case 35: // end
 
291
        goTo(smax-1);
 
292
        break;
 
293
      case 67: // c
 
294
        showHide('k');
 
295
        break;
 
296
    }
 
297
    if (key.which < 48 || key.which > 57) {
 
298
      number = undef;
 
299
    } else {
 
300
      if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return;
 
301
      if (key.target && isParentOrSelf(key.target, 'controls')) return;
 
302
      number = (((number != undef) ? number : 0) * 10) + (key.which - 48);
 
303
    }
 
304
  }
 
305
  return false;
 
306
}
 
307
 
 
308
function clicker(e) {
 
309
  number = undef;
 
310
  var target;
 
311
  if (window.event) {
 
312
    target = window.event.srcElement;
 
313
    e = window.event;
 
314
  } else target = e.target;
 
315
    if (target.href != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target, 'object')) return true;
 
316
  if (!e.which || e.which == 1) {
 
317
    if (!incrementals[snum] || incpos >= incrementals[snum].length) {
 
318
      go(1);
 
319
    } else {
 
320
      subgo(1);
 
321
    }
 
322
  }
 
323
}
 
324
 
 
325
function findSlide(hash) {
 
326
  var target = document.getElementById(hash);
 
327
  if (target) {
 
328
    for (var i = 0; i < slideIDs.length; i++) {
 
329
      if (target.id == slideIDs[i]) return i;
 
330
    }
 
331
  }
 
332
  return null;
 
333
}
 
334
 
 
335
function slideJump() {
 
336
  if (window.location.hash == null || window.location.hash == '') {
 
337
    currentSlide();
 
338
    return;
 
339
  }
 
340
  if (window.location.hash == null) return;
 
341
  var dest = null;
 
342
  dest = findSlide(window.location.hash.slice(1));
 
343
  if (dest == null) {
 
344
    dest = 0;
 
345
  }
 
346
  go(dest - snum);
 
347
}
 
348
 
 
349
function fixLinks() {
 
350
  var thisUri = window.location.href;
 
351
  thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length);
 
352
  var aelements = document.getElementsByTagName('A');
 
353
  for (var i = 0; i < aelements.length; i++) {
 
354
    var a = aelements[i].href;
 
355
    var slideID = a.match('\#.+');
 
356
    if ((slideID) && (slideID[0].slice(0,1) == '#')) {
 
357
      var dest = findSlide(slideID[0].slice(1));
 
358
      if (dest != null) {
 
359
        if (aelements[i].addEventListener) {
 
360
          aelements[i].addEventListener("click", new Function("e",
 
361
            "if (document.getElementById('slideProj').disabled) return;" +
 
362
            "go("+dest+" - snum); " +
 
363
            "if (e.preventDefault) e.preventDefault();"), true);
 
364
        } else if (aelements[i].attachEvent) {
 
365
          aelements[i].attachEvent("onclick", new Function("",
 
366
            "if (document.getElementById('slideProj').disabled) return;" +
 
367
            "go("+dest+" - snum); " +
 
368
            "event.returnValue = false;"));
 
369
        }
 
370
      }
 
371
    }
 
372
  }
 
373
}
 
374
 
 
375
function externalLinks() {
 
376
  if (!document.getElementsByTagName) return;
 
377
  var anchors = document.getElementsByTagName('a');
 
378
  for (var i=0; i<anchors.length; i++) {
 
379
    var anchor = anchors[i];
 
380
    if (anchor.getAttribute('href') && hasValue(anchor.rel, 'external')) {
 
381
      anchor.target = '_blank';
 
382
      addClass(anchor,'external');
 
383
    }
 
384
  }
 
385
}
 
386
 
 
387
function createControls() {
 
388
  var controlsDiv = document.getElementById("controls");
 
389
  if (!controlsDiv) return;
 
390
  var hider = ' onmouseover="showHide(\'s\');" onmouseout="showHide(\'h\');"';
 
391
  var hideDiv, hideList = '';
 
392
  if (controlVis == 'hidden') {
 
393
    hideDiv = hider;
 
394
  } else {
 
395
    hideList = hider;
 
396
  }
 
397
  controlsDiv.innerHTML = '<form action="#" id="controlForm"' + hideDiv + '>' +
 
398
  '<div id="navLinks">' +
 
399
  '<a accesskey="t" id="toggle" href="javascript:toggle();">&#216;<\/a>' +
 
400
  '<a accesskey="z" id="prev" href="javascript:go(-1);">&laquo;<\/a>' +
 
401
  '<a accesskey="x" id="next" href="javascript:go(1);">&raquo;<\/a>' +
 
402
  '<div id="navList"' + hideList + '><select id="jumplist" onchange="go(\'j\');"><\/select><\/div>' +
 
403
  '<\/div><\/form>';
 
404
  if (controlVis == 'hidden') {
 
405
    var hidden = document.getElementById('navLinks');
 
406
  } else {
 
407
    var hidden = document.getElementById('jumplist');
 
408
  }
 
409
  addClass(hidden,'hideme');
 
410
}
 
411
 
 
412
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
 
413
  if (!s5mode) return false;
 
414
  var vScale = 22;  // both yield 32 (after rounding) at 1024x768
 
415
  var hScale = 32;  // perhaps should auto-calculate based on theme's declared value?
 
416
  if (window.innerHeight) {
 
417
    var vSize = window.innerHeight;
 
418
    var hSize = window.innerWidth;
 
419
  } else if (document.documentElement.clientHeight) {
 
420
    var vSize = document.documentElement.clientHeight;
 
421
    var hSize = document.documentElement.clientWidth;
 
422
  } else if (document.body.clientHeight) {
 
423
    var vSize = document.body.clientHeight;
 
424
    var hSize = document.body.clientWidth;
 
425
  } else {
 
426
    var vSize = 700;  // assuming 1024x768, minus chrome and such
 
427
    var hSize = 1024; // these do not account for kiosk mode or Opera Show
 
428
  }
 
429
  var newSize = Math.min(Math.round(vSize/vScale),Math.round(hSize/hScale));
 
430
  fontSize(newSize + 'px');
 
431
  if (isGe) {  // hack to counter incremental reflow bugs
 
432
    var obj = document.getElementsByTagName('body')[0];
 
433
    obj.style.display = 'none';
 
434
    obj.style.display = 'block';
 
435
  }
 
436
}
 
437
 
 
438
function fontSize(value) {
 
439
  if (!(s5ss = document.getElementById('s5ss'))) {
 
440
    if (!isIE) {
 
441
      document.getElementsByTagName('head')[0].appendChild(s5ss = document.createElement('style'));
 
442
      s5ss.setAttribute('media','screen, projection');
 
443
      s5ss.setAttribute('id','s5ss');
 
444
    } else {
 
445
      document.createStyleSheet();
 
446
      document.s5ss = document.styleSheets[document.styleSheets.length - 1];
 
447
    }
 
448
  }
 
449
  if (!isIE) {
 
450
    while (s5ss.lastChild) s5ss.removeChild(s5ss.lastChild);
 
451
    s5ss.appendChild(document.createTextNode('body {font-size: ' + value + ' !important;}'));
 
452
  } else {
 
453
    document.s5ss.addRule('body','font-size: ' + value + ' !important;');
 
454
  }
 
455
}
 
456
 
 
457
function notOperaFix() {
 
458
  slideCSS = document.getElementById('slideProj').href;
 
459
  var slides = document.getElementById('slideProj');
 
460
  var outline = document.getElementById('outlineStyle');
 
461
  slides.setAttribute('media','screen');
 
462
  outline.disabled = true;
 
463
  if (isGe) {
 
464
    slides.setAttribute('href','null');   // Gecko fix
 
465
    slides.setAttribute('href',slideCSS); // Gecko fix
 
466
  }
 
467
  if (isIE && document.styleSheets && document.styleSheets[0]) {
 
468
    document.styleSheets[0].addRule('img', 'behavior: url(ui/default/iepngfix.htc)');
 
469
    document.styleSheets[0].addRule('div', 'behavior: url(ui/default/iepngfix.htc)');
 
470
    document.styleSheets[0].addRule('.slide', 'behavior: url(ui/default/iepngfix.htc)');
 
471
  }
 
472
}
 
473
 
 
474
function getIncrementals(obj) {
 
475
  var incrementals = new Array();
 
476
  if (!obj)
 
477
    return incrementals;
 
478
  var children = obj.childNodes;
 
479
  for (var i = 0; i < children.length; i++) {
 
480
    var child = children[i];
 
481
    if (hasClass(child, 'incremental')) {
 
482
      if (child.nodeName == 'OL' || child.nodeName == 'UL') {
 
483
        removeClass(child, 'incremental');
 
484
        for (var j = 0; j < child.childNodes.length; j++) {
 
485
          if (child.childNodes[j].nodeType == 1) {
 
486
            addClass(child.childNodes[j], 'incremental');
 
487
          }
 
488
        }
 
489
      } else {
 
490
        incrementals[incrementals.length] = child;
 
491
        removeClass(child,'incremental');
 
492
      }
 
493
    }
 
494
    if (hasClass(child, 'show-first')) {
 
495
      if (child.nodeName == 'OL' || child.nodeName == 'UL') {
 
496
        removeClass(child, 'show-first');
 
497
        if (child.childNodes[isGe].nodeType == 1) {
 
498
          removeClass(child.childNodes[isGe], 'incremental');
 
499
        }
 
500
      } else {
 
501
        incrementals[incrementals.length] = child;
 
502
      }
 
503
    }
 
504
    incrementals = incrementals.concat(getIncrementals(child));
 
505
  }
 
506
  return incrementals;
 
507
}
 
508
 
 
509
function createIncrementals() {
 
510
  var incrementals = new Array();
 
511
  for (var i = 0; i < smax; i++) {
 
512
    incrementals[i] = getIncrementals(document.getElementById(slideIDs[i]));
 
513
  }
 
514
  return incrementals;
 
515
}
 
516
 
 
517
function defaultCheck() {
 
518
  var allMetas = document.getElementsByTagName('meta');
 
519
  for (var i = 0; i< allMetas.length; i++) {
 
520
    if (allMetas[i].name == 'defaultView') {
 
521
      defaultView = allMetas[i].content;
 
522
    }
 
523
    if (allMetas[i].name == 'controlVis') {
 
524
      controlVis = allMetas[i].content;
 
525
    }
 
526
  }
 
527
}
 
528
 
 
529
// Key trap fix, new function body for trap()
 
530
function trap(e) {
 
531
  if (!e) {
 
532
    e = event;
 
533
    e.which = e.keyCode;
 
534
  }
 
535
  try {
 
536
    modifierKey = e.ctrlKey || e.altKey || e.metaKey;
 
537
  }
 
538
  catch(e) {
 
539
    modifierKey = false;
 
540
  }
 
541
  return modifierKey || e.which == 0;
 
542
}
 
543
 
 
544
function startup() {
 
545
  defaultCheck();
 
546
  if (!isOp) createControls();
 
547
  slideLabel();
 
548
  fixLinks();
 
549
  externalLinks();
 
550
  fontScale();
 
551
  if (!isOp) {
 
552
    notOperaFix();
 
553
    incrementals = createIncrementals();
 
554
    slideJump();
 
555
    if (defaultView == 'outline') {
 
556
      toggle();
 
557
    }
 
558
    document.onkeyup = keys;
 
559
    document.onkeypress = trap;
 
560
    document.onclick = clicker;
 
561
  }
 
562
}
 
563
 
 
564
window.onload = startup;
 
565
window.onresize = function(){setTimeout('fontScale()', 50);}