slideshow-service 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/Manifest.txt +71 -0
  3. data/lib/slideshow/service/public/slideshow-csss/classList.js +116 -0
  4. data/lib/slideshow/service/public/slideshow-csss/logo.svg +52 -0
  5. data/lib/slideshow/service/public/slideshow-csss/plugins/code-highlight.js +114 -0
  6. data/lib/slideshow/service/public/slideshow-csss/plugins/css-controls.js +40 -0
  7. data/lib/slideshow/service/public/slideshow-csss/plugins/css-edit.js +132 -0
  8. data/lib/slideshow/service/public/slideshow-csss/plugins/css-snippets.js +89 -0
  9. data/lib/slideshow/service/public/slideshow-csss/plugins/incrementable.js +94 -0
  10. data/lib/slideshow/service/public/slideshow-csss/prefixfree.min.js +10 -0
  11. data/lib/slideshow/service/public/slideshow-csss/reusable.css +118 -0
  12. data/lib/slideshow/service/public/slideshow-csss/slides.html +90 -0
  13. data/lib/slideshow/service/public/slideshow-csss/slideshow.css +282 -0
  14. data/lib/slideshow/service/public/slideshow-csss/slideshow.js +508 -0
  15. data/lib/slideshow/service/public/slideshow-csss/style.css +45 -0
  16. data/lib/slideshow/service/public/slideshow-csss/theme.css +247 -0
  17. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold-dim.gif +0 -0
  18. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold-dim.png +0 -0
  19. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold.gif +0 -0
  20. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-fold.png +0 -0
  21. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold-dim.gif +0 -0
  22. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold-dim.png +0 -0
  23. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold.gif +0 -0
  24. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-nofold.png +0 -0
  25. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold-dim.gif +0 -0
  26. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold-dim.png +0 -0
  27. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold.gif +0 -0
  28. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet-unfold.png +0 -0
  29. data/lib/slideshow/service/public/slideshow-slidy/graphics/bullet.png +0 -0
  30. data/lib/slideshow/service/public/slideshow-slidy/graphics/example.png +0 -0
  31. data/lib/slideshow/service/public/slideshow-slidy/graphics/example.svg +223 -0
  32. data/lib/slideshow/service/public/slideshow-slidy/graphics/face1.gif +0 -0
  33. data/lib/slideshow/service/public/slideshow-slidy/graphics/face2.gif +0 -0
  34. data/lib/slideshow/service/public/slideshow-slidy/graphics/face3.gif +0 -0
  35. data/lib/slideshow/service/public/slideshow-slidy/graphics/face4.gif +0 -0
  36. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold-bright.gif +0 -0
  37. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold-dim.bmp +0 -0
  38. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold-dim.gif +0 -0
  39. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold.bmp +0 -0
  40. data/lib/slideshow/service/public/slideshow-slidy/graphics/fold.gif +0 -0
  41. data/lib/slideshow/service/public/slideshow-slidy/graphics/icon-blue.png +0 -0
  42. data/lib/slideshow/service/public/slideshow-slidy/graphics/keys2.jpg +0 -0
  43. data/lib/slideshow/service/public/slideshow-slidy/graphics/nofold-dim.bmp +0 -0
  44. data/lib/slideshow/service/public/slideshow-slidy/graphics/nofold-dim.gif +0 -0
  45. data/lib/slideshow/service/public/slideshow-slidy/graphics/nofold.bmp +0 -0
  46. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold-bright.gif +0 -0
  47. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold-dim.bmp +0 -0
  48. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold-dim.gif +0 -0
  49. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold.bmp +0 -0
  50. data/lib/slideshow/service/public/slideshow-slidy/graphics/unfold.gif +0 -0
  51. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-blue.gif +0 -0
  52. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-blue.svg +14 -0
  53. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-slanted.jpg +0 -0
  54. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-white.gif +0 -0
  55. data/lib/slideshow/service/public/slideshow-slidy/graphics/w3c-logo-white.svg +14 -0
  56. data/lib/slideshow/service/public/slideshow-slidy/help/help.html +80 -0
  57. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.ca +52 -0
  58. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.de +96 -0
  59. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.en +81 -0
  60. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.es +52 -0
  61. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.fr +118 -0
  62. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.hu +98 -0
  63. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.nl +82 -0
  64. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.pl +76 -0
  65. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.pt-br +95 -0
  66. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.pt_br +95 -0
  67. data/lib/slideshow/service/public/slideshow-slidy/help/help.html.sv +75 -0
  68. data/lib/slideshow/service/public/slideshow-slidy/help/help.pt-br.html +95 -0
  69. data/lib/slideshow/service/public/slideshow-slidy/scripts/slidy.js +2952 -0
  70. data/lib/slideshow/service/public/slideshow-slidy/slides.blank.html +26 -0
  71. data/lib/slideshow/service/public/slideshow-slidy/slides.w3c.html +62 -0
  72. data/lib/slideshow/service/public/slideshow-slidy/styles/slidy.css +401 -0
  73. data/lib/slideshow/service/public/slideshow-slidy/styles/w3c-blue.css +493 -0
  74. data/lib/slideshow/service/version.rb +1 -2
  75. data/lib/slideshow/service/views/_editor.erb +7 -4
  76. data/lib/slideshow/service.rb +47 -19
  77. metadata +73 -2
