(function() {
	var DURATION = 9500;
	var DURATION_COMMENCE = 5500;
	var controller;
	var slideImages = [];
	var slideTexts = [];
	var currentIndex = 0;
	var timer = null;
	var animating = false;
	
	dojo.require("dojo.fx");

	dojo.addOnLoad(function() {
		controller = dojo.byId("slide-control");
		
		dojo.query("li", controller).connect("onclick", onLinkClick);
		
		dojo.query(".slide-image").forEach(function(element) {
			slideImages.push(element);
		});

		dojo.query(".slide-text").forEach(function(element) {
			slideTexts.push(element);
		});
		
		startTimer();
	});
	
	function startTimer() {
		timer = setTimeout(startAnimation, DURATION_COMMENCE);
	}
	
	function startAnimation() {
		animateTransition();
		
		if (timer) {
			clearInterval(timer);
		}
		
		timer = setInterval(animateTransition, DURATION);
	}
	
	function onLinkClick(event) {
		dojo.stopEvent(event);
		
		if (!animating) {
			var link = event.currentTarget;
			var index = getLinkIndex(link);
			
			showSlide(index);
			
			startTimer();
		}
	}
	
	function showSlide(index) {
		dojo.query(".slide-image").style("display", "none");
		dojo.query(".slide-text").style("display", "none");
		
		dojo.style(slideImages[index], "display", "block");
		dojo.style(slideTexts[index], "display", "block");
		dojo.style(slideTexts[index], "opacity", 1);
		
		dojo.query("li", controller).forEach(function(element) {
			var linkIndex = getLinkIndex(element);

			element.className = (linkIndex == index) ? "" : "link enabled";
		});
		
		currentIndex = index;
	}
	
	function getLinkIndex(element) {
		return parseInt(element.id.substring("slide-".length));
	}
	
	function animateTransition() {
		var nextIndex = currentIndex + 1;
		
		if (nextIndex > slideImages.length - 1) {
			nextIndex = 0;
		}
		
		//showSlide(nextIndex);

		dojo.query("li", controller).addClass("link").removeClass("enabled");
		
		var currentImage = slideImages[currentIndex];
		var nextImage = slideImages[nextIndex];		
		var currentText = slideTexts[currentIndex];
		var nextText = slideTexts[nextIndex];

		animating = true;
		
		dojo.fx.chain([            
			dojo.fadeOut({
				node: currentText,
				onEnd: function() {
					dojo.style(currentText, "display", "none");
				}
			}),
			dojo.animateProperty({
				node: nextImage,
				beforeBegin: function() {
					dojo.style(nextImage, "display", "block");
					dojo.style(nextImage, "right", 0);
					dojo.style(nextImage, "width", 0);
					dojo.style(nextImage, "zIndex", 1);
				},
				properties: {
					width: 814
				},
				onEnd: function() {
					dojo.style(currentImage, "display", "none");
					dojo.style(nextImage, "zIndex", 0);
				}
			}),
			dojo.fadeIn({
				node: nextText,
				beforeBegin: function() {
					dojo.style(nextText, "opacity", 0);
					dojo.style(nextText, "display", "block");
				},
				onEnd: function() {
					currentIndex = nextIndex;
					
					dojo.query("li", controller).forEach(function(element) {
						var linkIndex = getLinkIndex(element);

						element.className = (linkIndex == currentIndex) ? "" : "link enabled";
					});
					
					animating = false;
				}
			})
		]).play();
	}
})();
