/* This work is licensed under Creative Commons GNU LGPL License.
License: http://creativecommons.org/licenses/LGPL/2.1/
Author: Stefan Goessner/2005-2006
Web: http://goessner.net/
*/
var Slideous = {
version: 1.0,
// == user customisable ===
clickables: { a: true, button: true, img: true, input: true, object: true, textarea: true, select: true, option: true },
incrementables: { blockquote: { filter: "self, parent" },
dd: { filter: "self, parent" },
dt: { filter: "self, parent" },
h2: { filter: "self, parent" },
h3: { filter: "self, parent" },
h4: { filter: "self, parent" },
h5: { filter: "self, parent" },
h6: { filter: "self, parent" },
li: { filter: "self, parent" },
p: { filter: "self" },
pre: { filter: "self" },
img: { filter: "self, parent" },
object: { filter: "self, parent" },
table: { filter: "self, parent" },
td: { filter: "self, parent" },
th: { filter: "self, parent" },
tr: { filter: "parent, grandparent" }
},
autoincrementables: { ol: true, ul: true, dl: true },
autoincrement: false,
statusbar: true,
navbuttons: { incfontbutton: function(){Slideous.changefontsize(+Slideous.fontdelta);},
decfontbutton: function(){Slideous.changefontsize(-Slideous.fontdelta);},
contentbutton: function(){Slideous.gotoslide(Slideous.tocidx(), true, true);},
homebutton: function(){Slideous.gotoslide(1, true, true);},
prevslidebutton: function(){Slideous.previous(false);},
previtembutton: function(){Slideous.previous(true);},
nextitembutton: function(){Slideous.next(true);},
nextslidebutton: function(){Slideous.next(false);},
endbutton: function(){Slideous.gotoslide(Slideous.count,true,true);} },
fontsize: 125, // in percent, corresponding to body.font-size in css file
fontdelta: 5, // increase/decrease fontsize by this value
mousesensitive: true,
tocidx: 0,
tocitems: { toc: "
{\$slidetitle}",
tocbox: "" },
keydown: function(evt) {
evt = evt || window.event;
var key = evt.keyCode || evt.which;
if (key && !evt.ctrlKey && !evt.altKey) {
switch (key) {
case 33: // page up ... previous slide
Slideous.previous(false); evt.cancel = !Slideous.showall; break;
case 37: // left arrow ... previous item
Slideous.previous(true); evt.cancel = !Slideous.showall; break;
case 32: // space bar
case 39: // right arrow
Slideous.next(true); evt.cancel = !Slideous.showall; break;
case 13: // carriage return ... next slide
case 34: // page down
Slideous.next(false); evt.cancel = !Slideous.showall; break;
case 35: // end ... last slide (not recognised by opera)
Slideous.gotoslide(Slideous.count, true, true); evt.cancel = !Slideous.showall; break;
case 36: // home ... first slide (not recognised by opera)
Slideous.gotoslide(1, true, true); evt.cancel = !Slideous.showall; break;
case 65: // A ... show All
case 80: // P ... Print mode
Slideous.toggleshowall(!Slideous.showall); evt.cancel = true; break;
case 67: // C ... goto contents
Slideous.gotoslide(Slideous.tocidx, true, true); evt.cancel = true; break;
case 77: // M ... toggle mouse sensitivity
Slideous.mousenavigation(Slideous.mousesensitive = !Slideous.mousesensitive); evt.cancel = true; break;
case 83: // S ... toggle statusbar
Slideous.togglestatusbar(); evt.cancel = true; break;
case 61: // + ... increase fontsize
case 107:
Slideous.changefontsize(+Slideous.fontdelta); evt.cancel = true; break;
case 109: // - ... decrease fontsize
Slideous.changefontsize(-Slideous.fontdelta); evt.cancel = true; break;
default: break;
}
if (evt.cancel) evt.returnValue = false;
}
return !evt.cancel;
},
// == program logic ===
count: 0, // # of slides ..
curidx: 0, // current slide index ..
mousedownpos: null, // last mouse down position ..
contentselected: false, // indicates content selection ..
showall: true,
init: function() {
Slideous.curidx = 1;
Slideous.importproperties();
Slideous.registerslides();
document.body.innerHTML = Slideous.injectproperties(document.body.innerHTML);
Slideous.buildtocs();
Slideous.registeranchors();
Slideous.toggleshowall(false);
Slideous.updatestatus();
document.body.style.fontSize = Slideous.fontsize+"%";
document.getElementById("s1").style.display = "block";
document.onkeydown = Slideous.keydown;
Slideous.mousenavigation(Slideous.mousesensitive);
Slideous.registerbuttons();
if (window.location.hash)
Slideous.gotoslide(window.location.hash.substr(2), true, true);
},
registerslides: function() {
var div = document.getElementsByTagName("div");
Slideous.count = 0;
for (var i in div)
if (Slideous.hasclass(div[i], "slide"))
div[i].setAttribute("id", "s"+(++Slideous.count));
},
registeranchors: function() {
var a = document.getElementsByTagName("a"),
loc = (window.location.hostname+window.location.pathname).replace(/\\/g, "/");
for (var i in a) {
if (a[i].href && a[i].href.indexOf(loc) >= 0 && a[i].href.lastIndexOf("#") >= 0) {
a[i].href = "javascript:Slideous.gotoslide(" + a[i].href.substr(a[i].href.lastIndexOf("#")+2)+",true,true)";
}
}
},
registerbuttons: function() {
var button;
for (var b in Slideous.navbuttons)
if (button = document.getElementById(b))
button.onclick = Slideous.navbuttons[b];
},
importproperties: function() { // from html meta section ..
var meta = document.getElementsByTagName("meta"), elem;
for (var i in meta)
if (meta[i].attributes && meta[i].attributes["name"] && meta[i].attributes["name"].value in Slideous)
switch (typeof(Slideous[meta[i].attributes["name"].value])) {
case "number": Slideous[meta[i].attributes["name"].value] = parseInt(meta[i].attributes["content"].value); break;
case "boolean": Slideous[meta[i].attributes["name"].value] = meta[i].attributes["content"].value == "true" ? true : false; break;
default: Slideous[meta[i].attributes["name"].value] = meta[i].attributes["content"].value; break;
}
},
injectproperties: function(str) {
var meta = document.getElementsByTagName("meta"), elem;
for (var i in meta) {
if (meta[i].attributes && meta[i].attributes["name"])
str = str.replace(new RegExp("{\\$"+meta[i].attributes["name"].value+"}","g"), meta[i].attributes["content"].value);
}
return str = str.replace(/{\$generator}/g, "Slideous")
.replace(/{\$version}/g, Slideous.version)
.replace(/{\$title}/g, document.title)
.replace(/{\$slidecount}/g, Slideous.count);
},
buildtocs: function() {
var toc = document.getElementById("toc"), list = "",
tocbox = document.getElementById("tocbox");
if (toc) {
for (var i=0; i 0 && i <= Slideous.count && i != Slideous.curidx) {
document.getElementById("s"+Slideous.curidx).style.display = "none";
var slide = document.getElementById("s"+(Slideous.curidx=i)), item;
while (item = Slideous.firstitem(slide, showitems ? Slideous.isitemhidden : Slideous.isitemvisible))
Slideous.displayitem(item, showitems);
slide.style.display = "block";
if (updatestatus)
Slideous.updatestatus();
}
},
firstitem: function(root, filter) {
var found = filter(root);
for (var node=root.firstChild; node!=null && !found; node = node.nextSibling)
found = Slideous.firstitem(node, filter);
return found;
},
lastitem: function(root, filter) {
var found = null;
for (var node=root.lastChild; node!=null && !found; node = node.previousSibling)
found = Slideous.lastitem(node, filter);
return found || filter(root);
},
isitem: function(node, visible) {
var nodename;
return node && node.nodeType == 1 // elements only ..
&& (nodename=node.nodeName.toLowerCase()) in Slideous.incrementables
&& ( Slideous.incrementables[nodename].filter.match("\\bself\\b") && (Slideous.hasclass(node, "incremental") || (Slideous.autoincrement && nodename in Slideous.autoincrementables))
|| Slideous.incrementables[nodename].filter.match("\\bparent\\b") && (Slideous.hasclass(node.parentNode, "incremental") || (Slideous.autoincrement && node.parentNode.nodeName.toLowerCase() in Slideous.autoincrementables))
|| Slideous.incrementables[nodename].filter.match("\\bgrandparent\\b") && (Slideous.hasclass(node.parentNode.parentNode, "incremental") || (Slideous.autoincrement && node.parentNode.parentNode.nodeName.toLowerCase() in Slideous.autoincrementables))
)
&& (visible ? (node.style.visibility != "hidden")
: (node.style.visibility == "hidden"))
? node : null;
},
isitemvisible: function(node) { return Slideous.isitem(node, true); },
isitemhidden: function(node) { return Slideous.isitem(node, false); },
displayitem: function(item, show) {
if (item) item.style.visibility = (show ? "visible" : "hidden");
},
updatestatus: function() {
if (Slideous.statusbar) {
var eos = document.getElementById("eos"),
idx = document.getElementById("slideidx"),
tocbox = document.getElementById("tocbox");
if (eos)
eos.style.visibility = Slideous.firstitem(document.getElementById("s"+Slideous.curidx), Slideous.isitemhidden) != null
? "visible" : "hidden";
if (idx)
idx.innerHTML = Slideous.curidx;
if (tocbox)
tocbox.selectedIndex = Slideous.curidx-1;
}
},
changefontsize: function(delta) {
document.body.style.fontSize = (Slideous.fontsize+=delta)+"%";
},
togglestatusbar: function() {
document.getElementById("statusbar").style.display = (Slideous.statusbar = !Slideous.statusbar) ? "block" : "none";
},
toggleshowall: function(showall) {
var slide, item;
for (var i=0; i