/*
Slideshow 1.4
April 9, 2008
For usage details see http://yellow5.us/projects/slideshow/

Creative Commons Attribution 2.0 License
http://creativecommons.org/licenses/by/2.0/
*/

if (!window.xb)
{
	window.xb =
	{
		createElement: function(sElement)
		{
			if (document.createElementNS) return document.createElementNS('http://www.w3.org/1999/xhtml', sElement);
			if (document.createElement) return document.createElement(sElement);

			return null;
		},

		getElementsByAttribute: function(ndNode, sAttributeName, sAttributeValue)
		{
			var aReturnElements = [];

			if (!ndNode.all && !ndNode.getElementsByTagName) return aReturnElements;

			var rAttributeValue = RegExp('(^|\\s)' + sAttributeValue + '(\\s|$)');
			var sValue, aElements = ndNode.all || ndNode.getElementsByTagName('*');

			for (var nIndex = 0; aElements[nIndex]; ++nIndex)
			{
				if (!aElements[nIndex].getAttribute) continue;
				sValue = (sAttributeName == 'class') ? aElements[nIndex].className : aElements[nIndex].getAttribute(sAttributeName);
				if ((typeof(sValue) != 'string') || (sValue.length == 0)) continue;

				if (rAttributeValue.test(sValue)) aReturnElements.push(aElements[nIndex]);
			}

			return aReturnElements;
		},

		getStyle: function(ndNode, sStyle)
		{
			if (document.defaultView && document.defaultView.getComputedStyle) return document.defaultView.getComputedStyle(ndNode, '').getPropertyValue(sStyle);

			if (!ndNode.currentStyle) return true;

			var nIndex = sStyle.indexOf('-');
			while (nIndex >= 0)
			{
				sStyle = sStyle.substring(0, nIndex) + sStyle.substring(nIndex + 1, nIndex + 2).toUpperCase() + nIndex.substring(nIndex + 2);
				nIndex = sStyle.indexOf('-');
			}

			return ndNode.currentStyle[sStyle];
		},

		getOption: function(ndNode, sOption)
		{
			var sText = ndNode.getAttribute(sOption);
			if (sText) return sText;

			var sDefault = (arguments.length == 3) ? arguments[2] : false;
			var aMatch = ndNode.className.match(RegExp('(?:^|\\s)' + sOption + '=(?:\\\'|\\\")([^\\\'\\\"]+)(?:\\\'|\\\"|$)'));

			return aMatch ? aMatch[1] : sDefault;
		},

		emptyNode: function(ndNode)
		{
			while (ndNode.childNodes.length) ndNode.removeChild(ndNode.firstChild);

			return true;
		},

		addText: function(ndNode, sText)
		{
			var aText = sText.replace(/^\s+/, '').replace(/\s+$/, '').replace(/[\r\n]+/, "\n").split('\n');
			for (nIndex = 0; aText[nIndex]; ++nIndex)
			{
				if (nIndex) ndNode.appendChild(xb.createElement('br'));
				ndNode.appendChild(document.createTextNode(aText[nIndex]));
			}

			return true;
		},

		writeText: function(ndNode, sText)
		{
			xb.emptyNode(ndNode);
			xb.addText(ndNode, sText);

			return true;
		},

		setSelectionRange: function(ndText, nStart, nEnd)
		{
			if (ndText.setSelectionRange)
			{
				ndText.setSelectionRange(nStart, nEnd);
			}
			else if (document.selection)
			{
				var nDifference = ndText.value.substring(0, nStart).split("\n").length - 1;
				nStart -= nDifference;
				nEnd -= nDifference;

				var objRange = document.selection.createRange();
				objRange.moveToElementText(ndText);
				objRange.collapse(true);
				objRange.moveStart('character', nStart);
				objRange.moveEnd('character', nEnd - nStart);
				objRange.select();
			}

			ndText.focus();

			return true;
		},

		replaceSelectionRange: function(ndText, sReplace)
		{
			if (ndText.setSelectionRange)
			{
				ndText.value = ndText.value.substring(0, ndText.selectionStart) + sReplace + ndText.value.substring(ndText.selectionEnd);
			}
			else if (document.selection)
			{
				var objRange = document.selection.createRange();
				objRange.text = sReplace;
			}

			ndText.focus();

			return true;
		},

		bookmark: function()
		{
			if (window.sidebar)
			{
				window.sidebar.addPanel(document.title, location.href, null);
				return true;
			}

			if (window.opera && window.print)
			{
				var ndBookmark = xb.createElement('a');
				ndBookmark.setAttribute('rel', 'sidebar');
				ndBookmark.setAttribute('href', location.href);
				ndBookmark.setAttribute('title', document.title);
				ndBookmark.click();
				return true;
			}

			if (document.all)
			{
				window.external.AddFavorite(location.href, document.title);
				return true;
			}

			alert('Click Bookmarks->Add Bookmark... to add this page');
			return false;
		}
	};
}