@@ -0,0 +1,2952 @@
1
+ /* slidy.js
2
+
3
+ Copyright (c) 2005-2010 W3C (MIT, ERCIM, Keio), All Rights Reserved.
4
+ W3C liability, trademark, document use and software licensing
5
+ rules apply, see:
6
+
7
+ http://www.w3.org/Consortium/Legal/copyright-documents
8
+ http://www.w3.org/Consortium/Legal/copyright-software
9
+
10
+ Defines single name "w3c_slidy" in global namespace
11
+ Adds event handlers without trampling on any others
12
+ */
13
+
14
+ // the slidy object implementation
15
+ var w3c_slidy = {
16
+ // classify which kind of browser we're running under
17
+ ns_pos: (typeof window.pageYOffset!='undefined'),
18
+ khtml: ((navigator.userAgent).indexOf("KHTML") >= 0 ? true : false),
19
+ opera: ((navigator.userAgent).indexOf("Opera") >= 0 ? true : false),
20
+ ipad: ((navigator.userAgent).indexOf("iPad") >= 0 ? true : false),
21
+ iphone: ((navigator.userAgent).indexOf("iPhone") >= 0 ? true : false),
22
+ android: ((navigator.userAgent).indexOf("Android") >= 0 ? true : false),
23
+ ie: (typeof document.all != "undefined" && !this.opera),
24
+ ie6: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 6") != -1),
25
+ ie7: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 7") != -1),
26
+ ie8: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 8") != -1),
27
+ ie9: (!this.ns_pos && navigator.userAgent.indexOf("MSIE 9") != -1),
28
+
29
+ // data for swipe and double tap detection on touch screens
30
+ last_tap: 0,
31
+ prev_tap: 0,
32
+ start_x: 0,
33
+ start_y: 0,
34
+ delta_x: 0,
35
+ delta_y: 0,
36
+
37
+ // are we running as XHTML? (doesn't work on Opera)
38
+ is_xhtml: /xml/.test(document.contentType),
39
+
40
+ slide_number: 0, // integer slide count: 0, 1, 2, ...
41
+ slide_number_element: null, // element containing slide number
42
+ slides: [], // set to array of slide div's
43
+ notes: [], // set to array of handout div's
44
+ backgrounds: [], // set to array of background div's
45
+ toolbar: null, // element containing toolbar
46
+ title: null, // document title
47
+ last_shown: null, // last incrementally shown item
48
+ eos: null, // span element for end of slide indicator
49
+ toc: null, // table of contents
50
+ outline: null, // outline element with the focus
51
+ selected_text_len: 0, // length of drag selection on document
52
+ view_all: 0, // 1 to view all slides + handouts
53
+ want_toolbar: true, // user preference to show/hide toolbar
54
+ mouse_click_enabled: true, // enables left click for next slide
55
+ scroll_hack: 0, // IE work around for position: fixed
56
+ disable_slide_click: false, // used by clicked anchors
57
+
58
+ lang: "en", // updated to language specified by html file
59
+
60
+ help_anchor: null, // used for keyboard focus hack in showToolbar()
61
+ help_page: "http://www.w3.org/Talks/Tools/Slidy2/help/help.html",
62
+ help_text: "Navigate with mouse click, space bar, Cursor Left/Right, " +
63
+ "or Pg Up and Pg Dn. Use S and B to change font size.",
64
+
65
+ size_index: 0,
66
+ size_adjustment: 0,
67
+ sizes: new Array("10pt", "12pt", "14pt", "16pt", "18pt", "20pt",
68
+ "22pt", "24pt", "26pt", "28pt", "30pt", "32pt"),
69
+
70
+ // needed for efficient resizing
71
+ last_width: 0,
72
+ last_height: 0,
73
+
74
+
75
+ // Needed for cross browser support for relative width/height on
76
+ // object elements. The work around is to save width/height attributes
77
+ // and then to recompute absolute width/height dimensions on resizing
78
+ objects: [],
79
+
80
+ // attach initialiation event handlers
81
+ set_up: function () {
82
+ var init = function() { w3c_slidy.init(); };
83
+ if (typeof window.addEventListener != "undefined")
84
+ window.addEventListener("load", init, false);
85
+ else
86
+ window.attachEvent("onload", init);
87
+ },
88
+
89
+ hide_slides: function () {
90
+ if (document.body && !w3c_slidy.initialized)
91
+ document.body.style.visibility = "hidden";
92
+ else
93
+ setTimeout(w3c_slidy.hide_slides, 50);
94
+ },
95
+
96
+ // hack to persuade IE to compute correct document height
97
+ // as needed for simulating fixed positioning of toolbar
98
+ ie_hack: function () {
99
+ window.resizeBy(0,-1);
100
+ window.resizeBy(0, 1);
101
+ },
102
+
103
+ init: function () {
104
+ //alert("slidy starting test 10");
105
+ document.body.style.visibility = "visible";
106
+ this.init_localization();
107
+ this.add_toolbar();
108
+ this.wrap_implicit_slides();
109
+ this.collect_slides();
110
+ this.collect_notes();
111
+ this.collect_backgrounds();
112
+ this.objects = document.body.getElementsByTagName("object");
113
+ this.patch_anchors();
114
+ this.slide_number = this.find_slide_number(location.href);
115
+ window.offscreenbuffering = true;
116
+ this.size_adjustment = this.find_size_adjust();
117
+ this.time_left = this.find_duration();
118
+ this.hide_image_toolbar(); // suppress IE image toolbar popup
119
+ this.init_outliner(); // activate fold/unfold support
120
+ this.title = document.title;
121
+ this.keyboardless = (this.ipad||this.iphone||this.android);
122
+
123
+ if (this.keyboardless)
124
+ {
125
+ w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden")
126
+ this.want_toolbar = 0;
127
+ }
128
+
129
+ // work around for opera bug
130
+ this.is_xhtml = (document.body.tagName == "BODY" ? false : true);
131
+
132
+ if (this.slides.length > 0)
133
+ {
134
+ var slide = this.slides[this.slide_number];
135
+
136
+ if (this.slide_number > 0)
137
+ {
138
+ this.set_visibility_all_incremental("visible");
139
+ this.last_shown = this.previous_incremental_item(null);
140
+ this.set_eos_status(true);
141
+ }
142
+ else
143
+ {
144
+ this.last_shown = null;
145
+ this.set_visibility_all_incremental("hidden");
146
+ this.set_eos_status(!this.next_incremental_item(this.last_shown));
147
+ }
148
+
149
+ this.set_location();
150
+ this.add_class(this.slides[0], "first-slide");
151
+ w3c_slidy.show_slide(slide);
152
+ }
153
+
154
+ this.toc = this.table_of_contents();
155
+
156
+ this.add_initial_prompt();
157
+
158
+ // bind event handlers without interfering with custom page scripts
159
+ // Tap events behave too weirdly to support clicks reliably on
160
+ // iPhone and iPad, so exclude these from click handler
161
+
162
+ if (!this.keyboardless)
163
+ this.add_listener(document.body, "click", this.mouse_button_click);
164
+
165
+ this.add_listener(document, "keydown", this.key_down);
166
+ this.add_listener(document, "keypress", this.key_press);
167
+ this.add_listener(window, "resize", this.resized);
168
+ this.add_listener(window, "scroll", this.scrolled);
169
+ this.add_listener(window, "unload", this.unloaded);
170
+
171
+ this.add_listener(document, "touchstart", this.touchstart);
172
+ this.add_listener(document, "touchmove", this.touchmove);
173
+ this.add_listener(document, "touchend", this.touchend);
174
+
175
+ // this seems to be a debugging hack
176
+ //if (!document.body.onclick)
177
+ // document.body.onclick = function () { };
178
+
179
+ this.single_slide_view();
180
+
181
+ //this.set_location();
182
+
183
+ this.resized();
184
+
185
+ if (this.ie7)
186
+ setTimeout(w3c_slidy.ie_hack, 100);
187
+
188
+ this.show_toolbar();
189
+
190
+ // for back button detection
191
+ setInterval(function () { w3c_slidy.check_location(); }, 200);
192
+ w3c_slidy.initialized = true;
193
+ },
194
+
195
+ // create div element with links to each slide
196
+ table_of_contents: function () {
197
+ var toc = this.create_element("div");
198
+ this.add_class(toc, "slidy_toc hidden");
199
+ //toc.setAttribute("tabindex", "0");
200
+
201
+ var heading = this.create_element("div");
202
+ this.add_class(heading, "toc-heading");
203
+ heading.innerHTML = this.localize("Table of Contents");
204
+
205
+ toc.appendChild(heading);
206
+ var previous = null;
207
+
208
+ for (var i = 0; i < this.slides.length; ++i)
209
+ {
210
+ var title = this.has_class(this.slides[i], "title");
211
+ var num = document.createTextNode((i + 1) + ". ");
212
+
213
+ toc.appendChild(num);
214
+
215
+ var a = this.create_element("a");
216
+ a.setAttribute("href", "#(" + (i+1) + ")");
217
+
218
+ if (title)
219
+ this.add_class(a, "titleslide");
220
+
221
+ var name = document.createTextNode(this.slide_name(i));
222
+ a.appendChild(name);
223
+ a.onclick = w3c_slidy.toc_click;
224
+ a.onkeydown = w3c_slidy.toc_key_down;
225
+ a.previous = previous;
226
+
227
+ if (previous)
228
+ previous.next = a;
229
+
230
+ toc.appendChild(a);
231
+
232
+ if (i == 0)
233
+ toc.first = a;
234
+
235
+ if (i < this.slides.length - 1)
236
+ {
237
+ var br = this.create_element("br");
238
+ toc.appendChild(br);
239
+ }
240
+
241
+ previous = a;
242
+ }
243
+
244
+ toc.focus = function () {
245
+ if (this.first)
246
+ this.first.focus();
247
+ }
248
+
249
+ toc.onmouseup = w3c_slidy.mouse_button_up;
250
+
251
+ toc.onclick = function (e) {
252
+ e||(e=window.event);
253
+
254
+ if (w3c_slidy.selected_text_len <= 0)
255
+ w3c_slidy.hide_table_of_contents(true);
256
+
257
+ w3c_slidy.stop_propagation(e);
258
+
259
+ if (e.cancel != undefined)
260
+ e.cancel = true;
261
+
262
+ if (e.returnValue != undefined)
263
+ e.returnValue = false;
264
+
265
+ return false;
266
+ };
267
+
268
+ document.body.insertBefore(toc, document.body.firstChild);
269
+ return toc;
270
+ },
271
+
272
+ is_shown_toc: function () {
273
+ return !w3c_slidy.has_class(w3c_slidy.toc, "hidden");
274
+ },
275
+
276
+ show_table_of_contents: function () {
277
+ w3c_slidy.remove_class(w3c_slidy.toc, "hidden");
278
+ var toc = w3c_slidy.toc;
279
+ toc.focus();
280
+
281
+ if (w3c_slidy.ie7 && w3c_slidy.slide_number == 0)
282
+ setTimeout(w3c_slidy.ie_hack, 100);
283
+ },
284
+
285
+ hide_table_of_contents: function (focus) {
286
+ w3c_slidy.add_class(w3c_slidy.toc, "hidden");
287
+
288
+ if (focus && !w3c_slidy.opera)
289
+ w3c_slidy.help_anchor.focus();
290
+ },
291
+
292
+ toggle_table_of_contents: function () {
293
+ if (w3c_slidy.is_shown_toc())
294
+ w3c_slidy.hide_table_of_contents(true);
295
+ else
296
+ w3c_slidy.show_table_of_contents();
297
+ },
298
+
299
+ // called on clicking toc entry
300
+ toc_click: function (e) {
301
+ if (!e)
302
+ e = window.event;
303
+
304
+ var target = w3c_slidy.get_target(e);
305
+
306
+ if (target && target.nodeType == 1)
307
+ {
308
+ var uri = target.getAttribute("href");
309
+
310
+ if (uri)
311
+ {
312
+ //alert("going to " + uri);
313
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
314
+ w3c_slidy.hide_slide(slide);
315
+ w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);
316
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
317
+ w3c_slidy.last_shown = null;
318
+ w3c_slidy.set_location();
319
+ w3c_slidy.set_visibility_all_incremental("hidden");
320
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
321
+ w3c_slidy.show_slide(slide);
322
+ //target.focus();
323
+
324
+ try
325
+ {
326
+ if (!w3c_slidy.opera)
327
+ w3c_slidy.help_anchor.focus();
328
+ }
329
+ catch (e)
330
+ {
331
+ }
332
+ }
333
+ }
334
+
335
+ w3c_slidy.hide_table_of_contents(true);
336
+ if (w3c_slidy.ie7) w3c_slidy.ie_hack();
337
+ w3c_slidy.stop_propagation(e);
338
+ return w3c_slidy.cancel(e);
339
+ },
340
+
341
+ // called onkeydown for toc entry
342
+ toc_key_down: function (event) {
343
+ var key;
344
+
345
+ if (!event)
346
+ var event = window.event;
347
+
348
+ // kludge around NS/IE differences
349
+ if (window.event)
350
+ key = window.event.keyCode;
351
+ else if (event.which)
352
+ key = event.which;
353
+ else
354
+ return true; // Yikes! unknown browser
355
+
356
+ // ignore event if key value is zero
357
+ // as for alt on Opera and Konqueror
358
+ if (!key)
359
+ return true;
360
+
361
+ // check for concurrent control/command/alt key
362
+ // but are these only present on mouse events?
363
+
364
+ if (event.ctrlKey || event.altKey)
365
+ return true;
366
+
367
+ if (key == 13)
368
+ {
369
+ var uri = this.getAttribute("href");
370
+
371
+ if (uri)
372
+ {
373
+ //alert("going to " + uri);
374
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
375
+ w3c_slidy.hide_slide(slide);
376
+ w3c_slidy.slide_number = w3c_slidy.find_slide_number(uri);
377
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
378
+ w3c_slidy.last_shown = null;
379
+ w3c_slidy.set_location();
380
+ w3c_slidy.set_visibility_all_incremental("hidden");
381
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
382
+ w3c_slidy.show_slide(slide);
383
+ //target.focus();
384
+
385
+ try
386
+ {
387
+ if (!w3c_slidy.opera)
388
+ w3c_slidy.help_anchor.focus();
389
+ }
390
+ catch (e)
391
+ {
392
+ }
393
+ }
394
+
395
+ w3c_slidy.hide_table_of_contents(true);
396
+
397
+ if (self.ie7)
398
+ w3c_slidy.ie_hack();
399
+
400
+ return w3c_slidy.cancel(event);
401
+ }
402
+
403
+ if (key == 40 && this.next)
404
+ {
405
+ this.next.focus();
406
+ return w3c_slidy.cancel(event);
407
+ }
408
+
409
+ if (key == 38 && this.previous)
410
+ {
411
+ this.previous.focus();
412
+ return w3c_slidy.cancel(event);
413
+ }
414
+
415
+ return true;
416
+ },
417
+
418
+ touchstart: function (e)
419
+ {
420
+ //e.preventDefault();
421
+ this.prev_tap = this.last_tap;
422
+ this.last_tap = (new Date).getTime();
423
+
424
+ var tap_delay = this.last_tap - this.prev_tap;
425
+
426
+ if (tap_delay <= 200)
427
+ {
428
+ // double tap
429
+ }
430
+
431
+ var touch = e.touches[0];
432
+
433
+ this.start_x = touch.pageX;
434
+ this.start_y = touch.pageY;
435
+ this.delta_x = this.delta_y = 0;
436
+ },
437
+
438
+ touchmove: function (e)
439
+ {
440
+ //e.preventDefault();
441
+ var touch = e.touches[0];
442
+ this.delta_x = touch.pageX - this.start_x;
443
+ this.delta_y = touch.pageY - this.start_y;
444
+ },
445
+
446
+ touchend: function (e)
447
+ {
448
+ //e.preventDefault();
449
+ var delay = (new Date).getTime() - this.last_tap;
450
+ var dx = this.delta_x;
451
+ var dy = this.delta_y;
452
+ var abs_dx = Math.abs(dx);
453
+ var abs_dy = Math.abs(dy);
454
+
455
+ if (delay < 500 && (abs_dx > 100 || abs_dy > 100))
456
+ {
457
+ if (abs_dx > 0.5 * abs_dy)
458
+ {
459
+ if (dx > 0)
460
+ w3c_slidy.next_slide(true);
461
+ else
462
+ w3c_slidy.previous_slide(true);
463
+ }
464
+ else if (abs_dy > 2 * abs_dx)
465
+ {
466
+ w3c_slidy.toggle_table_of_contents();
467
+ }
468
+ }
469
+ },
470
+
471
+ // ### OBSOLETE ###
472
+ before_print: function () {
473
+ this.show_all_slides();
474
+ this.hide_toolbar();
475
+ alert("before print");
476
+ },
477
+
478
+ // ### OBSOLETE ###
479
+ after_print: function () {
480
+ if (!this.view_all)
481
+ {
482
+ this.single_slide_view();
483
+ this.show_toolbar();
484
+ }
485
+ alert("after print");
486
+ },
487
+
488
+ // ### OBSOLETE ###
489
+ print_slides: function () {
490
+ this.before_print();
491
+ window.print();
492
+ this.after_print();
493
+ },
494
+
495
+ // ### OBSOLETE ?? ###
496
+ toggle_view: function () {
497
+ if (this.view_all)
498
+ {
499
+ this.single_slide_view();
500
+ this.show_toolbar();
501
+ this.view_all = 0;
502
+ }
503
+ else
504
+ {
505
+ this.show_all_slides();
506
+ this.hide_toolbar();
507
+ this.view_all = 1;
508
+ }
509
+ },
510
+
511
+ // prepare for printing ### OBSOLETE ###
512
+ show_all_slides: function () {
513
+ this.remove_class(document.body, "single_slide");
514
+ this.set_visibility_all_incremental("visible");
515
+ },
516
+
517
+ // restore after printing ### OBSOLETE ###
518
+ single_slide_view: function () {
519
+ this.add_class(document.body, "single_slide");
520
+ this.set_visibility_all_incremental("visible");
521
+ this.last_shown = this.previous_incremental_item(null);
522
+ },
523
+
524
+ // suppress IE's image toolbar pop up
525
+ hide_image_toolbar: function () {
526
+ if (!this.ns_pos)
527
+ {
528
+ var images = document.getElementsByTagName("IMG");
529
+
530
+ for (var i = 0; i < images.length; ++i)
531
+ images[i].setAttribute("galleryimg", "no");
532
+ }
533
+ },
534
+
535
+ unloaded: function (e) {
536
+ //alert("unloaded");
537
+ },
538
+
539
+ // Safari and Konqueror don't yet support getComputedStyle()
540
+ // and they always reload page when location.href is updated
541
+ is_KHTML: function () {
542
+ var agent = navigator.userAgent;
543
+ return (agent.indexOf("KHTML") >= 0 ? true : false);
544
+ },
545
+
546
+ // find slide name from first h1 element
547
+ // default to document title + slide number
548
+ slide_name: function (index) {
549
+ var name = null;
550
+ var slide = this.slides[index];
551
+
552
+ var heading = this.find_heading(slide);
553
+
554
+ if (heading)
555
+ name = this.extract_text(heading);
556
+
557
+ if (!name)
558
+ name = this.title + "(" + (index + 1) + ")";
559
+
560
+ name.replace(/\&/g, "&amp;");
561
+ name.replace(/\</g, "&lt;");
562
+ name.replace(/\>/g, "&gt;");
563
+
564
+ return name;
565
+ },
566
+
567
+ // find first h1 element in DOM tree
568
+ find_heading: function (node) {
569
+ if (!node || node.nodeType != 1)
570
+ return null;
571
+
572
+ if (node.nodeName == "H1" || node.nodeName == "h1")
573
+ return node;
574
+
575
+ var child = node.firstChild;
576
+
577
+ while (child)
578
+ {
579
+ node = this.find_heading(child);
580
+
581
+ if (node)
582
+ return node;
583
+
584
+ child = child.nextSibling;
585
+ }
586
+
587
+ return null;
588
+ },
589
+
590
+ // recursively extract text from DOM tree
591
+ extract_text: function (node) {
592
+ if (!node)
593
+ return "";
594
+
595
+ // text nodes
596
+ if (node.nodeType == 3)
597
+ return node.nodeValue;
598
+
599
+ // elements
600
+ if (node.nodeType == 1)
601
+ {
602
+ node = node.firstChild;
603
+ var text = "";
604
+
605
+ while (node)
606
+ {
607
+ text = text + this.extract_text(node);
608
+ node = node.nextSibling;
609
+ }
610
+
611
+ return text;
612
+ }
613
+
614
+ return "";
615
+ },
616
+
617
+ // find copyright text from meta element
618
+ find_copyright: function () {
619
+ var name, content;
620
+ var meta = document.getElementsByTagName("meta");
621
+
622
+ for (var i = 0; i < meta.length; ++i)
623
+ {
624
+ name = meta[i].getAttribute("name");
625
+ content = meta[i].getAttribute("content");
626
+
627
+ if (name == "copyright")
628
+ return content;
629
+ }
630
+
631
+ return null;
632
+ },
633
+
634
+ find_size_adjust: function () {
635
+ var name, content, offset;
636
+ var meta = document.getElementsByTagName("meta");
637
+
638
+ for (var i = 0; i < meta.length; ++i)
639
+ {
640
+ name = meta[i].getAttribute("name");
641
+ content = meta[i].getAttribute("content");
642
+
643
+ if (name == "font-size-adjustment")
644
+ return 1 * content;
645
+ }
646
+
647
+ return 1;
648
+ },
649
+
650
+ // <meta name="duration" content="20" /> for 20 minutes
651
+ find_duration: function () {
652
+ var name, content, offset;
653
+ var meta = document.getElementsByTagName("meta");
654
+
655
+ for (var i = 0; i < meta.length; ++i)
656
+ {
657
+ name = meta[i].getAttribute("name");
658
+ content = meta[i].getAttribute("content");
659
+
660
+ if (name == "duration")
661
+ return 60000 * content;
662
+ }
663
+
664
+ return null;
665
+ },
666
+
667
+ replace_by_non_breaking_space: function (str) {
668
+ for (var i = 0; i < str.length; ++i)
669
+ str[i] = 160;
670
+ },
671
+
672
+ // ### CHECK ME ### is use of "li" okay for text/html?
673
+ // for XHTML do we also need to specify namespace?
674
+ init_outliner: function () {
675
+ var items = document.getElementsByTagName("li");
676
+
677
+ for (var i = 0; i < items.length; ++i)
678
+ {
679
+ var target = items[i];
680
+
681
+ if (!this.has_class(target.parentNode, "outline"))
682
+ continue;
683
+
684
+ target.onclick = this.outline_click;
685
+ /* ### more work needed for IE6
686
+ if (!this.ns_pos)
687
+ {
688
+ target.onmouseover = this.hover_outline;
689
+ target.onmouseout = this.unhover_outline;
690
+ }
691
+ */
692
+ if (this.foldable(target))
693
+ {
694
+ target.foldable = true;
695
+ target.onfocus = function () {w3c_slidy.outline = this;};
696
+ target.onblur = function () {w3c_slidy.outline = null;};
697
+
698
+ if (!target.getAttribute("tabindex"))
699
+ target.setAttribute("tabindex", "0");
700
+
701
+ if (this.has_class(target, "expand"))
702
+ this.unfold(target);
703
+ else
704
+ this.fold(target);
705
+ }
706
+ else
707
+ {
708
+ this.add_class(target, "nofold");
709
+ target.visible = true;
710
+ target.foldable = false;
711
+ }
712
+ }
713
+ },
714
+
715
+ foldable: function (item) {
716
+ if (!item || item.nodeType != 1)
717
+ return false;
718
+
719
+ var node = item.firstChild;
720
+
721
+ while (node)
722
+ {
723
+ if (node.nodeType == 1 && this.is_block(node))
724
+ return true;
725
+
726
+ node = node.nextSibling;
727
+ }
728
+
729
+ return false;
730
+ },
731
+
732
+ // ### CHECK ME ### switch to add/remove "hidden" class
733
+ fold: function (item) {
734
+ if (item)
735
+ {
736
+ this.remove_class(item, "unfolded");
737
+ this.add_class(item, "folded");
738
+ }
739
+
740
+ var node = item ? item.firstChild : null;
741
+
742
+ while (node)
743
+ {
744
+ if (node.nodeType == 1 && this.is_block(node)) // element
745
+ {
746
+ w3c_slidy.add_class(node, "hidden");
747
+ }
748
+
749
+ node = node.nextSibling;
750
+ }
751
+
752
+ item.visible = false;
753
+ },
754
+
755
+ // ### CHECK ME ### switch to add/remove "hidden" class
756
+ unfold: function (item) {
757
+ if (item)
758
+ {
759
+ this.add_class(item, "unfolded");
760
+ this.remove_class(item, "folded");
761
+ }
762
+
763
+ var node = item ? item.firstChild : null;
764
+
765
+ while (node)
766
+ {
767
+ if (node.nodeType == 1 && this.is_block(node)) // element
768
+ {
769
+ w3c_slidy.remove_class(node, "hidden");
770
+ }
771
+
772
+ node = node.nextSibling;
773
+ }
774
+
775
+ item.visible = true;
776
+ },
777
+
778
+ outline_click: function (e) {
779
+ if (!e)
780
+ e = window.event;
781
+
782
+ var rightclick = false;
783
+ var target = w3c_slidy.get_target(e);
784
+
785
+ while (target && target.visible == undefined)
786
+ target = target.parentNode;
787
+
788
+ if (!target)
789
+ return true;
790
+
791
+ if (e.which)
792
+ rightclick = (e.which == 3);
793
+ else if (e.button)
794
+ rightclick = (e.button == 2);
795
+
796
+ if (!rightclick && target.visible != undefined)
797
+ {
798
+ if (target.foldable)
799
+ {
800
+ if (target.visible)
801
+ w3c_slidy.fold(target);
802
+ else
803
+ w3c_slidy.unfold(target);
804
+ }
805
+
806
+ w3c_slidy.stop_propagation(e);
807
+ e.cancel = true;
808
+ e.returnValue = false;
809
+ }
810
+
811
+ return false;
812
+ },
813
+
814
+ add_initial_prompt: function () {
815
+ var prompt = this.create_element("div");
816
+ prompt.setAttribute("class", "initial_prompt");
817
+
818
+ var p1 = this.create_element("p");
819
+ prompt.appendChild(p1);
820
+ p1.setAttribute("class", "help");
821
+
822
+ if (this.keyboardless)
823
+ p1.innerHTML = "swipe right to move to next slide";
824
+ else
825
+ p1.innerHTML = "Space, Right Arrow or swipe right to move to " +
826
+ "next slide, click help below for more details";
827
+
828
+ this.add_listener(prompt, "click", function (e) {
829
+ document.body.removeChild(prompt);
830
+ w3c_slidy.stop_propagation(e);
831
+
832
+ if (e.cancel != undefined)
833
+ e.cancel = true;
834
+
835
+ if (e.returnValue != undefined)
836
+ e.returnValue = false;
837
+
838
+ return false;
839
+ });
840
+
841
+ document.body.appendChild(prompt);
842
+ this.initial_prompt = prompt;
843
+ setTimeout(function() {document.body.removeChild(prompt);}, 5000);
844
+ },
845
+
846
+ add_toolbar: function () {
847
+ var counter, page;
848
+
849
+ this.toolbar = this.create_element("div");
850
+ this.toolbar.setAttribute("class", "toolbar");
851
+
852
+ // a reasonably behaved browser
853
+ if (this.ns_pos || !this.ie6)
854
+ {
855
+ var right = this.create_element("div");
856
+ right.setAttribute("style", "float: right; text-align: right");
857
+
858
+ counter = this.create_element("span")
859
+ counter.innerHTML = this.localize("slide") + " n/m";
860
+ right.appendChild(counter);
861
+ this.toolbar.appendChild(right);
862
+
863
+ var left = this.create_element("div");
864
+ left.setAttribute("style", "text-align: left");
865
+
866
+ // global end of slide indicator
867
+ this.eos = this.create_element("span");
868
+ this.eos.innerHTML = "* ";
869
+ left.appendChild(this.eos);
870
+
871
+ var help = this.create_element("a");
872
+ help.setAttribute("href", this.help_page);
873
+ help.setAttribute("title", this.localize(this.help_text));
874
+ help.innerHTML = this.localize("help?");
875
+ left.appendChild(help);
876
+ this.help_anchor = help; // save for focus hack
877
+
878
+ var gap1 = document.createTextNode(" ");
879
+ left.appendChild(gap1);
880
+
881
+ var contents = this.create_element("a");
882
+ contents.setAttribute("href", "javascript:w3c_slidy.toggle_table_of_contents()");
883
+ contents.setAttribute("title", this.localize("table of contents"));
884
+ contents.innerHTML = this.localize("contents?");
885
+ left.appendChild(contents);
886
+
887
+ var gap2 = document.createTextNode(" ");
888
+ left.appendChild(gap2);
889
+
890
+ var copyright = this.find_copyright();
891
+
892
+ if (copyright)
893
+ {
894
+ var span = this.create_element("span");
895
+ span.className = "copyright";
896
+ span.innerHTML = copyright;
897
+ left.appendChild(span);
898
+ }
899
+
900
+ this.toolbar.setAttribute("tabindex", "0");
901
+ this.toolbar.appendChild(left);
902
+ }
903
+ else // IE6 so need to work around its poor CSS support
904
+ {
905
+ this.toolbar.style.position = (this.ie7 ? "fixed" : "absolute");
906
+ this.toolbar.style.zIndex = "200";
907
+ this.toolbar.style.width = "99.9%";
908
+ this.toolbar.style.height = "1.2em";
909
+ this.toolbar.style.top = "auto";
910
+ this.toolbar.style.bottom = "0";
911
+ this.toolbar.style.left = "0";
912
+ this.toolbar.style.right = "0";
913
+ this.toolbar.style.textAlign = "left";
914
+ this.toolbar.style.fontSize = "60%";
915
+ this.toolbar.style.color = "red";
916
+ this.toolbar.borderWidth = 0;
917
+ this.toolbar.className = "toolbar";
918
+ this.toolbar.style.background = "rgb(240,240,240)";
919
+
920
+ // would like to have help text left aligned
921
+ // and page counter right aligned, floating
922
+ // div's don't work, so instead use nested
923
+ // absolutely positioned div's.
924
+
925
+ var sp = this.create_element("span");
926
+ sp.innerHTML = "&nbsp;&nbsp;*&nbsp;";
927
+ this.toolbar.appendChild(sp);
928
+ this.eos = sp; // end of slide indicator
929
+
930
+ var help = this.create_element("a");
931
+ help.setAttribute("href", this.help_page);
932
+ help.setAttribute("title", this.localize(this.help_text));
933
+ help.innerHTML = this.localize("help?");
934
+ this.toolbar.appendChild(help);
935
+ this.help_anchor = help; // save for focus hack
936
+
937
+ var gap1 = document.createTextNode(" ");
938
+ this.toolbar.appendChild(gap1);
939
+
940
+ var contents = this.create_element("a");
941
+ contents.setAttribute("href", "javascript:toggleTableOfContents()");
942
+ contents.setAttribute("title", this.localize("table of contents".localize));
943
+ contents.innerHTML = this.localize("contents?");
944
+ this.toolbar.appendChild(contents);
945
+
946
+ var gap2 = document.createTextNode(" ");
947
+ this.toolbar.appendChild(gap2);
948
+
949
+ var copyright = this.find_copyright();
950
+
951
+ if (copyright)
952
+ {
953
+ var span = this.create_element("span");
954
+ span.innerHTML = copyright;
955
+ span.style.color = "black";
956
+ span.style.marginLeft = "0.5em";
957
+ this.toolbar.appendChild(span);
958
+ }
959
+
960
+ counter = this.create_element("div")
961
+ counter.style.position = "absolute";
962
+ counter.style.width = "auto"; //"20%";
963
+ counter.style.height = "1.2em";
964
+ counter.style.top = "auto";
965
+ counter.style.bottom = 0;
966
+ counter.style.right = "0";
967
+ counter.style.textAlign = "right";
968
+ counter.style.color = "red";
969
+ counter.style.background = "rgb(240,240,240)";
970
+
971
+ counter.innerHTML = this.localize("slide") + " n/m";
972
+ this.toolbar.appendChild(counter);
973
+ }
974
+
975
+ // ensure that click isn't passed through to the page
976
+ this.toolbar.onclick =
977
+ function (e) {
978
+ if (!e)
979
+ e = window.event;
980
+
981
+ var target = e.target;
982
+
983
+ if (!target && e.srcElement)
984
+ target = e.srcElement;
985
+
986
+ // work around Safari bug
987
+ if (target && target.nodeType == 3)
988
+ target = target.parentNode;
989
+
990
+ w3c_slidy.stop_propagation(e);
991
+
992
+ if (target && target.nodeName.toLowerCase() != "a")
993
+ w3c_slidy.mouse_button_click(e);
994
+ };
995
+
996
+ this.slide_number_element = counter;
997
+ this.set_eos_status(false);
998
+ document.body.appendChild(this.toolbar);
999
+ },
1000
+
1001
+ // wysiwyg editors make it hard to use div elements
1002
+ // e.g. amaya loses the div when you copy and paste
1003
+ // this function wraps div elements around implicit
1004
+ // slides which start with an h1 element and continue
1005
+ // up to the next heading or div element
1006
+ wrap_implicit_slides: function () {
1007
+ var i, heading, node, next, div;
1008
+ var headings = document.getElementsByTagName("h1");
1009
+
1010
+ if (!headings)
1011
+ return;
1012
+
1013
+ for (i = 0; i < headings.length; ++i)
1014
+ {
1015
+ heading = headings[i];
1016
+
1017
+ if (heading.parentNode != document.body)
1018
+ continue;
1019
+
1020
+ node = heading.nextSibling;
1021
+
1022
+ div = document.createElement("div");
1023
+ this.add_class(div, "slide");
1024
+ document.body.replaceChild(div, heading);
1025
+ div.appendChild(heading);
1026
+
1027
+ while (node)
1028
+ {
1029
+ if (node.nodeType == 1 && // an element
1030
+ (node.nodeName == "H1" ||
1031
+ node.nodeName == "h1" ||
1032
+ node.nodeName == "DIV" ||
1033
+ node.nodeName == "div"))
1034
+ break;
1035
+
1036
+ next = node.nextSibling;
1037
+ node = document.body.removeChild(node);
1038
+ div.appendChild(node);
1039
+ node = next;
1040
+ }
1041
+ }
1042
+ },
1043
+
1044
+ // return new array of all slides
1045
+ collect_slides: function () {
1046
+ var slides = new Array();
1047
+ var divs = document.body.getElementsByTagName("div");
1048
+
1049
+ for (var i = 0; i < divs.length; ++i)
1050
+ {
1051
+ div = divs.item(i);
1052
+
1053
+ if (this.has_class(div, "slide"))
1054
+ {
1055
+ // add slide to collection
1056
+ slides[slides.length] = div;
1057
+
1058
+ // hide each slide as it is found
1059
+ this.add_class(div, "hidden");
1060
+
1061
+ // add dummy <br/> at end for scrolling hack
1062
+ var node1 = document.createElement("br");
1063
+ div.appendChild(node1);
1064
+ var node2 = document.createElement("br");
1065
+ div.appendChild(node2);
1066
+ }
1067
+ else if (this.has_class(div, "background"))
1068
+ { // work around for Firefox SVG reload bug
1069
+ // which otherwise replaces 1st SVG graphic with 2nd
1070
+ div.style.display = "block";
1071
+ }
1072
+ }
1073
+
1074
+ this.slides = slides;
1075
+ },
1076
+
1077
+ // return new array of all <div class="handout">
1078
+ collect_notes: function () {
1079
+ var notes = new Array();
1080
+ var divs = document.body.getElementsByTagName("div");
1081
+
1082
+ for (var i = 0; i < divs.length; ++i)
1083
+ {
1084
+ div = divs.item(i);
1085
+
1086
+ if (this.has_class(div, "handout"))
1087
+ {
1088
+ // add note to collection
1089
+ notes[notes.length] = div;
1090
+
1091
+ // and hide it
1092
+ this.add_class(div, "hidden");
1093
+ }
1094
+ }
1095
+
1096
+ this.notes = notes;
1097
+ },
1098
+
1099
+ // return new array of all <div class="background">
1100
+ // including named backgrounds e.g. class="background titlepage"
1101
+ collect_backgrounds: function () {
1102
+ var backgrounds = new Array();
1103
+ var divs = document.body.getElementsByTagName("div");
1104
+
1105
+ for (var i = 0; i < divs.length; ++i)
1106
+ {
1107
+ div = divs.item(i);
1108
+
1109
+ if (this.has_class(div, "background"))
1110
+ {
1111
+ // add background to collection
1112
+ backgrounds[backgrounds.length] = div;
1113
+
1114
+ // and hide it
1115
+ this.add_class(div, "hidden");
1116
+ }
1117
+ }
1118
+
1119
+ this.backgrounds = backgrounds;
1120
+ },
1121
+
1122
+ // set click handlers on all anchors
1123
+ patch_anchors: function () {
1124
+ var self = w3c_slidy;
1125
+ var handler = function (event) {
1126
+ // compare this.href with location.href
1127
+ // for link to another slide in this doc
1128
+
1129
+ if (self.page_address(this.href) == self.page_address(location.href))
1130
+ {
1131
+ // yes, so find new slide number
1132
+ var newslidenum = self.find_slide_number(this.href);
1133
+
1134
+ if (newslidenum != self.slide_number)
1135
+ {
1136
+ var slide = self.slides[self.slide_number];
1137
+ self.hide_slide(slide);
1138
+ self.slide_number = newslidenum;
1139
+ slide = self.slides[self.slide_number];
1140
+ self.show_slide(slide);
1141
+ self.set_location();
1142
+ }
1143
+ }
1144
+ else
1145
+ w3c_slidy.stop_propagation(event);
1146
+
1147
+ // else if (this.target == null)
1148
+ // location.href = this.href;
1149
+
1150
+ this.blur();
1151
+ self.disable_slide_click = true;
1152
+ };
1153
+
1154
+ var anchors = document.body.getElementsByTagName("a");
1155
+
1156
+ for (var i = 0; i < anchors.length; ++i)
1157
+ {
1158
+ if (window.addEventListener)
1159
+ anchors[i].addEventListener("click", handler, false);
1160
+ else
1161
+ anchors[i].attachEvent("onclick", handler);
1162
+ }
1163
+ },
1164
+
1165
+ // ### CHECK ME ### see which functions are invoked via setTimeout
1166
+ // either directly or indirectly for use of w3c_slidy vs this
1167
+ show_slide_number: function () {
1168
+ var timer = w3c_slidy.get_timer();
1169
+ w3c_slidy.slide_number_element.innerHTML = timer + w3c_slidy.localize("slide") + " " +
1170
+ (w3c_slidy.slide_number + 1) + "/" + w3c_slidy.slides.length;
1171
+ },
1172
+
1173
+ // every 200mS check if the location has been changed as a
1174
+ // result of the user activating the Back button/menu item
1175
+ // doesn't work for Opera < 9.5
1176
+ check_location: function () {
1177
+ var hash = location.hash;
1178
+
1179
+ if (w3c_slidy.slide_number > 0 && (hash == "" || hash == "#"))
1180
+ w3c_slidy.goto_slide(0);
1181
+ else if (hash.length > 2 && hash != "#("+(w3c_slidy.slide_number+1)+")")
1182
+ {
1183
+ var num = parseInt(location.hash.substr(2));
1184
+
1185
+ if (!isNaN(num))
1186
+ w3c_slidy.goto_slide(num-1);
1187
+ }
1188
+
1189
+ if (w3c_slidy.time_left && w3c_slidy.slide_number > 0)
1190
+ {
1191
+ w3c_slidy.show_slide_number();
1192
+
1193
+ if (w3c_slidy.time_left > 0)
1194
+ w3c_slidy.time_left -= 200;
1195
+ }
1196
+ },
1197
+
1198
+ get_timer: function () {
1199
+ var timer = "";
1200
+ if (w3c_slidy.time_left)
1201
+ {
1202
+ var mins, secs;
1203
+ secs = Math.floor(w3c_slidy.time_left/1000);
1204
+ mins = Math.floor(secs / 60);
1205
+ secs = secs % 60;
1206
+ timer = (mins ? mins+"m" : "") + secs + "s ";
1207
+ }
1208
+
1209
+ return timer;
1210
+ },
1211
+
1212
+ // this doesn't push location onto history stack for IE
1213
+ // for which a hidden iframe hack is needed: load page into
1214
+ // the iframe with script that set's parent's location.hash
1215
+ // but that won't work for standalone use unless we can
1216
+ // create the page dynamically via a javascript: URL
1217
+ set_location: function () {
1218
+ var uri = w3c_slidy.page_address(location.href);
1219
+ var hash = "#(" + (w3c_slidy.slide_number+1) + ")";
1220
+
1221
+ if (w3c_slidy.slide_number >= 0)
1222
+ uri = uri + hash;
1223
+
1224
+ if (w3c_slidy.ie && (w3c_slidy.ie6 || w3c_slidy.ie7))
1225
+ w3c_slidy.push_hash(hash);
1226
+
1227
+ if (uri != location.href) // && !khtml
1228
+ location.href = uri;
1229
+
1230
+ if (this.khtml)
1231
+ hash = "(" + (w3c_slidy.slide_number+1) + ")";
1232
+
1233
+ if (!this.ie && location.hash != hash && location.hash != "")
1234
+ location.hash = hash;
1235
+
1236
+ document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";
1237
+ w3c_slidy.show_slide_number();
1238
+ },
1239
+
1240
+ page_address: function (uri) {
1241
+ var i = uri.indexOf("#");
1242
+
1243
+ if (i < 0)
1244
+ i = uri.indexOf("%23");
1245
+
1246
+ // check if anchor is entire page
1247
+
1248
+ if (i < 0)
1249
+ return uri; // yes
1250
+
1251
+ return uri.substr(0, i);
1252
+ },
1253
+
1254
+ // only used for IE6 and IE7
1255
+ on_frame_loaded: function (hash) {
1256
+ location.hash = hash;
1257
+ var uri = w3c_slidy.page_address(location.href);
1258
+ location.href = uri + hash;
1259
+ },
1260
+
1261
+ // history hack with thanks to Bertrand Le Roy
1262
+ push_hash: function (hash) {
1263
+ if (hash == "") hash = "#(1)";
1264
+ window.location.hash = hash;
1265
+
1266
+ var doc = document.getElementById("historyFrame").contentWindow.document;
1267
+ doc.open("javascript:'<html></html>'");
1268
+ doc.write("<html><head><script type=\"text/javascript\">window.parent.w3c_slidy.on_frame_loaded('"+
1269
+ (hash) + "');</script></head><body>hello mum</body></html>");
1270
+ doc.close();
1271
+ },
1272
+
1273
+ // find current slide based upon location
1274
+ // first find target anchor and then look
1275
+ // for associated div element enclosing it
1276
+ // finally map that to slide number
1277
+ find_slide_number: function (uri) {
1278
+ // first get anchor from page location
1279
+
1280
+ var i = uri.indexOf("#");
1281
+
1282
+ // check if anchor is entire page
1283
+ if (i < 0)
1284
+ return 0; // yes
1285
+
1286
+ var anchor = unescape(uri.substr(i+1));
1287
+
1288
+ // now use anchor as XML ID to find target
1289
+ var target = document.getElementById(anchor);
1290
+
1291
+ if (!target)
1292
+ {
1293
+ // does anchor look like "(2)" for slide 2 ??
1294
+ // where first slide is (1)
1295
+ var re = /\((\d)+\)/;
1296
+
1297
+ if (anchor.match(re))
1298
+ {
1299
+ var num = parseInt(anchor.substring(1, anchor.length-1));
1300
+
1301
+ if (num > this.slides.length)
1302
+ num = 1;
1303
+
1304
+ if (--num < 0)
1305
+ num = 0;
1306
+
1307
+ return num;
1308
+ }
1309
+
1310
+ // accept [2] for backwards compatibility
1311
+ re = /\[(\d)+\]/;
1312
+
1313
+ if (anchor.match(re))
1314
+ {
1315
+ var num = parseInt(anchor.substring(1, anchor.length-1));
1316
+
1317
+ if (num > this.slides.length)
1318
+ num = 1;
1319
+
1320
+ if (--num < 0)
1321
+ num = 0;
1322
+
1323
+ return num;
1324
+ }
1325
+
1326
+ // oh dear unknown anchor
1327
+ return 0;
1328
+ }
1329
+
1330
+ // search for enclosing slide
1331
+
1332
+ while (true)
1333
+ {
1334
+ // browser coerces html elements to uppercase!
1335
+ if (target.nodeName.toLowerCase() == "div" &&
1336
+ this.has_class(target, "slide"))
1337
+ {
1338
+ // found the slide element
1339
+ break;
1340
+ }
1341
+
1342
+ // otherwise try parent element if any
1343
+
1344
+ target = target.parentNode;
1345
+
1346
+ if (!target)
1347
+ {
1348
+ return 0; // no luck!
1349
+ }
1350
+ };
1351
+
1352
+ for (i = 0; i < slides.length; ++i)
1353
+ {
1354
+ if (slides[i] == target)
1355
+ return i; // success
1356
+ }
1357
+
1358
+ // oh dear still no luck
1359
+ return 0;
1360
+ },
1361
+
1362
+ previous_slide: function (incremental) {
1363
+ if (!w3c_slidy.view_all)
1364
+ {
1365
+ var slide;
1366
+
1367
+ if ((incremental || w3c_slidy.slide_number == 0) && w3c_slidy.last_shown != null)
1368
+ {
1369
+ w3c_slidy.last_shown = w3c_slidy.hide_previous_item(w3c_slidy.last_shown);
1370
+ w3c_slidy.set_eos_status(false);
1371
+ }
1372
+ else if (w3c_slidy.slide_number > 0)
1373
+ {
1374
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1375
+ w3c_slidy.hide_slide(slide);
1376
+
1377
+ w3c_slidy.slide_number = w3c_slidy.slide_number - 1;
1378
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1379
+ w3c_slidy.set_visibility_all_incremental("visible");
1380
+ w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);
1381
+ w3c_slidy.set_eos_status(true);
1382
+ w3c_slidy.show_slide(slide);
1383
+ }
1384
+
1385
+ w3c_slidy.set_location();
1386
+
1387
+ if (!w3c_slidy.ns_pos)
1388
+ w3c_slidy.refresh_toolbar(200);
1389
+ }
1390
+ },
1391
+
1392
+ next_slide: function (incremental) {
1393
+ if (!w3c_slidy.view_all)
1394
+ {
1395
+ var slide, last = w3c_slidy.last_shown;
1396
+
1397
+ if (incremental || w3c_slidy.slide_number == w3c_slidy.slides.length - 1)
1398
+ w3c_slidy.last_shown = w3c_slidy.reveal_next_item(w3c_slidy.last_shown);
1399
+
1400
+ if ((!incremental || w3c_slidy.last_shown == null) &&
1401
+ w3c_slidy.slide_number < w3c_slidy.slides.length - 1)
1402
+ {
1403
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1404
+ w3c_slidy.hide_slide(slide);
1405
+
1406
+ w3c_slidy.slide_number = w3c_slidy.slide_number + 1;
1407
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1408
+ w3c_slidy.last_shown = null;
1409
+ w3c_slidy.set_visibility_all_incremental("hidden");
1410
+ w3c_slidy.show_slide(slide);
1411
+ }
1412
+ else if (!w3c_slidy.last_shown)
1413
+ {
1414
+ if (last && incremental)
1415
+ w3c_slidy.last_shown = last;
1416
+ }
1417
+
1418
+ w3c_slidy.set_location();
1419
+
1420
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
1421
+
1422
+ if (!w3c_slidy.ns_pos)
1423
+ w3c_slidy.refresh_toolbar(200);
1424
+ }
1425
+ },
1426
+
1427
+ // to first slide with nothing revealed
1428
+ // i.e. state at start of presentation
1429
+ first_slide: function () {
1430
+ if (!w3c_slidy.view_all)
1431
+ {
1432
+ var slide;
1433
+
1434
+ if (w3c_slidy.slide_number != 0)
1435
+ {
1436
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1437
+ w3c_slidy.hide_slide(slide);
1438
+
1439
+ w3c_slidy.slide_number = 0;
1440
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1441
+ w3c_slidy.last_shown = null;
1442
+ w3c_slidy.set_visibility_all_incremental("hidden");
1443
+ w3c_slidy.show_slide(slide);
1444
+ }
1445
+
1446
+ w3c_slidy.set_eos_status(
1447
+ !w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
1448
+ w3c_slidy.set_location();
1449
+ }
1450
+ },
1451
+
1452
+ // goto last slide with everything revealed
1453
+ // i.e. state at end of presentation
1454
+ last_slide: function () {
1455
+ if (!w3c_slidy.view_all)
1456
+ {
1457
+ var slide;
1458
+
1459
+ w3c_slidy.last_shown = null; //revealNextItem(lastShown);
1460
+
1461
+ if (w3c_slidy.last_shown == null &&
1462
+ w3c_slidy.slide_number < w3c_slidy.slides.length - 1)
1463
+ {
1464
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1465
+ w3c_slidy.hide_slide(slide);
1466
+ w3c_slidy.slide_number = w3c_slidy.slides.length - 1;
1467
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1468
+ w3c_slidy.set_visibility_all_incremental("visible");
1469
+ w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);
1470
+
1471
+ w3c_slidy.show_slide(slide);
1472
+ }
1473
+ else
1474
+ {
1475
+ w3c_slidy.set_visibility_all_incremental("visible");
1476
+ w3c_slidy.last_shown = w3c_slidy.previous_incremental_item(null);
1477
+ }
1478
+
1479
+ w3c_slidy.set_eos_status(true);
1480
+ w3c_slidy.set_location();
1481
+ }
1482
+ },
1483
+
1484
+
1485
+ // ### check this and consider add/remove class
1486
+ set_eos_status: function (state) {
1487
+ if (this.eos)
1488
+ this.eos.style.color = (state ? "rgb(240,240,240)" : "red");
1489
+ },
1490
+
1491
+ // first slide is 0
1492
+ goto_slide: function (num) {
1493
+ //alert("going to slide " + (num+1));
1494
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
1495
+ w3c_slidy.hide_slide(slide);
1496
+ w3c_slidy.slide_number = num;
1497
+ slide = w3c_slidy.slides[w3c_slidy.slide_number];
1498
+ w3c_slidy.last_shown = null;
1499
+ w3c_slidy.set_visibility_all_incremental("hidden");
1500
+ w3c_slidy.set_eos_status(!w3c_slidy.next_incremental_item(w3c_slidy.last_shown));
1501
+ document.title = w3c_slidy.title + " (" + (w3c_slidy.slide_number+1) + ")";
1502
+ w3c_slidy.show_slide(slide);
1503
+ w3c_slidy.show_slide_number();
1504
+ },
1505
+
1506
+
1507
+ show_slide: function (slide) {
1508
+ this.sync_background(slide);
1509
+ window.scrollTo(0,0);
1510
+ this.remove_class(slide, "hidden");
1511
+ },
1512
+
1513
+ hide_slide: function (slide) {
1514
+ this.add_class(slide, "hidden");
1515
+ },
1516
+
1517
+ // show just the backgrounds pertinent to this slide
1518
+ // when slide background-color is transparent
1519
+ // this should now work with rgba color values
1520
+ sync_background: function (slide) {
1521
+ var background;
1522
+ var bgColor;
1523
+
1524
+ if (slide.currentStyle)
1525
+ bgColor = slide.currentStyle["backgroundColor"];
1526
+ else if (document.defaultView)
1527
+ {
1528
+ var styles = document.defaultView.getComputedStyle(slide,null);
1529
+
1530
+ if (styles)
1531
+ bgColor = styles.getPropertyValue("background-color");
1532
+ else // broken implementation probably due Safari or Konqueror
1533
+ {
1534
+ //alert("defective implementation of getComputedStyle()");
1535
+ bgColor = "transparent";
1536
+ }
1537
+ }
1538
+ else
1539
+ bgColor == "transparent";
1540
+
1541
+ if (bgColor == "transparent" ||
1542
+ bgColor.indexOf("rgba") >= 0 ||
1543
+ bgColor.indexOf("opacity") >= 0)
1544
+ {
1545
+ var slideClass = this.get_class_list(slide);
1546
+
1547
+ for (var i = 0; i < this.backgrounds.length; i++)
1548
+ {
1549
+ background = this.backgrounds[i];
1550
+
1551
+ var bgClass = this.get_class_list(background);
1552
+
1553
+ if (this.matching_background(slideClass, bgClass))
1554
+ this.remove_class(background, "hidden");
1555
+ else
1556
+ this.add_class(background, "hidden");
1557
+ }
1558
+ }
1559
+ else // forcibly hide all backgrounds
1560
+ this.hide_backgrounds();
1561
+ },
1562
+
1563
+ hide_backgrounds: function () {
1564
+ for (var i = 0; i < this.backgrounds.length; i++)
1565
+ {
1566
+ background = this.backgrounds[i];
1567
+ this.add_class(background, "hidden");
1568
+ }
1569
+ },
1570
+
1571
+ // compare classes for slide and background
1572
+ matching_background: function (slideClass, bgClass) {
1573
+ var i, count, pattern, result;
1574
+
1575
+ // define pattern as regular expression
1576
+ pattern = /\w+/g;
1577
+
1578
+ // check background class names
1579
+ result = bgClass.match(pattern);
1580
+
1581
+ for (i = count = 0; i < result.length; i++)
1582
+ {
1583
+ if (result[i] == "hidden")
1584
+ continue;
1585
+
1586
+ if (result[i] == "background")
1587
+ continue;
1588
+
1589
+ ++count;
1590
+ }
1591
+
1592
+ if (count == 0) // default match
1593
+ return true;
1594
+
1595
+ // check for matches and place result in array
1596
+ result = slideClass.match(pattern);
1597
+
1598
+ // now check if desired name is present for background
1599
+ for (i = count = 0; i < result.length; i++)
1600
+ {
1601
+ if (result[i] == "hidden")
1602
+ continue;
1603
+
1604
+ if (this.has_token(bgClass, result[i]))
1605
+ return true;
1606
+ }
1607
+
1608
+ return false;
1609
+ },
1610
+
1611
+ resized: function () {
1612
+ var width = 0;
1613
+
1614
+ if ( typeof( window.innerWidth ) == 'number' )
1615
+ width = window.innerWidth; // Non IE browser
1616
+ else if (document.documentElement && document.documentElement.clientWidth)
1617
+ width = document.documentElement.clientWidth; // IE6
1618
+ else if (document.body && document.body.clientWidth)
1619
+ width = document.body.clientWidth; // IE4
1620
+
1621
+ var height = 0;
1622
+
1623
+ if ( typeof( window.innerHeight ) == 'number' )
1624
+ height = window.innerHeight; // Non IE browser
1625
+ else if (document.documentElement && document.documentElement.clientHeight)
1626
+ height = document.documentElement.clientHeight; // IE6
1627
+ else if (document.body && document.body.clientHeight)
1628
+ height = document.body.clientHeight; // IE4
1629
+
1630
+ if (height && (width/height > 1.05*1024/768))
1631
+ {
1632
+ width = height * 1024.0/768;
1633
+ }
1634
+
1635
+ // IE fires onresize even when only font size is changed!
1636
+ // so we do a check to avoid blocking < and > actions
1637
+ if (width != w3c_slidy.last_width || height != w3c_slidy.last_height)
1638
+ {
1639
+ if (width >= 1100)
1640
+ w3c_slidy.size_index = 5; // 4
1641
+ else if (width >= 1000)
1642
+ w3c_slidy.size_index = 4; // 3
1643
+ else if (width >= 800)
1644
+ w3c_slidy.size_index = 3; // 2
1645
+ else if (width >= 600)
1646
+ w3c_slidy.size_index = 2; // 1
1647
+ else if (width)
1648
+ w3c_slidy.size_index = 0;
1649
+
1650
+ // add in font size adjustment from meta element e.g.
1651
+ // <meta name="font-size-adjustment" content="-2" />
1652
+ // useful when slides have too much content ;-)
1653
+
1654
+ if (0 <= w3c_slidy.size_index + w3c_slidy.size_adjustment &&
1655
+ w3c_slidy.size_index + w3c_slidy.size_adjustment < w3c_slidy.sizes.length)
1656
+ w3c_slidy.size_index = w3c_slidy.size_index + w3c_slidy.size_adjustment;
1657
+
1658
+ // enables cross browser use of relative width/height
1659
+ // on object elements for use with SVG and Flash media
1660
+ w3c_slidy.adjust_object_dimensions(width, height);
1661
+
1662
+ if (document.body.style.fontSize != w3c_slidy.sizes[w3c_slidy.size_index])
1663
+ {
1664
+ document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];
1665
+ }
1666
+
1667
+ w3c_slidy.last_width = width;
1668
+ w3c_slidy.last_height = height;
1669
+
1670
+ // force reflow to work around Mozilla bug
1671
+ if (w3c_slidy.ns_pos)
1672
+ {
1673
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
1674
+ w3c_slidy.hide_slide(slide);
1675
+ w3c_slidy.show_slide(slide);
1676
+ }
1677
+
1678
+ // force correct positioning of toolbar
1679
+ w3c_slidy.refresh_toolbar(200);
1680
+ }
1681
+ },
1682
+
1683
+ scrolled: function () {
1684
+ if (w3c_slidy.toolbar && !w3c_slidy.ns_pos && !w3c_slidy.ie7)
1685
+ {
1686
+ w3c_slidy.hack_offset = w3c_slidy.scroll_x_offset();
1687
+ // hide toolbar
1688
+ w3c_slidy.toolbar.style.display = "none";
1689
+
1690
+ // make it reappear later
1691
+ if (w3c_slidy.scrollhack == 0 && !w3c_slidy.view_all)
1692
+ {
1693
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, 1000);
1694
+ w3c_slidy.scrollhack = 1;
1695
+ }
1696
+ }
1697
+ },
1698
+
1699
+ hide_toolbar: function () {
1700
+ w3c_slidy.add_class(w3c_slidy.toolbar, "hidden");
1701
+ window.focus();
1702
+ },
1703
+
1704
+ // used to ensure IE refreshes toolbar in correct position
1705
+ refresh_toolbar: function (interval) {
1706
+ if (!w3c_slidy.ns_pos && !w3c_slidy.ie7)
1707
+ {
1708
+ w3c_slidy.hide_toolbar();
1709
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, interval);
1710
+ }
1711
+ },
1712
+
1713
+ // restores toolbar after short delay
1714
+ show_toolbar: function () {
1715
+ if (w3c_slidy.want_toolbar)
1716
+ {
1717
+ w3c_slidy.toolbar.style.display = "block";
1718
+
1719
+ if (!w3c_slidy.ns_pos)
1720
+ {
1721
+ // adjust position to allow for scrolling
1722
+ var xoffset = w3c_slidy.scroll_x_offset();
1723
+ w3c_slidy.toolbar.style.left = xoffset;
1724
+ w3c_slidy.toolbar.style.right = xoffset;
1725
+
1726
+ // determine vertical scroll offset
1727
+ //var yoffset = scrollYOffset();
1728
+
1729
+ // bottom is doc height - window height - scroll offset
1730
+ //var bottom = documentHeight() - lastHeight - yoffset
1731
+
1732
+ //if (yoffset > 0 || documentHeight() > lastHeight)
1733
+ // bottom += 16; // allow for height of scrollbar
1734
+
1735
+ w3c_slidy.toolbar.style.bottom = 0; //bottom;
1736
+ }
1737
+
1738
+ w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden");
1739
+ }
1740
+
1741
+ w3c_slidy.scrollhack = 0;
1742
+
1743
+
1744
+ // set the keyboard focus to the help link on the
1745
+ // toolbar to ensure that document has the focus
1746
+ // IE doesn't always work with window.focus()
1747
+ // and this hack has benefit of Enter for help
1748
+
1749
+ try
1750
+ {
1751
+ if (!w3c_slidy.opera)
1752
+ w3c_slidy.help_anchor.focus();
1753
+ }
1754
+ catch (e)
1755
+ {
1756
+ }
1757
+ },
1758
+
1759
+ // invoked via F key
1760
+ toggle_toolbar: function () {
1761
+ if (!w3c_slidy.view_all)
1762
+ {
1763
+ if (w3c_slidy.has_class(w3c_slidy.toolbar, "hidden"))
1764
+ {
1765
+ w3c_slidy.remove_class(w3c_slidy.toolbar, "hidden")
1766
+ w3c_slidy.want_toolbar = 1;
1767
+ }
1768
+ else
1769
+ {
1770
+ w3c_slidy.add_class(w3c_slidy.toolbar, "hidden")
1771
+ w3c_slidy.want_toolbar = 0;
1772
+ }
1773
+ }
1774
+ },
1775
+
1776
+ scroll_x_offset: function () {
1777
+ if (window.pageXOffset)
1778
+ return self.pageXOffset;
1779
+
1780
+ if (document.documentElement &&
1781
+ document.documentElement.scrollLeft)
1782
+ return document.documentElement.scrollLeft;
1783
+
1784
+ if (document.body)
1785
+ return document.body.scrollLeft;
1786
+
1787
+ return 0;
1788
+ },
1789
+
1790
+ scroll_y_offset: function () {
1791
+ if (window.pageYOffset)
1792
+ return self.pageYOffset;
1793
+
1794
+ if (document.documentElement &&
1795
+ document.documentElement.scrollTop)
1796
+ return document.documentElement.scrollTop;
1797
+
1798
+ if (document.body)
1799
+ return document.body.scrollTop;
1800
+
1801
+ return 0;
1802
+ },
1803
+
1804
+ // looking for a way to determine height of slide content
1805
+ // the slide itself is set to the height of the window
1806
+ optimize_font_size: function () {
1807
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
1808
+
1809
+ //var dh = documentHeight(); //getDocHeight(document);
1810
+ var dh = slide.scrollHeight;
1811
+ var wh = getWindowHeight();
1812
+ var u = 100 * dh / wh;
1813
+
1814
+ alert("window utilization = " + u + "% (doc "
1815
+ + dh + " win " + wh + ")");
1816
+ },
1817
+
1818
+ // from document object
1819
+ get_doc_height: function (doc) {
1820
+ if (!doc)
1821
+ doc = document;
1822
+
1823
+ if (doc && doc.body && doc.body.offsetHeight)
1824
+ return doc.body.offsetHeight; // ns/gecko syntax
1825
+
1826
+ if (doc && doc.body && doc.body.scrollHeight)
1827
+ return doc.body.scrollHeight;
1828
+
1829
+ alert("couldn't determine document height");
1830
+ },
1831
+
1832
+ get_window_height: function () {
1833
+ if ( typeof( window.innerHeight ) == 'number' )
1834
+ return window.innerHeight; // Non IE browser
1835
+
1836
+ if (document.documentElement && document.documentElement.clientHeight)
1837
+ return document.documentElement.clientHeight; // IE6
1838
+
1839
+ if (document.body && document.body.clientHeight)
1840
+ return document.body.clientHeight; // IE4
1841
+ },
1842
+
1843
+ document_height: function () {
1844
+ var sh, oh;
1845
+
1846
+ sh = document.body.scrollHeight;
1847
+ oh = document.body.offsetHeight;
1848
+
1849
+ if (sh && oh)
1850
+ {
1851
+ return (sh > oh ? sh : oh);
1852
+ }
1853
+
1854
+ // no idea!
1855
+ return 0;
1856
+ },
1857
+
1858
+ smaller: function () {
1859
+ if (w3c_slidy.size_index > 0)
1860
+ {
1861
+ --w3c_slidy.size_index;
1862
+ }
1863
+
1864
+ w3c_slidy.toolbar.style.display = "none";
1865
+ document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];
1866
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
1867
+ w3c_slidy.hide_slide(slide);
1868
+ w3c_slidy.show_slide(slide);
1869
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);
1870
+ },
1871
+
1872
+ bigger: function () {
1873
+ if (w3c_slidy.size_index < w3c_slidy.sizes.length - 1)
1874
+ {
1875
+ ++w3c_slidy.size_index;
1876
+ }
1877
+
1878
+ w3c_slidy.toolbar.style.display = "none";
1879
+ document.body.style.fontSize = w3c_slidy.sizes[w3c_slidy.size_index];
1880
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
1881
+ w3c_slidy.hide_slide(slide);
1882
+ w3c_slidy.show_slide(slide);
1883
+ setTimeout(function () {w3c_slidy.show_toolbar(); }, 50);
1884
+ },
1885
+
1886
+ // enables cross browser use of relative width/height
1887
+ // on object elements for use with SVG and Flash media
1888
+ // with thanks to Ivan Herman for the suggestion
1889
+ adjust_object_dimensions: function (width, height) {
1890
+ for( var i = 0; i < w3c_slidy.objects.length; i++ )
1891
+ {
1892
+ var obj = this.objects[i];
1893
+ var mimeType = obj.getAttribute("type");
1894
+
1895
+ if (mimeType == "image/svg+xml" || mimeType == "application/x-shockwave-flash")
1896
+ {
1897
+ if ( !obj.initialWidth )
1898
+ obj.initialWidth = obj.getAttribute("width");
1899
+
1900
+ if ( !obj.initialHeight )
1901
+ obj.initialHeight = obj.getAttribute("height");
1902
+
1903
+ if ( obj.initialWidth && obj.initialWidth.charAt(obj.initialWidth.length-1) == "%" )
1904
+ {
1905
+ var w = parseInt(obj.initialWidth.slice(0, obj.initialWidth.length-1));
1906
+ var newW = width * (w/100.0);
1907
+ obj.setAttribute("width",newW);
1908
+ }
1909
+
1910
+ if ( obj.initialHeight &&
1911
+ obj.initialHeight.charAt(obj.initialHeight.length-1) == "%" )
1912
+ {
1913
+ var h = parseInt(obj.initialHeight.slice(0, obj.initialHeight.length-1));
1914
+ var newH = height * (h/100.0);
1915
+ obj.setAttribute("height", newH);
1916
+ }
1917
+ }
1918
+ }
1919
+ },
1920
+
1921
+ // needed for Opera to inhibit default behavior
1922
+ // since Opera delivers keyPress even if keyDown
1923
+ // was cancelled
1924
+ key_press: function (event) {
1925
+ if (!event)
1926
+ event = window.event;
1927
+
1928
+ if (!w3c_slidy.key_wanted)
1929
+ return w3c_slidy.cancel(event);
1930
+
1931
+ return true;
1932
+ },
1933
+
1934
+ // See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes
1935
+ key_down: function (event) {
1936
+ var key, target, tag;
1937
+
1938
+ w3c_slidy.key_wanted = true;
1939
+
1940
+ if (!event)
1941
+ event = window.event;
1942
+
1943
+ // kludge around NS/IE differences
1944
+ if (window.event)
1945
+ {
1946
+ key = window.event.keyCode;
1947
+ target = window.event.srcElement;
1948
+ }
1949
+ else if (event.which)
1950
+ {
1951
+ key = event.which;
1952
+ target = event.target;
1953
+ }
1954
+ else
1955
+ return true; // Yikes! unknown browser
1956
+
1957
+ // ignore event if key value is zero
1958
+ // as for alt on Opera and Konqueror
1959
+ if (!key)
1960
+ return true;
1961
+
1962
+ // avoid interfering with keystroke
1963
+ // behavior for non-slidy chrome elements
1964
+ if (!w3c_slidy.slidy_chrome(target) &&
1965
+ w3c_slidy.special_element(target))
1966
+ return true;
1967
+
1968
+ // check for concurrent control/command/alt key
1969
+ // but are these only present on mouse events?
1970
+
1971
+ if (event.ctrlKey || event.altKey || event.metaKey)
1972
+ return true;
1973
+
1974
+ // dismiss table of contents if visible
1975
+ if (w3c_slidy.is_shown_toc() && key != 9 && key != 16 && key != 38 && key != 40)
1976
+ {
1977
+ w3c_slidy.hide_table_of_contents(true);
1978
+
1979
+ if (key == 27 || key == 84 || key == 67)
1980
+ return w3c_slidy.cancel(event);
1981
+ }
1982
+
1983
+ if (key == 34) // Page Down
1984
+ {
1985
+ if (w3c_slidy.view_all)
1986
+ return true;
1987
+
1988
+ w3c_slidy.next_slide(false);
1989
+ return w3c_slidy.cancel(event);
1990
+ }
1991
+ else if (key == 33) // Page Up
1992
+ {
1993
+ if (w3c_slidy.view_all)
1994
+ return true;
1995
+
1996
+ w3c_slidy.previous_slide(false);
1997
+ return w3c_slidy.cancel(event);
1998
+ }
1999
+ else if (key == 32) // space bar
2000
+ {
2001
+ w3c_slidy.next_slide(true);
2002
+ return w3c_slidy.cancel(event);
2003
+ }
2004
+ else if (key == 37) // Left arrow
2005
+ {
2006
+ w3c_slidy.previous_slide(!event.shiftKey);
2007
+ return w3c_slidy.cancel(event);
2008
+ }
2009
+ else if (key == 36) // Home
2010
+ {
2011
+ w3c_slidy.first_slide();
2012
+ return w3c_slidy.cancel(event);
2013
+ }
2014
+ else if (key == 35) // End
2015
+ {
2016
+ w3c_slidy.last_slide();
2017
+ return w3c_slidy.cancel(event);
2018
+ }
2019
+ else if (key == 39) // Right arrow
2020
+ {
2021
+ w3c_slidy.next_slide(!event.shiftKey);
2022
+ return w3c_slidy.cancel(event);
2023
+ }
2024
+ else if (key == 13) // Enter
2025
+ {
2026
+ if (w3c_slidy.outline)
2027
+ {
2028
+ if (w3c_slidy.outline.visible)
2029
+ w3c_slidy.fold(w3c_slidy.outline);
2030
+ else
2031
+ w3c_slidy.unfold(w3c_slidy.outline);
2032
+
2033
+ return w3c_slidy.cancel(event);
2034
+ }
2035
+ }
2036
+ else if (key == 188) // < for smaller fonts
2037
+ {
2038
+ w3c_slidy.smaller();
2039
+ return w3c_slidy.cancel(event);
2040
+ }
2041
+ else if (key == 190) // > for larger fonts
2042
+ {
2043
+ w3c_slidy.bigger();
2044
+ return w3c_slidy.cancel(event);
2045
+ }
2046
+ else if (key == 189 || key == 109) // - for smaller fonts
2047
+ {
2048
+ w3c_slidy.smaller();
2049
+ return w3c_slidy.cancel(event);
2050
+ }
2051
+ else if (key == 187 || key == 191 || key == 107) // = + for larger fonts
2052
+ {
2053
+ w3c_slidy.bigger();
2054
+ return w3c_slidy.cancel(event);
2055
+ }
2056
+ else if (key == 83) // S for smaller fonts
2057
+ {
2058
+ w3c_slidy.smaller();
2059
+ return w3c_slidy.cancel(event);
2060
+ }
2061
+ else if (key == 66) // B for larger fonts
2062
+ {
2063
+ w3c_slidy.bigger();
2064
+ return w3c_slidy.cancel(event);
2065
+ }
2066
+ else if (key == 90) // Z for last slide
2067
+ {
2068
+ w3c_slidy.last_slide();
2069
+ return w3c_slidy.cancel(event);
2070
+ }
2071
+ else if (key == 70) // F for toggle toolbar
2072
+ {
2073
+ w3c_slidy.toggle_toolbar();
2074
+ return w3c_slidy.cancel(event);
2075
+ }
2076
+ else if (key == 65) // A for toggle view single/all slides
2077
+ {
2078
+ w3c_slidy.toggle_view();
2079
+ return w3c_slidy.cancel(event);
2080
+ }
2081
+ else if (key == 75) // toggle action of left click for next page
2082
+ {
2083
+ w3c_slidy.mouse_click_enabled = !w3c_slidy.mouse_click_enabled;
2084
+ var alert_msg = (w3c_slidy.mouse_click_enabled ?
2085
+ "enabled" : "disabled") + " mouse click advance";
2086
+
2087
+ alert(w3c_slidy.localize(alert_msg));
2088
+ return w3c_slidy.cancel(event);
2089
+ }
2090
+ else if (key == 84 || key == 67) // T or C for table of contents
2091
+ {
2092
+ if (w3c_slidy.toc)
2093
+ w3c_slidy.toggle_table_of_contents();
2094
+
2095
+ return w3c_slidy.cancel(event);
2096
+ }
2097
+ else if (key == 72) // H for help
2098
+ {
2099
+ window.location = w3c_slidy.help_page;
2100
+ return w3c_slidy.cancel(event);
2101
+ }
2102
+ //else alert("key code is "+ key);
2103
+
2104
+ return true;
2105
+ },
2106
+
2107
+ // safe for both text/html and application/xhtml+xml
2108
+ create_element: function (name) {
2109
+ if (this.xhtml && (typeof document.createElementNS != 'undefined'))
2110
+ return document.createElementNS("http://www.w3.org/1999/xhtml", name)
2111
+
2112
+ return document.createElement(name);
2113
+ },
2114
+
2115
+ get_element_style: function (elem, IEStyleProp, CSSStyleProp) {
2116
+ if (elem.currentStyle)
2117
+ {
2118
+ return elem.currentStyle[IEStyleProp];
2119
+ }
2120
+ else if (window.getComputedStyle)
2121
+ {
2122
+ var compStyle = window.getComputedStyle(elem, "");
2123
+ return compStyle.getPropertyValue(CSSStyleProp);
2124
+ }
2125
+ return "";
2126
+ },
2127
+
2128
+ // the string str is a whitespace separated list of tokens
2129
+ // test if str contains a particular token, e.g. "slide"
2130
+ has_token: function (str, token) {
2131
+ if (str)
2132
+ {
2133
+ // define pattern as regular expression
2134
+ var pattern = /\w+/g;
2135
+
2136
+ // check for matches
2137
+ // place result in array
2138
+ var result = str.match(pattern);
2139
+
2140
+ // now check if desired token is present
2141
+ for (var i = 0; i < result.length; i++)
2142
+ {
2143
+ if (result[i] == token)
2144
+ return true;
2145
+ }
2146
+ }
2147
+
2148
+ return false;
2149
+ },
2150
+
2151
+ get_class_list: function (element) {
2152
+ if (typeof element.className != 'undefined')
2153
+ return element.className;
2154
+
2155
+ return element.getAttribute("class");
2156
+ },
2157
+
2158
+ has_class: function (element, name) {
2159
+ if (element.nodeType != 1)
2160
+ return false;
2161
+
2162
+ var regexp = new RegExp("(^| )" + name + "\W*");
2163
+
2164
+ if (typeof element.className != 'undefined')
2165
+ return regexp.test(element.className);
2166
+
2167
+ return regexp.test(element.getAttribute("class"));
2168
+ },
2169
+
2170
+ remove_class: function (element, name) {
2171
+ var regexp = new RegExp("(^| )" + name + "\W*");
2172
+ var clsval = "";
2173
+
2174
+ if (typeof element.className != 'undefined')
2175
+ {
2176
+ clsval = element.className;
2177
+
2178
+ if (clsval)
2179
+ {
2180
+ clsval = clsval.replace(regexp, "");
2181
+ element.className = clsval;
2182
+ }
2183
+ }
2184
+ else
2185
+ {
2186
+ clsval = element.getAttribute("class");
2187
+
2188
+ if (clsval)
2189
+ {
2190
+ clsval = clsval.replace(regexp, "");
2191
+ element.setAttribute("class", clsval);
2192
+ }
2193
+ }
2194
+ },
2195
+
2196
+ add_class: function (element, name) {
2197
+ if (!this.has_class(element, name))
2198
+ {
2199
+ if (typeof element.className != 'undefined')
2200
+ element.className += " " + name;
2201
+ else
2202
+ {
2203
+ var clsval = element.getAttribute("class");
2204
+ clsval = clsval ? clsval + " " + name : name;
2205
+ element.setAttribute("class", clsval);
2206
+ }
2207
+ }
2208
+ },
2209
+
2210
+ // HTML elements that can be used with class="incremental"
2211
+ // note that you can also put the class on containers like
2212
+ // up, ol, dl, and div to make their contents appear
2213
+ // incrementally. Upper case is used since this is what
2214
+ // browsers report for HTML node names (text/html).
2215
+ incremental_elements: null,
2216
+ okay_for_incremental: function (name) {
2217
+ if (!this.incremental_elements)
2218
+ {
2219
+ var inclist = new Array();
2220
+ inclist["p"] = true;
2221
+ inclist["pre"] = true;
2222
+ inclist["li"] = true;
2223
+ inclist["blockquote"] = true;
2224
+ inclist["dt"] = true;
2225
+ inclist["dd"] = true;
2226
+ inclist["h2"] = true;
2227
+ inclist["h3"] = true;
2228
+ inclist["h4"] = true;
2229
+ inclist["h5"] = true;
2230
+ inclist["h6"] = true;
2231
+ inclist["span"] = true;
2232
+ inclist["address"] = true;
2233
+ inclist["table"] = true;
2234
+ inclist["tr"] = true;
2235
+ inclist["th"] = true;
2236
+ inclist["td"] = true;
2237
+ inclist["img"] = true;
2238
+ inclist["object"] = true;
2239
+ this.incremental_elements = inclist;
2240
+ }
2241
+ return this.incremental_elements[name.toLowerCase()];
2242
+ },
2243
+
2244
+ next_incremental_item: function (node) {
2245
+ var br = this.is_xhtml ? "br" : "BR";
2246
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
2247
+
2248
+ for (;;)
2249
+ {
2250
+ node = w3c_slidy.next_node(slide, node);
2251
+
2252
+ if (node == null || node.parentNode == null)
2253
+ break;
2254
+
2255
+ if (node.nodeType == 1) // ELEMENT
2256
+ {
2257
+ if (node.nodeName == br)
2258
+ continue;
2259
+
2260
+ if (w3c_slidy.has_class(node, "incremental")
2261
+ && w3c_slidy.okay_for_incremental(node.nodeName))
2262
+ return node;
2263
+
2264
+ if (w3c_slidy.has_class(node.parentNode, "incremental")
2265
+ && !w3c_slidy.has_class(node, "non-incremental"))
2266
+ return node;
2267
+ }
2268
+ }
2269
+
2270
+ return node;
2271
+ },
2272
+
2273
+ previous_incremental_item: function (node) {
2274
+ var br = this.is_xhtml ? "br" : "BR";
2275
+ var slide = w3c_slidy.slides[w3c_slidy.slide_number];
2276
+
2277
+ for (;;)
2278
+ {
2279
+ node = w3c_slidy.previous_node(slide, node);
2280
+
2281
+ if (node == null || node.parentNode == null)
2282
+ break;
2283
+
2284
+ if (node.nodeType == 1)
2285
+ {
2286
+ if (node.nodeName == br)
2287
+ continue;
2288
+
2289
+ if (w3c_slidy.has_class(node, "incremental")
2290
+ && w3c_slidy.okay_for_incremental(node.nodeName))
2291
+ return node;
2292
+
2293
+ if (w3c_slidy.has_class(node.parentNode, "incremental")
2294
+ && !w3c_slidy.has_class(node, "non-incremental"))
2295
+ return node;
2296
+ }
2297
+ }
2298
+
2299
+ return node;
2300
+ },
2301
+
2302
+ // set visibility for all elements on current slide with
2303
+ // a parent element with attribute class="incremental"
2304
+ set_visibility_all_incremental: function (value) {
2305
+ var node = this.next_incremental_item(null);
2306
+
2307
+ if (value == "hidden")
2308
+ {
2309
+ while (node)
2310
+ {
2311
+ w3c_slidy.add_class(node, "invisible");
2312
+ node = w3c_slidy.next_incremental_item(node);
2313
+ }
2314
+ }
2315
+ else // value == "visible"
2316
+ {
2317
+ while (node)
2318
+ {
2319
+ w3c_slidy.remove_class(node, "invisible");
2320
+ node = w3c_slidy.next_incremental_item(node);
2321
+ }
2322
+ }
2323
+ },
2324
+
2325
+ // reveal the next hidden item on the slide
2326
+ // node is null or the node that was last revealed
2327
+ reveal_next_item: function (node) {
2328
+ node = w3c_slidy.next_incremental_item(node);
2329
+
2330
+ if (node && node.nodeType == 1) // an element
2331
+ w3c_slidy.remove_class(node, "invisible");
2332
+
2333
+ return node;
2334
+ },
2335
+
2336
+ // exact inverse of revealNextItem(node)
2337
+ hide_previous_item: function (node) {
2338
+ if (node && node.nodeType == 1) // an element
2339
+ w3c_slidy.add_class(node, "invisible");
2340
+
2341
+ return this.previous_incremental_item(node);
2342
+ },
2343
+
2344
+ // left to right traversal of root's content
2345
+ next_node: function (root, node) {
2346
+ if (node == null)
2347
+ return root.firstChild;
2348
+
2349
+ if (node.firstChild)
2350
+ return node.firstChild;
2351
+
2352
+ if (node.nextSibling)
2353
+ return node.nextSibling;
2354
+
2355
+ for (;;)
2356
+ {
2357
+ node = node.parentNode;
2358
+
2359
+ if (!node || node == root)
2360
+ break;
2361
+
2362
+ if (node && node.nextSibling)
2363
+ return node.nextSibling;
2364
+ }
2365
+
2366
+ return null;
2367
+ },
2368
+
2369
+ // right to left traversal of root's content
2370
+ previous_node: function (root, node) {
2371
+ if (node == null)
2372
+ {
2373
+ node = root.lastChild;
2374
+
2375
+ if (node)
2376
+ {
2377
+ while (node.lastChild)
2378
+ node = node.lastChild;
2379
+ }
2380
+
2381
+ return node;
2382
+ }
2383
+
2384
+ if (node.previousSibling)
2385
+ {
2386
+ node = node.previousSibling;
2387
+
2388
+ while (node.lastChild)
2389
+ node = node.lastChild;
2390
+
2391
+ return node;
2392
+ }
2393
+
2394
+ if (node.parentNode != root)
2395
+ return node.parentNode;
2396
+
2397
+ return null;
2398
+ },
2399
+
2400
+ previous_sibling_element: function (el) {
2401
+ el = el.previousSibling;
2402
+
2403
+ while (el && el.nodeType != 1)
2404
+ el = el.previousSibling;
2405
+
2406
+ return el;
2407
+ },
2408
+
2409
+ next_sibling_element: function (el) {
2410
+ el = el.nextSibling;
2411
+
2412
+ while (el && el.nodeType != 1)
2413
+ el = el.nextSibling;
2414
+
2415
+ return el;
2416
+ },
2417
+
2418
+ first_child_element: function (el) {
2419
+ var node;
2420
+
2421
+ for (node = el.firstChild; node; node = node.nextSibling)
2422
+ {
2423
+ if (node.nodeType == 1)
2424
+ break;
2425
+ }
2426
+
2427
+ return node;
2428
+ },
2429
+
2430
+ first_tag: function (element, tag) {
2431
+ var node;
2432
+
2433
+ if (!this.is_xhtml)
2434
+ tag = tag.toUpperCase();
2435
+
2436
+ for (node = element.firstChild; node; node = node.nextSibling)
2437
+ {
2438
+ if (node.nodeType == 1 && node.nodeName == tag)
2439
+ break;
2440
+ }
2441
+
2442
+ return node;
2443
+ },
2444
+
2445
+ hide_selection: function () {
2446
+ if (window.getSelection) // Firefox, Chromium, Safari, Opera
2447
+ {
2448
+ var selection = window.getSelection();
2449
+
2450
+ if (selection.rangeCount > 0)
2451
+ {
2452
+ var range = selection.getRangeAt(0);
2453
+ range.collapse (false);
2454
+ }
2455
+ }
2456
+ else // Internet Explorer
2457
+ {
2458
+ var textRange = document.selection.createRange ();
2459
+ textRange.collapse (false);
2460
+ }
2461
+ },
2462
+
2463
+ get_selected_text: function () {
2464
+ try
2465
+ {
2466
+ if (window.getSelection)
2467
+ return window.getSelection().toString();
2468
+
2469
+ if (document.getSelection)
2470
+ return document.getSelection().toString();
2471
+
2472
+ if (document.selection)
2473
+ return document.selection.createRange().text;
2474
+ }
2475
+ catch (e)
2476
+ {
2477
+ }
2478
+
2479
+ return "";
2480
+ },
2481
+
2482
+ // make note of length of selected text
2483
+ // as this evaluates to zero in click event
2484
+ mouse_button_up: function (e) {
2485
+ w3c_slidy.selected_text_len = w3c_slidy.get_selected_text().length;
2486
+ },
2487
+
2488
+ // right mouse button click is reserved for context menus
2489
+ // it is more reliable to detect rightclick than leftclick
2490
+ mouse_button_click: function (e) {
2491
+ var rightclick = false;
2492
+ var leftclick = false;
2493
+ var middleclick = false;
2494
+ var target;
2495
+
2496
+ if (!e)
2497
+ var e = window.event;
2498
+
2499
+ if (e.target)
2500
+ target = e.target;
2501
+ else if (e.srcElement)
2502
+ target = e.srcElement;
2503
+
2504
+ // work around Safari bug
2505
+ if (target.nodeType == 3)
2506
+ target = target.parentNode;
2507
+
2508
+ if (e.which) // all browsers except IE
2509
+ {
2510
+ leftclick = (e.which == 1);
2511
+ middleclick = (e.which == 2);
2512
+ rightclick = (e.which == 3);
2513
+ }
2514
+ else if (e.button)
2515
+ {
2516
+ // Konqueror gives 1 for left, 4 for middle
2517
+ // IE6 gives 0 for left and not 1 as I expected
2518
+
2519
+ if (e.button == 4)
2520
+ middleclick = true;
2521
+
2522
+ // all browsers agree on 2 for right button
2523
+ rightclick = (e.button == 2);
2524
+ }
2525
+ else
2526
+ leftclick = true;
2527
+
2528
+ if (w3c_slidy.selected_text_len > 0)
2529
+ {
2530
+ w3c_slidy.stop_propagation(e);
2531
+ e.cancel = true;
2532
+ e.returnValue = false;
2533
+ return false;
2534
+ }
2535
+
2536
+ // dismiss table of contents
2537
+ w3c_slidy.hide_table_of_contents(false);
2538
+
2539
+ // check if target is something that probably want's clicks
2540
+ // e.g. a, embed, object, input, textarea, select, option
2541
+ var tag = target.nodeName.toLowerCase();
2542
+
2543
+ if (w3c_slidy.mouse_click_enabled && leftclick &&
2544
+ !w3c_slidy.special_element(target) &&
2545
+ !target.onclick)
2546
+ {
2547
+ w3c_slidy.next_slide(true);
2548
+ w3c_slidy.stop_propagation(e);
2549
+ e.cancel = true;
2550
+ e.returnValue = false;
2551
+ return false;
2552
+ }
2553
+
2554
+ return true;
2555
+ },
2556
+
2557
+ special_element: function (e) {
2558
+ var tag = e.nodeName.toLowerCase();
2559
+
2560
+ return e.onkeydown ||
2561
+ e.onclick ||
2562
+ tag == "a" ||
2563
+ tag == "embed" ||
2564
+ tag == "object" ||
2565
+ tag == "video" ||
2566
+ tag == "audio" ||
2567
+ tag == "input" ||
2568
+ tag == "textarea" ||
2569
+ tag == "select" ||
2570
+ tag == "option";
2571
+ },
2572
+
2573
+ slidy_chrome: function (el) {
2574
+ while (el)
2575
+ {
2576
+ if (el == w3c_slidy.toc ||
2577
+ el == w3c_slidy.toolbar ||
2578
+ w3c_slidy.has_class(el, "outline"))
2579
+ return true;
2580
+
2581
+ el = el.parentNode;
2582
+ }
2583
+
2584
+ return false;
2585
+ },
2586
+
2587
+ get_key: function (e)
2588
+ {
2589
+ var key;
2590
+
2591
+ // kludge around NS/IE differences
2592
+ if (typeof window.event != "undefined")
2593
+ key = window.event.keyCode;
2594
+ else if (e.which)
2595
+ key = e.which;
2596
+
2597
+ return key;
2598
+ },
2599
+
2600
+ get_target: function (e) {
2601
+ var target;
2602
+
2603
+ if (!e)
2604
+ e = window.event;
2605
+
2606
+ if (e.target)
2607
+ target = e.target;
2608
+ else if (e.srcElement)
2609
+ target = e.srcElement;
2610
+
2611
+ if (target.nodeType != 1)
2612
+ target = target.parentNode;
2613
+
2614
+ return target;
2615
+ },
2616
+
2617
+ // does display property provide correct defaults?
2618
+ is_block: function (elem) {
2619
+ var tag = elem.nodeName.toLowerCase();
2620
+
2621
+ return tag == "ol" || tag == "ul" || tag == "p" ||
2622
+ tag == "li" || tag == "table" || tag == "pre" ||
2623
+ tag == "h1" || tag == "h2" || tag == "h3" ||
2624
+ tag == "h4" || tag == "h5" || tag == "h6" ||
2625
+ tag == "blockquote" || tag == "address";
2626
+ },
2627
+
2628
+ add_listener: function (element, event, handler) {
2629
+ if (window.addEventListener)
2630
+ element.addEventListener(event, handler, false);
2631
+ else
2632
+ element.attachEvent("on"+event, handler);
2633
+ },
2634
+
2635
+ // used to prevent event propagation from field controls
2636
+ stop_propagation: function (event) {
2637
+ event = event ? event : window.event;
2638
+ event.cancelBubble = true; // for IE
2639
+
2640
+ if (event.stopPropagation)
2641
+ event.stopPropagation();
2642
+
2643
+ return true;
2644
+ },
2645
+
2646
+ cancel: function (event) {
2647
+ if (event)
2648
+ {
2649
+ event.cancel = true;
2650
+ event.returnValue = false;
2651
+
2652
+ if (event.preventDefault)
2653
+ event.preventDefault();
2654
+ }
2655
+
2656
+ w3c_slidy.key_wanted = false;
2657
+ return false;
2658
+ },
2659
+
2660
+ // for each language define an associative array
2661
+ // and also the help text which is longer
2662
+
2663
+ strings_es: {
2664
+ "slide":"pág.",
2665
+ "help?":"Ayuda",
2666
+ "contents?":"Índice",
2667
+ "table of contents":"tabla de contenidos",
2668
+ "Table of Contents":"Tabla de Contenidos",
2669
+ "restart presentation":"Reiniciar presentación",
2670
+ "restart?":"Inicio"
2671
+ },
2672
+ help_es:
2673
+ "Utilice el ratón, barra espaciadora, teclas Izda/Dcha, " +
2674
+ "o Re pág y Av pág. Use S y B para cambiar el tamaño de fuente.",
2675
+
2676
+ strings_ca: {
2677
+ "slide":"pàg..",
2678
+ "help?":"Ajuda",
2679
+ "contents?":"Índex",
2680
+ "table of contents":"taula de continguts",
2681
+ "Table of Contents":"Taula de Continguts",
2682
+ "restart presentation":"Reiniciar presentació",
2683
+ "restart?":"Inici"
2684
+ },
2685
+ help_ca:
2686
+ "Utilitzi el ratolí, barra espaiadora, tecles Esq./Dta. " +
2687
+ "o Re pàg y Av pàg. Usi S i B per canviar grandària de font.",
2688
+
2689
+ strings_cs: {
2690
+ "slide":"snímek",
2691
+ "help?":"nápověda",
2692
+ "contents?":"obsah",
2693
+ "table of contents":"obsah prezentace",
2694
+ "Table of Contents":"Obsah prezentace",
2695
+ "restart presentation":"znovu spustit prezentaci",
2696
+ "restart?":"restart"
2697
+ },
2698
+ help_cs:
2699
+ "Prezentaci můžete procházet pomocí kliknutí myši, mezerníku, " +
2700
+ "šipek vlevo a vpravo nebo kláves PageUp a PageDown. Písmo se " +
2701
+ "dá zvětšit a zmenšit pomocí kláves B a S.",
2702
+
2703
+ strings_nl: {
2704
+ "slide":"pagina",
2705
+ "help?":"Help?",
2706
+ "contents?":"Inhoud?",
2707
+ "table of contents":"inhoudsopgave",
2708
+ "Table of Contents":"Inhoudsopgave",
2709
+ "restart presentation":"herstart presentatie",
2710
+ "restart?":"Herstart?"
2711
+ },
2712
+ help_nl:
2713
+ "Navigeer d.m.v. het muis, spatiebar, Links/Rechts toetsen, " +
2714
+ "of PgUp en PgDn. Gebruik S en B om de karaktergrootte te veranderen.",
2715
+
2716
+ strings_de: {
2717
+ "slide":"Seite",
2718
+ "help?":"Hilfe",
2719
+ "contents?":"Übersicht",
2720
+ "table of contents":"Inhaltsverzeichnis",
2721
+ "Table of Contents":"Inhaltsverzeichnis",
2722
+ "restart presentation":"Präsentation neu starten",
2723
+ "restart?":"Neustart"
2724
+ },
2725
+ help_de:
2726
+ "Benutzen Sie die Maus, Leerschlag, die Cursortasten links/rechts oder " +
2727
+ "Page up/Page Down zum Wechseln der Seiten und S und B für die Schriftgrösse.",
2728
+
2729
+ strings_pl: {
2730
+ "slide":"slajd",
2731
+ "help?":"pomoc?",
2732
+ "contents?":"spis treści?",
2733
+ "table of contents":"spis treści",
2734
+ "Table of Contents":"Spis Treści",
2735
+ "restart presentation":"Restartuj prezentację",
2736
+ "restart?":"restart?"
2737
+ },
2738
+ help_pl:
2739
+ "Zmieniaj slajdy klikając myszą, naciskając spację, strzałki lewo/prawo" +
2740
+ "lub PgUp / PgDn. Użyj klawiszy S i B, aby zmienić rozmiar czczionki.",
2741
+
2742
+ strings_fr: {
2743
+ "slide":"page",
2744
+ "help?":"Aide",
2745
+ "contents?":"Index",
2746
+ "table of contents":"table des matières",
2747
+ "Table of Contents":"Table des matières",
2748
+ "restart presentation":"Recommencer l'exposé",
2749
+ "restart?":"Début"
2750
+ },
2751
+ help_fr:
2752
+ "Naviguez avec la souris, la barre d'espace, les flèches " +
2753
+ "gauche/droite ou les touches Pg Up, Pg Dn. Utilisez " +
2754
+ "les touches S et B pour modifier la taille de la police.",
2755
+
2756
+ strings_hu: {
2757
+ "slide":"oldal",
2758
+ "help?":"segítség",
2759
+ "contents?":"tartalom",
2760
+ "table of contents":"tartalomjegyzék",
2761
+ "Table of Contents":"Tartalomjegyzék",
2762
+ "restart presentation":"bemutató újraindítása",
2763
+ "restart?":"újraindítás"
2764
+ },
2765
+ help_hu:
2766
+ "Az oldalak közti lépkedéshez kattintson az egérrel, vagy " +
2767
+ "használja a szóköz, a bal, vagy a jobb nyíl, illetve a Page Down, " +
2768
+ "Page Up billentyűket. Az S és a B billentyűkkel változtathatja " +
2769
+ "a szöveg méretét.",
2770
+
2771
+ strings_it: {
2772
+ "slide":"pag.",
2773
+ "help?":"Aiuto",
2774
+ "contents?":"Indice",
2775
+ "table of contents":"indice",
2776
+ "Table of Contents":"Indice",
2777
+ "restart presentation":"Ricominciare la presentazione",
2778
+ "restart?":"Inizio"
2779
+ },
2780
+ help_it:
2781
+ "Navigare con mouse, barra spazio, frecce sinistra/destra o " +
2782
+ "PgUp e PgDn. Usare S e B per cambiare la dimensione dei caratteri.",
2783
+
2784
+ strings_el: {
2785
+ "slide":"σελίδα",
2786
+ "help?":"βοήθεια;",
2787
+ "contents?":"περιεχόμενα;",
2788
+ "table of contents":"πίνακας περιεχομένων",
2789
+ "Table of Contents":"Πίνακας Περιεχομένων",
2790
+ "restart presentation":"επανεκκίνηση παρουσίασης",
2791
+ "restart?":"επανεκκίνηση;"
2792
+ },
2793
+ help_el:
2794
+ "Πλοηγηθείτε με το κλίκ του ποντικιού, το space, τα βέλη αριστερά/δεξιά, " +
2795
+ "ή Page Up και Page Down. Χρησιμοποιήστε τα πλήκτρα S και B για να αλλάξετε " +
2796
+ "το μέγεθος της γραμματοσειράς.",
2797
+
2798
+ strings_ja: {
2799
+ "slide":"スライド",
2800
+ "help?":"ヘルプ",
2801
+ "contents?":"目次",
2802
+ "table of contents":"目次を表示",
2803
+ "Table of Contents":"目次",
2804
+ "restart presentation":"最初から再生",
2805
+ "restart?":"最初から"
2806
+ },
2807
+ help_ja:
2808
+ "マウス左クリック ・ スペース ・ 左右キー " +
2809
+ "または Page Up ・ Page Downで操作, S ・ Bでフォントサイズ変更",
2810
+
2811
+ strings_zh: {
2812
+ "slide":"幻灯片",
2813
+ "help?":"帮助?",
2814
+ "contents?":"内容?",
2815
+ "table of contents":"目录",
2816
+ "Table of Contents":"目录",
2817
+ "restart presentation":"重新启动展示",
2818
+ "restart?":"重新启动?"
2819
+ },
2820
+ help_zh:
2821
+ "用鼠标点击, 空格条, 左右箭头, Pg Up 和 Pg Dn 导航. " +
2822
+ "用 S, B 改变字体大小.",
2823
+
2824
+ strings_ru: {
2825
+ "slide":"слайд",
2826
+ "help?":"помощь?",
2827
+ "contents?":"содержание?",
2828
+ "table of contents":"оглавление",
2829
+ "Table of Contents":"Оглавление",
2830
+ "restart presentation":"перезапустить презентацию",
2831
+ "restart?":"перезапуск?"
2832
+ },
2833
+ help_ru:
2834
+ "Перемещайтесь кликая мышкой, используя клавишу пробел, стрелки" +
2835
+ "влево/вправо или Pg Up и Pg Dn. Клавиши S и B меняют размер шрифта.",
2836
+
2837
+ strings_sv: {
2838
+ "slide":"sida",
2839
+ "help?":"hjälp",
2840
+ "contents?":"innehåll",
2841
+ "table of contents":"innehållsförteckning",
2842
+ "Table of Contents":"Innehållsförteckning",
2843
+ "restart presentation":"visa presentationen från början",
2844
+ "restart?":"börja om"
2845
+ },
2846
+ help_sv:
2847
+ "Bläddra med ett klick med vänstra musknappen, mellanslagstangenten, " +
2848
+ "vänster- och högerpiltangenterna eller tangenterna Pg Up, Pg Dn. " +
2849
+ "Använd tangenterna S och B för att ändra textens storlek.",
2850
+
2851
+ strings: { },
2852
+
2853
+ localize: function (src) {
2854
+ if (src == "")
2855
+ return src;
2856
+
2857
+ // try full language code, e.g. en-US
2858
+ var s, lookup = w3c_slidy.strings[w3c_slidy.lang];
2859
+
2860
+ if (lookup)
2861
+ {
2862
+ s = lookup[src];
2863
+
2864
+ if (s)
2865
+ return s;
2866
+ }
2867
+
2868
+ // strip country code suffix, e.g.
2869
+ // try en if undefined for en-US
2870
+ var lg = w3c_slidy.lang.split("-");
2871
+
2872
+ if (lg.length > 1)
2873
+ {
2874
+ lookup = w3c_slidy.strings[lg[0]];
2875
+
2876
+ if (lookup)
2877
+ {
2878
+ s = lookup[src];
2879
+
2880
+ if (s)
2881
+ return s;
2882
+ }
2883
+ }
2884
+
2885
+ // otherwise string as is
2886
+ return src;
2887
+ },
2888
+
2889
+ init_localization: function () {
2890
+ var i18n = w3c_slidy;
2891
+ var help_text = w3c_slidy.help_text;
2892
+
2893
+ // each such language array is declared in the localize array
2894
+ // this is used as in w3c_slidy.localize("foo");
2895
+ this.strings = {
2896
+ "es":this.strings_es,
2897
+ "ca":this.strings_ca,
2898
+ "cs":this.strings_cs,
2899
+ "nl":this.strings_nl,
2900
+ "de":this.strings_de,
2901
+ "pl":this.strings_pl,
2902
+ "fr":this.strings_fr,
2903
+ "hu":this.strings_hu,
2904
+ "it":this.strings_it,
2905
+ "el":this.strings_el,
2906
+ "jp":this.strings_ja,
2907
+ "zh":this.strings_zh,
2908
+ "ru":this.strings_ru,
2909
+ "sv":this.strings_sv
2910
+ },
2911
+
2912
+ i18n.strings_es[help_text] = i18n.help_es;
2913
+ i18n.strings_ca[help_text] = i18n.help_ca;
2914
+ i18n.strings_cs[help_text] = i18n.help_cs;
2915
+ i18n.strings_nl[help_text] = i18n.help_nl;
2916
+ i18n.strings_de[help_text] = i18n.help_de;
2917
+ i18n.strings_pl[help_text] = i18n.help_pl;
2918
+ i18n.strings_fr[help_text] = i18n.help_fr;
2919
+ i18n.strings_hu[help_text] = i18n.help_hu;
2920
+ i18n.strings_it[help_text] = i18n.help_it;
2921
+ i18n.strings_el[help_text] = i18n.help_el;
2922
+ i18n.strings_ja[help_text] = i18n.help_ja;
2923
+ i18n.strings_zh[help_text] = i18n.help_zh;
2924
+ i18n.strings_ru[help_text] = i18n.help_ru;
2925
+ i18n.strings_sv[help_text] = i18n.help_sv;
2926
+
2927
+ w3c_slidy.lang = document.body.parentNode.getAttribute("lang");
2928
+
2929
+ if (!w3c_slidy.lang)
2930
+ w3c_slidy.lang = document.body.parentNode.getAttribute("xml:lang");
2931
+
2932
+ if (!w3c_slidy.lang)
2933
+ w3c_slidy.lang = "en";
2934
+ }
2935
+ };
2936
+
2937
+ // hack for back button behavior
2938
+ if (w3c_slidy.ie6 || w3c_slidy.ie7)
2939
+ {
2940
+ document.write("<iframe id='historyFrame' " +
2941
+ "src='javascript:\"<html"+"></"+"html>\"' " +
2942
+ "height='1' width='1' " +
2943
+ "style='position:absolute;left:-800px'></iframe>");
2944
+ }
2945
+
2946
+ // attach event listeners for initialization
2947
+ w3c_slidy.set_up();
2948
+
2949
+ // hide the slides as soon as body element is available
2950
+ // to reduce annoying screen mess before the onload event
2951
+ setTimeout(w3c_slidy.hide_slides, 50);
2952
+