// JavaScript navigation
// To use this:
//  * Create an empty div with id "outline" that will display the presentation outline.
//  * Create four anchors with ids "first", "prev", "next" and "last" to use for navigation.
//  * Create an xml file to hold the outline.
//  * Call setup_nav() when your page is loaded.

var ELEMENT_NODE=1

function LoadXML(f) {
	var xmlDoc;
	try {
		// IE way of doing things.
		xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	}
	catch (e) {
		try {
			// Mozilla way of doing things
			var namespaceURL = "";
			var rootTagName = "";
			xmlDoc = document.implementation.createDocument(namespaceURL,rootTagName,null);
			xmlDoc.async=false;
			xmlDoc.load(f);	
		}
		catch (e) {
			alert(e.message);
		}
	}

	try {
		xmlDoc.async=false;
		xmlDoc.load(f);
		return xmlDoc;
	}
	catch(e) {
		alert(e.message);
	}
	return null;
}


function OutlineObject(xmlfile) {
	this.outlinefile = xmlfile;
	this.xmlDoc = LoadXML(this.outlinefile);
	// avoid javascript madness
	var self = this;
	if (! this.xmlDoc )
		alert(this.outlinefile + " was not loaded properly");
	
	this._getRootOutline = function() {
		// Get first "outline" tag from xml file.
		if (!self.xmlDoc) {
			return null;
		}
		
		var root = self.xmlDoc.getElementsByTagName("outline")[0];
		if (!root)
			alert("outline element not found in XML");
		return root;
	}

	this._HTMLOutlineGetNodeHref = function(node) {
		var href = node.getAttribute("filename");
		return href;
	}

	this._HTMLOutlineGetNodeLabel = function(node) {
		var label = node.getAttribute("label");
		if (!label) {
			label = node.getAttribute("filename");
		}
		if (!label) {
			label = "(null)";
		}
		return label;
	}
		
	this._HTMLOutlineRecContainsHref = function(node, href) {
		var s = self._HTMLOutlineGetNodeHref(node);
		if (s == href) return 1;
		for (var i = 0; i < node.childNodes.length; i++) {
			if (node.childNodes[i].nodeType != ELEMENT_NODE) continue;
			if (self._HTMLOutlineRecContainsHref(node.childNodes[i], href)) {
				return 1;
			}
		}
		return 0;
	}
	
	this._HTMLOutlineRec = function(node, currentHref) {
		html = "<ul>";
		var my_children = node.childNodes;
		for (var i = 0; i < my_children.length; i++) {
			if (my_children[i].nodeType != ELEMENT_NODE) continue;
			var label = self._HTMLOutlineGetNodeLabel(my_children[i]);
			var href = self._HTMLOutlineGetNodeHref(my_children[i]);
			html += "<li>";
			if (href)
				html += "<a href="+href+">"+label+"</a>";
			else
				html += label;
			html += "</li>";
			if (my_children[i].hasChildNodes() &&
			    self._HTMLOutlineRecContainsHref(my_children[i], currentHref)) {
				// expand it.
				html += self._HTMLOutlineRec(my_children[i]);
			}
		}
		html += "</ul>";
		return html;
	}	
	
	this.getHTMLOutline = function(currentHref) {
		var html = "No outline available";
		// get the first outline element.
		var root = self._getRootOutline();
		if (root) {
			html = self._HTMLOutlineRec(root, currentHref);
		}
		return html;
	}
	
	this._allItemsInOrder = function() {
		var filelist = new Array();
		var root = self._getRootOutline();
		if (root) {
			var allitems = root.getElementsByTagName("item");
			for (var i = 0; i < allitems.length; i++) {
				var iref = allitems[i];
				if (iref.nodeType != ELEMENT_NODE) continue;
				var filename = iref.getAttribute("filename");
				if (filename && filename != "") {
					filelist.push(filename);
				}
			}
		}
		return filelist;
	}	
	
	// get previous item given the name of the current item.
	// returns null for the first item.
	this.getPrevItem = function(currentitem) {
		var items = self._allItemsInOrder();
		for (var i = 1; i < items.length; i++) {
			if (currentitem == items[i])
				return items[i-1];
		}
		return null;
	}

	// get next item given the name of the current item.
	// returns null for the last item.
	this.getNextItem = function(currentitem) {
		var items = self._allItemsInOrder();
		for (var i = 0; i < items.length - 1; i++) {
			if (currentitem == items[i])
				return items[i+1];
		}
		return null;
	}
	
	this.getFirstItem = function() {
		var items = self._allItemsInOrder();
		if (items && items.length > 1)
			return items[0];
		return null;
	}
	
	this.getLastItem = function() {
		var items = self._allItemsInOrder();
		if (items && items.length > 1)
			return items[items.length - 1];
		return null;
	}	
}

// Some utility functions
function basename(url) {
	return url.replace(/.*[\/\\]/, "");
}

var oo;
function setup_nav() {
	oo = new OutlineObject("outline.xml");
	var outlineDiv = document.getElementById("outline");
	outlineDiv.innerHTML = oo.getHTMLOutline(basename(document.URL));
	setnav_first();
	setnav_prev();
	setnav_next();
	setnav_last();
	return oo;
}

function setnav_first() {
	var a = document.getElementById("first");
	if (a) a.href = oo.getFirstItem(basename(document.URL));
}

function setnav_prev() {
	var a = document.getElementById("prev");
	if (a) a.href = oo.getPrevItem(basename(document.URL));
}

function setnav_next() {
	var a = document.getElementById("next");
	if (a) a.href = oo.getNextItem(basename(document.URL));
}

function setnav_last() {
	var a = document.getElementById("last");
	if (a) a.href = oo.getLastItem(basename(document.URL));
}



