/*	Copyright 2007 Refunk <http://www.refunk.com/> All rights reserved. */

var slideshow = function() {
	
	var domLoadFnArr = [main];
	var timer = null;
	var isDomLoaded = false;
	var slides = []; // hold references to slide DIVs
	var slideIndex = 0;
	var displayAll = false;
	var isOperaRedrawFixAdded = false;
	
	var ua = function() {
		var w3cdom = typeof document.getElementById != "undefined" && typeof document.getElementsByTagName != "undefined" && typeof document.createElement != "undefined";
		var u = navigator.userAgent.toLowerCase();
		var	win = /win/.test(u);
		var	ie = !/opera/.test(u) && /msie/.test(u);
		var opera = /opera/.test(u);
		var	webkit = /webkit/.test(u);
		return { w3cdom:w3cdom, win:win, ie:ie, opera:opera, webkit:webkit };
	}();
	
	var onDomLoad = function() {
		if (!ua.w3cdom) { return; }
		if (ua.ie && ua.win) {
			document.write("<script id=__ie_ondomload defer=true src=//:></script>");
			document.getElementById("__ie_ondomload").onreadystatechange = function() {
				if (this.readyState == "complete") { 
					this.parentNode.removeChild(this);
					callDomLoadFunctions();
				}
			};
		}
		if (ua.webkit) {
			timer = setInterval(function() { if (/loaded|complete/.test(document.readyState)) callDomLoadFunctions(); }, 10);
		}
		if (typeof document.addEventListener != "undefined") {
			document.addEventListener("DOMContentLoaded", callDomLoadFunctions, null);
		}
		addLoadEvent(callDomLoadFunctions);
	}();
	
	function callDomLoadFunctions() {
		if (isDomLoaded) { return; }
		isDomLoaded = true;
		if (timer) {
			clearInterval(timer);
			timer = null;
		}
		var dl = domLoadFnArr.length;
		for (var i = 0; i < dl; i++) {
			domLoadFnArr[i]();
		}
	}
	
	function addDomLoadEvent(fn) {
		domLoadFnArr[domLoadFnArr.length] = fn;
	}
	
	function addLoadEvent(fn) {
		if (typeof window.addEventListener != "undefined") { window.addEventListener("load", fn, false); }
		else if (typeof document.addEventListener != "undefined") { document.addEventListener("load", fn, false); }
		else if (typeof window.attachEvent != "undefined") { window.attachEvent("onload", fn); }
		else if (typeof window.onload == "function") {
			var fnOld = window.onload;
			window.onload = function() {
				fnOld();
				fn();
			};
		}
		else { window.onload = fn; }
	}
	
	function attachEventListener(target, eventType, functionRef, capture) {
		if (typeof target.addEventListener != "undefined") {
			target.addEventListener(eventType, functionRef, capture);
		}
		else if (typeof target.attachEvent != "undefined") {
			target.attachEvent("on" + eventType, functionRef);
		}
		else {
			eventType = "on" + eventType;
			if (typeof target[eventType] == "function") {
				var oldListener = target[eventType];
				target[eventType] = function() {
					oldListener();
					return functionRef();
				}
			}
			else {
				target[eventType] = functionRef;
			}
		}
		return true;
	}
	
	function main() {
	
		// fix opera height redraw issue
		if (ua.opera && !isOperaRedrawFixAdded) { addOperaRedrawFix(); }
	
		// get a reference to all slides
		var d = document.getElementsByTagName("div");
		var dl = d.length;
		var cn = ua.ie && ua.win ? "className" : "class";
		for (var i = 0; i < dl; i++) {
			if (d[i].getAttribute(cn) && /(^| )slide( |$)/i.test(d[i].getAttribute(cn))) {
				slides[slides.length] = d[i]; // array.push
			}
		}
		// hide all slides, except the one from the index
		var sl = slides.length;
		for (var i = 1; i < sl; i++) {
			slides[i].style.display = "none";
		}
		// add key navigation
		var keyevent = ua.webkit || ua.ie ? "keydown" : "keypress";
		attachEventListener(document, keyevent, function(e) {
			var key = e.keyCode.toString();
			switch(key) {
				// arrow left, up
				case "37": 
				case "38":
					back();
				break;
				// return, arrow right, down, spacebar (if supported)  
				case "13":
				case "39":
				case "40":
				case "32":
					forward();
				break;
				// esc (if supported), del
				case "27":
				case "46":
					toggleDisplay();
				break;
			}
		}, false);	
	}
	
	function back() {
		if (!displayAll && slideIndex > 0) {
			// hide previous slide
			slides[slideIndex].style.display = "none";
			// show new slide
			slideIndex--;
			slides[slideIndex].style.display = "block";
		}
	}
	
	function forward() {
		if (!displayAll && slideIndex < slides.length - 1) {
			// hide previous slide
			slides[slideIndex].style.display = "none";
			// show new slide
			slideIndex++;
			slides[slideIndex].style.display = "block";
		}
	}
	
	function toggleDisplay() {
		var sl = slides.length;
		if (displayAll) {
			// hide all except first
			if (ua.opera) { addOperaRedrawFix(); }
			for (var i = 1; i < sl; i++) {
				slides[i].style.display = "none";
			}
			displayAll = false;
		}
		else {
			// show all
			if (ua.opera) { removeOperaRedrawFix(); }
			for (var i = 0; i < sl; i++) {
				slides[i].style.display = "block";
			}
			displayAll = true;
		}
		slideIndex = 0;
	}
	
	function addOperaRedrawFix() {
		if (!isOperaRedrawFixAdded) {
			var h = document.getElementsByTagName("head")[0]; 
			var s = document.createElement("style");
			s.setAttribute("type", "text/css");
			s.setAttribute("media", "screen");
			s.setAttribute("id", "operaRedrawFix");
			s.appendChild(document.createTextNode(".slide { height:400px; }"));
			h.appendChild(s);
			isOperaRedrawFixAdded = true;
		}
	}
	
	function removeOperaRedrawFix() {
		if (isOperaRedrawFixAdded) {
			var h = document.getElementById("operaRedrawFix");
			h.parentNode.removeChild(h);
			isOperaRedrawFixAdded = false;
		}
	}

	return {
		// public API
		addDomLoadEvent: addDomLoadEvent
	};
	
}();