// This is a variation of the addEvent script written by Dean Edwards (dean.edwards.name).
if (!window.events)
{
	window.events =
	{
		nEventID: 1,

		add: function(ndElement, sType, fnHandler)
		{
			if (!fnHandler.$$nEventID) fnHandler.$$nEventID = this.nEventID++;
			if (ndElement.objEvents === undefined) ndElement.objEvents = {};

			var aHandlers = ndElement.objEvents[sType];
			if (!aHandlers)
			{
				aHandlers = ndElement.objEvents[sType] = {};
				if (ndElement['on' + sType]) aHandlers[0] = ndElement['on' + sType];
			}

			aHandlers[fnHandler.$$nEventID] = fnHandler;
			ndElement['on' + sType] = this.handle;

			return true;
		},

		remove: function(ndElement, sType, fnHandler)
		{
			if (ndElement.objEvents && ndElement.objEvents[sType]) delete ndElement.objEvents[sType][fnHandler.$$nEventID];

			return true;
		},

		exists: function(ndElement, sType, fnHandler)
		{
			return (ndElement.objEvents && ndElement.objEvents[sType] && ndElement.objEvents[sType][fnHandler.$$nEventID]);
		},

		handle: function(e)
		{
			e = e || window.events.fix(event);

			var bReturn = true, aHandlers = this.objEvents[e.type];
			for (var nIndex in aHandlers)
			{
				this.$$handle = aHandlers[nIndex];
				if (this.$$handle(e) === false) bReturn = false;
			}

			return bReturn;
		},

		fix: function(e)
		{
			e.preventDefault = this.fix.preventDefault;
			e.stopPropagation = this.fix.stopPropagation;

			return e;
		},

		cancel: function(e)
		{
			e.preventDefault();
			e.stopPropagation();

			return false;
		},

		getposition: function(e)
		{
			e = e || window.events.fix(event);

			return ({'x' : (e.offsetX ? e.offsetX : (e.pageX ? e.pageX - e.target.offsetLeft : 0)), 'y' : (e.offsetY ? e.offsetY : (e.pageY ? e.pageY - e.target.offsetTop : 0))});
		}
	};

	window.events.fix.preventDefault = function()
	{
		this.returnValue = false;

		return true;
	}

	window.events.fix.stopPropagation = function()
	{
		this.cancelBubble = true;

		return true;
	}
}

