// after w3c slidy, http://www.w3.org/Talks/Tools/Slidy2/
var slidy = {
key_wanted: false,
slide_number: 0, // integer slide count: 0, 1, 2, ...
view_all: true, // true: view all slides + handouts
show_slide: function () {
window.scrollTo(0,0);
set_class(document.getElementsByTagName('body')[0].children[slidy.slide_number], "current");
},
switch_slide: function (event, n) {
if (slidy.view_all) {
return true;
} else {
var x = document.getElementsByTagName('body')[0].children;
if (n >= 0 && n < x.length && n != slidy.slide_number) {
set_class(x[slidy.slide_number], "");
slidy.slide_number = n;
slidy.show_slide();
}
return slidy.cancel(event);
}
},
// needed for Opera to inhibit default behavior
// since Opera delivers keyPress even if keyDown
// was cancelled
key_press: function (event) {
if (!event)
event = window.event;
if (!slidy.key_wanted)
return slidy.cancel(event);
return true;
},
// See e.g. http://www.quirksmode.org/js/events/keys.html for keycodes
key_down: function (event) {
var key, target, tag;
slidy.key_wanted = true;
if (!event)
event = window.event;
// kludge around NS/IE differences
if (window.event)
{
key = window.event.keyCode;
target = window.event.srcElement;
}
else if (event.which)
{
key = event.which;
target = event.target;
}
else
return true; // Yikes! unknown browser
// ignore event if key value is zero
// as for alt on Opera and Konqueror
if (!key)
return true;
if (slidy.special_element(target))
return true;
// check for concurrent control/command/alt key
// but are these only present on mouse events?
if (event.ctrlKey || event.altKey || event.metaKey)
return true;
if (key == 32 || key == 39) { // space bar, right arrow
slidy.switch_slide(event, slidy.slide_number + 1);
} else if (key == 37) { // left arrow
slidy.switch_slide(event, slidy.slide_number - 1);
} else if (key == 36) { // Home
slidy.switch_slide(event, 0);
} else if (key == 35) { // End
slidy.switch_slide(event, document.getElementsByTagName('body')[0].children.length - 1);
} else if (key == 65 && document.getElementsByTagName('body')[0].children.length > 3) { // A
var x = document.getElementsByTagName('body')[0].children;
if (slidy.view_all) {
set_class(document.getElementsByTagName('body')[0], "single_slide");
// var y = 0; //yTop();
// slidy.slide_number = 0;
// while (findDiff(x[slidy.slide_number])[1] < 0
// && slidy.slide_number < x.length - 1) {
// slidy.slide_number += 1;
// }
slidy.show_slide();
} else {
set_class(document.getElementsByTagName('body')[0], "");
x[slidy.slide_number].scrollIntoView();
// set_class(x[slidy.slide_number], "");
}
slidy.view_all = !slidy.view_all;
return slidy.cancel(event);
}
return true;
},
special_element: function (e) {
var tag = e.nodeName.toLowerCase();
return e.onkeydown ||
e.onclick ||
tag == "a" ||
tag == "embed" ||
tag == "object" ||
tag == "video" ||
tag == "audio" ||
tag == "input" ||
tag == "textarea" ||
tag == "select" ||
tag == "option";
},
cancel: function (event) {
if (event)
{
event.cancel = true;
event.returnValue = false;
if (event.preventDefault)
event.preventDefault();
}
slidy.key_wanted = false;
return false;
},
};
function set_class(element, name) {
if (typeof element.className != 'undefined') {
element.className = name;
} else {
element.setAttribute("class", name);
}
};
function add_listener(event, handler) {
if (window.addEventListener)
document.addEventListener(event, handler, false);
else
document.attachEvent("on"+event, handler);
};
// attach event listeners for initialization
function slidy_init() {
add_listener("keydown", slidy.key_down);
add_listener("keypress", slidy.key_press);
};