jsAddEvent(window, "load", fnInitialise, false);


// DOM functions ignoring whitespace text nodes...
function getNextSibling(node) {
	var nodeNext = node.nextSibling;
	while (nodeNext != null && nodeNext.nodeType != 1) nodeNext = nodeNext.nextSibling;
	return nodeNext;
}
function getPreviousSibling(node) {
	var nodePrev = node.previousSibling;
	while (nodePrev != null && nodePrev.nodeType != 1) nodePrev = nodePrev.previousSibling;
	return nodePrev;
}
function getFirstChild(node) {
	var nodeChild = node.firstChild;
	return (nodeChild.nodeType == 1) ? nodeChild : getNextSibling(nodeChild);
}
function getLastChild(node) {
	var nodeChild = node.lastChild;
	return (nodeChild.nodeType == 1) ? nodeChild : getPreviousSibling(nodeChild);
}


// Cross-Browser function to add an event
// handler to an event-generating element
function jsAddEvent(element, type, fn, useCapture) {
	if (element.addEventListener) {
		// DOM Level 2 Event Model implementation...
		element.addEventListener(type, fn, useCapture);
		return true;
	} else if (element.attachEvent) {
		// Non-standard IE Hack...
		return element.attachEvent('on' + type, fn);
	} else {
		// Catch-all last resort...
		var fnOnload = element['on' + type];
		if (typeof(fnOnload) == "function") {
			element['on' + type] = function() {
				fnOnload();
				fn();
			}
		} else element['on' + type] = fn;
	}
}



function fnInitialise() {
	// Get the page's [div]s...
	var listDIV = document.getElementById("content").getElementsByTagName("div");
	for (var i = 0; i < listDIV.length; i++) {
		var nodeDIV = listDIV.item(i);
		if (nodeDIV.className == "slides") {
			// We have a [div.slides] element, so get the [li] children...
			var listLI = nodeDIV.getElementsByTagName("li");
			// Set their classes to "hide" (except the first one)...
			for (var j = 1; j < listLI.length; j++) listLI.item(j).className = "hide";
			// Update the navigation arrows...
			fnUpdateSlideshowNav(nodeDIV.parentNode, listLI.item(0));
		} else if (nodeDIV.className == "nav" && nodeDIV.parentNode.className == "slideshow") {
			var anchors = nodeDIV.getElementsByTagName("a");
			for (var j = 0; j < anchors.length; j++) {
				var a = anchors[j];
				jsAddEvent(a, "mouseover", fnCreateClosure(a, fnToggleNavImage), false);
				jsAddEvent(a, "mouseout",  fnCreateClosure(a, fnToggleNavImage), false);
			}
		}
	}
}

// See http://blog.morrisjohns.com/javascript_closures_for_dummies.html for details...
function fnCreateClosure(element, fn) {
	// Local variables that end up in the closure...
	var el = element;
	// Returned function...
	return function() {fn(el);}
}

function fnShow(objA, strDir) {
	// Get a handle on the [div.slideshow] element...
	var nodeNav = objA.parentNode.parentNode.parentNode;
	var nodeSlideshow = nodeNav.parentNode;
	// Set nodeSlides to be the [div.slides] element (will be adjacent to the [div.nav])...
	var nodeSlides = (getNextSibling(nodeNav) != null) ? getNextSibling(nodeNav) : getPreviousSibling(nodeNav);
	// Get the [li] elements...
	var listLI = nodeSlides.getElementsByTagName("li");
	// Loop through looking for the unhidden element...
	for (var i = 0; i < listLI.length; i++) {
		var nodeLI = listLI.item(i);
		if (nodeLI.className.length == 0 || nodeLI.className.indexOf("hide") == -1) {
			var nodePrev = nodeLI;
			var nodeNext = null;
			// Determine the next [li] to show, and show it...
			if (strDir == "prev") {
				nodeNext = (i == 0) ? nodeLI : listLI.item(i - 1);
			} else if (strDir == "next") {
				nodeNext = (i == (listLI.length - 1)) ? nodeLI : listLI.item(i + 1);
			}
			// If they're different, update them...
			if (nodePrev !== nodeNext) {
				nodePrev.className = "hide";
				nodeNext.className = ""
				fnUpdateSlideshowNav(nodeSlideshow, nodeNext);
			}
			break;
		}
	}
	return false;
}

function fnUpdateSlideshowNav(nodeSlideshow, nodeLI) {
	// Get a handle on the [div.nav]s...
	var arrNav = [getFirstChild(nodeSlideshow), getLastChild(nodeSlideshow)];
	var isFirst = (nodeLI === getFirstChild(nodeLI.parentNode));
	var isLast  = (nodeLI === getLastChild(nodeLI.parentNode));
	for (var i = 0; i < arrNav.length; i++) {
		var nodeUL = getFirstChild(arrNav[i]);
		getFirstChild(nodeUL).style.display = (isFirst) ? "none" : "block";
		getLastChild(nodeUL).style.display = (isLast) ? "none" : "block";
	}
}

function fnToggleNavImage(a) {
	var elImg = a.getElementsByTagName("img")[0];
	var reg = /(.*)(on|off)(\.gif)/i;
	var strSrc = elImg.getAttribute("src");
	strSrc = strSrc.replace(reg, function(match, prefix, state, extension, pos, str) {
		return prefix + (state == "on" ? "off" : "on") + extension;
	});
	elImg.setAttribute("src", strSrc);
}