if (!window.Slideshow)
{
	window.Slideshow = function(ndSlideshow)
	{
		if (!ndSlideshow) return false;

		var sDirection = (((arguments.length > 1) && arguments[1] && arguments[1].match(/^(top|right|bottom|left|up|down)$/)) ? arguments[1].toLowerCase() : 'left').replace(/^up$/, 'top').replace(/^down$/, 'bottom');
		var nMoveDistance = ((arguments.length > 2) && !isNaN(parseFloat(arguments[2]))) ? parseFloat(arguments[2]) : 1;
		var nMoveTime = ((arguments.length > 3) && !isNaN(parseFloat(arguments[3]))) ? parseFloat(arguments[3]) : 40;
		var bReverseOrder = (arguments.length > 4) && arguments[4];
		var bStop = (arguments.length > 5) && arguments[5];
		var sClientLength = ((sDirection == 'top') || (sDirection == 'bottom')) ? 'offsetHeight' : 'offsetWidth';
		var sOppositeClientLength = (sClientLength == 'offsetHeight') ? 'offsetWidth' : 'offsetHeight';
		var sLength = ((sDirection == 'top') || (sDirection == 'bottom')) ? 'height' : 'width';
		var sOppositeLength = (sLength == 'height') ? 'width' : 'height';

		var bInit = false;
		var aImages = null;
		var nIntervalID = null;
		var ndSlidingBox = null, ndContainer = null;
		var nSlideshowLength = null;
		var nSlideshowImages = null;

		var Init = function()
		{
			bInit = true;

			var nMinOppositeLength = 0;
			for (var nImage = 0; ndSlideshow.childNodes[nImage]; ++nImage)
			{
				if (!ndSlideshow.childNodes[nImage].style)
				{
					ndSlideshow.removeChild(ndSlideshow.childNodes[nImage--]);
					continue;
				}

				if (nImage == 0)
				{
					nMinOppositeLength = ndSlideshow.childNodes[nImage][sOppositeClientLength];
					continue;
				}

				if (ndSlideshow.childNodes[nImage][sOppositeClientLength] < nMinOppositeLength) nMinOppositeLength = ndSlideshow.childNodes[nImage][sOppositeClientLength];
			}

			var nContainerLength = ndSlideshow[sClientLength];
			for (var nImage = 0; ndSlideshow.childNodes[nImage]; ++nImage)
			{
				ndSlideshow.childNodes[nImage].style.display = 'block';
				ndSlideshow.childNodes[nImage].style.position = 'absolute';
				ndSlideshow.childNodes[nImage].style.top = 'auto';
				ndSlideshow.childNodes[nImage].style.right = 'auto';
				ndSlideshow.childNodes[nImage].style.bottom = 'auto';
				ndSlideshow.childNodes[nImage].style.left = 'auto';
				ndSlideshow.childNodes[nImage].style.visibility = 'visible';
				ndSlideshow.childNodes[nImage].style[sOppositeLength] = nMinOppositeLength + 'px';
			}

			if (!ndSlideshow.childNodes.length) return false;
			if (bReverseOrder) ReverseChildren(ndSlideshow);

			ndContainer = xb.createElement('div');
			ndContainer.style.position = 'relative';
			ndContainer.style.overflow = 'hidden';
			ndContainer.style.margin = '0';
			ndContainer.style.padding = '0';
			ndContainer.style.border = '0';
			ndContainer.style[sOppositeLength] = nMinOppositeLength + 'px';
			ndContainer.style[sLength] = (sLength == 'width') ? '100%' : nContainerLength + 'px';

			ndSlidingBox = xb.createElement('div');
			ndSlidingBox.style.position = 'absolute';
			ndSlidingBox.style.margin = '0';
			ndSlidingBox.style.padding = '0';
			ndSlidingBox.style.border = '0';
			ndSlidingBox.style.top = 'auto';
			ndSlidingBox.style.right = 'auto';
			ndSlidingBox.style.bottom = 'auto';
			ndSlidingBox.style.left = 'auto';
			ndSlidingBox.style[sOppositeLength] = nMinOppositeLength + 'px';
			ndSlidingBox.style[sLength] = '10000px';

			ndContainer.appendChild(ndSlidingBox);
			ndSlideshow.appendChild(ndContainer);

			nSlideshowLength = 0;
			while (ndSlideshow.childNodes.length > 1)
			{
				ndSlidingBox.appendChild(ndSlideshow.removeChild(ndSlideshow.firstChild));

				ndSlidingBox.lastChild.style[sDirection] = nSlideshowLength + 'px';

				ndSlidingBox.style[sLength] = (parseFloat(ndSlidingBox.style[sLength]) + ndSlidingBox.lastChild[sClientLength]) + 'px';
				nSlideshowLength += ndSlidingBox.lastChild[sClientLength];
			}

			aImages = ndSlidingBox.childNodes;
			nSlideshowImages = aImages.length;

			return true;
		};

		this.Start = function()
		{
			return Start();
		};

		this.Stop = function()
		{
			return Stop();
		};

		var Start = function()
		{
			if (!bInit && !Init()) return false;
			if (bStop)
			{
				if (!events.exists(ndSlideshow, 'mouseover', Stop)) events.add(ndSlideshow, 'mouseover', Stop);
				if (!events.exists(ndSlideshow, 'mouseout', Start)) events.add(ndSlideshow, 'mouseout', Start);
			}

			if (nIntervalID !== null) window.clearInterval(nIntervalID);
			nIntervalID = window.setInterval(Move, nMoveTime);

			return true;
		};

		var Stop = function()
		{
			window.clearInterval(nIntervalID);
			nIntervalID = null;

			return true;
		};

		var Move = function()
		{
			if ((ndSlidingBox.style[sDirection] == 'auto') || ((parseInt(ndSlidingBox.style[sDirection], 10) + nSlideshowLength) <= 0))
			{
				ndSlidingBox.style.top = 'auto';
				ndSlidingBox.style.right = 'auto';
				ndSlidingBox.style.bottom = 'auto';
				ndSlidingBox.style.left = 'auto';
				ndSlidingBox.style[sDirection] = '0px';
			}

			ndSlidingBox.style[sDirection] = (parseInt(ndSlidingBox.style[sDirection], 10) - nMoveDistance) + 'px';

			var nNewImages = (nSlideshowImages * (parseInt(ndSlideshow[sClientLength] / nSlideshowLength, 10) + 2)) - aImages.length;
			var nPosition = parseFloat(aImages[aImages.length - 1].style[sDirection]) + aImages[aImages.length - 1][sClientLength];
			for (var nImage = 0; nImage < nNewImages; ++nImage)
			{
				ndSlidingBox.appendChild(aImages[(nImage % nSlideshowImages)].cloneNode(true));
				ndSlidingBox.style[sLength] = (parseFloat(ndSlidingBox.style[sLength]) + aImages[(nImage % nSlideshowImages)][sClientLength]) + 'px';
				aImages[aImages.length - 1].style.position = 'absolute';
				aImages[aImages.length - 1].style[sDirection] = nPosition + 'px';

				nPosition += aImages[(nImage % nSlideshowImages)][sClientLength];
			}

			return true;
		};

		var ReverseChildren = function(ndParent)
		{
			var aChildren = ndParent.childNodes;
			for (var nChild = aChildren.length - 1; nChild >= 0; --nChild)
			{
				ndParent.appendChild(ndParent.removeChild(aChildren[nChild]));
			}

			return true;
		};

		return true;
	}

	window.onload = function()
	{
		var ndElement, sDirection, nDistance, nTime, bReverse;

		var aElements = xb.getElementsByAttribute(document, 'class', 'slideshow');
		for (var nIndex = 0; aElements[nIndex]; ++nIndex)
		{
			ndElement = aElements[nIndex];

			sDirection = xb.getOption(ndElement, 'ss-direction', 'left');
			nDistance = xb.getOption(ndElement, 'ss-distance', 1);
			nTime = xb.getOption(ndElement, 'ss-time', 40);
			bReverse = ndElement.getAttribute('ss-reverse') || ndElement.className.match(/(?:^|\s)ss-reverse(?:\s|$)/);
			bStop = ndElement.getAttribute('ss-mousestop') || ndElement.className.match(/(?:^|\s)ss-mousestop(?:\s|$)/);

			aElements[nIndex].objSlideshow = new Slideshow(ndElement, sDirection, nDistance, nTime, bReverse, bStop);
			aElements[nIndex].objSlideshow.Start();
		}

		return true;
	};
}