YAHOO.namespace("cmsIT");

if (!YAHOO.cmsIT.headerSlider)
{
	YAHOO.cmsIT.headerSlider = function()
	{
		// Private
		var Anim = YAHOO.util.Anim,
			currentImage = null,
			dataCache = [],
			Dom = YAHOO.util.Dom,
			elements = {},
			Event = YAHOO.util.Event,
			imageCount = 0,
			labelOpacity = 0.8,
			Motion = YAHOO.util.Motion,
			nextImage = null,
			rotateSeconds = 5,
			timer = null,
			timerStatus = "running";


		var AlignToImage = function(image)
		{
			var local = {};

			local.imageRegion = Dom.getRegion(image);
			local.imageBarRegion = Dom.getRegion(elements.imageBar);
			local.viewportRegion = Dom.getRegion(elements.viewport);

			local.x = local.imageBarRegion.x;

			// Image above viewport
			if (local.imageRegion.y < local.viewportRegion.y)
			{
				local.y = local.imageBarRegion.y + (local.viewportRegion.y - local.imageRegion.y);
			}

			// Image below viewport
			else
			{
				local.y = local.imageBarRegion.y - (local.imageRegion.y - local.viewportRegion.y);
			}

			local.attributes = 
			{
				points: {to: [local.x, local.y]}
			};

			local.move = new Motion(elements.imageBar, local.attributes, 0, YAHOO.util.Easing.easeNone);
			local.move.animate();
		};


		var AttachEvents = function()
		{
			Event.on(elements.slideShow, "mouseover", PauseTimer);
			Event.on(elements.slideShow, "mouseout", StartTimer);
		};


		var CreateProgressIndicator = function(image)
		{
			var local = {};

			local.progressIndicator = document.createElement("div");
			local.progressIndicator.innerHTML = "&nbsp;";

			Dom.addClass(local.progressIndicator, "indicator");

			elements.progressBar.appendChild(local.progressIndicator);

			Event.on(local.progressIndicator, "click", SwapImage, image);
			Event.on(local.progressIndicator, "mouseover", ToggleHover);
			Event.on(local.progressIndicator, "mouseout", ToggleHover);

			return local.progressIndicator;
		};


		var Data = function(el)
		{
			var cacheIndex = el.dataKey,
				nextCacheIndex = dataCache.length;

			if (cacheIndex == undefined || cacheIndex == null)
			{
				cacheIndex = el.dataKey = nextCacheIndex;
				dataCache[cacheIndex] = {};
			}

			return {
				Get: function(key)
				{
					return dataCache[cacheIndex][key];
				},

				Set: function(key, value)
				{
					dataCache[cacheIndex][key] = value;
					return value;
				}
			};
		};


		var HideImageCover = function()
		{
			var local = {};


			local.onImageCoverHidden = function()
			{
				Dom.setStyle(elements.imageCover, "display", "none");
				Dom.setStyle(elements.imageCover, "backgroundImage", "");
				elements.imageCover.innerHTML = "";

				if (nextImage == null)
				{
					alert("nextImage is NULL");
					dump(currentImage);
				}

				Dom.removeClass(Data(currentImage).Get("progressIndicator"), "selected");

				currentImage = nextImage;
				nextImage = null;

				Dom.addClass(Data(currentImage).Get("progressIndicator"), "selected");


				if (timerStatus == "running")
				{
					StartTimer();
				}
			};


			local.infoBackground = Dom.getElementsByClassName("infoBackground", "div", elements.imageCover);
			local.infoBackground = local.infoBackground[0];


			local.info = Dom.getElementsByClassName("info", "div", elements.imageCover);
			local.info = local.info[0];


			local.anim = new Anim(elements.imageCover, { opacity: { from: 1, to: 0 } }, 0.5);
			local.anim.onComplete.subscribe(local.onImageCoverHidden);

			local.anim2 = new Anim(local.infoBackground, { opacity: { from: labelOpacity, to: 0 } }, 0.5);
			local.anim3 = new Anim(local.info, { opacity: { from: 1, to: 0 } }, 0.5);

			local.anim.animate();
			local.anim2.animate();
			local.anim3.animate();
		};


		var Init = function()
		{
			InitializeElements();

			if (imageCount > 1)
			{
				AttachEvents();
				StartTimer();
			}
		};


		var InitializeElements = function()
		{
			var local = {};

			elements.slideShow = Dom.get("headerSlideShow");

			elements.viewport = Dom.getElementsByClassName("viewport", "div", elements.slideShow);
			elements.viewport = elements.viewport[0];

			elements.imageBar = Dom.getElementsByClassName("imageBar", "div", elements.slideShow);
			elements.imageBar = elements.imageBar[0];

			elements.imageCover = Dom.getElementsByClassName("imageCover", "div", elements.slideShow);
			elements.imageCover = elements.imageCover[0];

			elements.progressBar = Dom.getElementsByClassName("progressBar", "div", elements.slideShow);
			elements.progressBar = elements.progressBar[0];


			var onImageClick = function(ev, url)
			{
				location.href = url;

				Event.stopEvent(ev);
			};


			var isAnchor = function(el)
			{
				if (el.nodeName.toLowerCase() == "a")
				{
					return true;	
				}

				return false;
			}


			local.image = Dom.getFirstChild(elements.imageBar)


			// Set background widths
			while (local.image != null)
			{
				imageCount++;

				local.infoBackground = Dom.getElementsByClassName("infoBackground", "div", local.image);
				local.infoBackground = local.infoBackground[0];

				Dom.setStyle(local.infoBackground, "opacity", labelOpacity);

				local.info = Dom.getElementsByClassName("info", "div", local.image);
				local.info = local.info[0];

				local.anchors = Dom.getElementsBy(isAnchor, "a", local.info);


				for (var i = 0; i < local.anchors.length; i++)
				{
					if (Dom.hasClass(local.anchors[i], "project"))
					{
						Event.on(local.image, "click", onImageClick, local.anchors[i].href);
					}

					Event.on(local.anchors[i], "click", onImageClick, local.anchors[i].href);

					local.anchors[i].href = "#";
				}


				// Corect background width
				if (local.info == undefined || local.info == null)
				{
					Dom.setStyle(local.infoBackground, "display", "none");
				}
				else
				{
					local.infoRegion = Dom.getRegion(local.info);
					Dom.setStyle(local.infoBackground, "width", local.infoRegion.width + "px");
				}


				Data(local.image).Set("progressIndicator", CreateProgressIndicator(local.image));


				local.image = Dom.getNextSibling(local.image);
			}


			// Clear floated indicators
			local.clear = document.createElement("div");
			local.clear.innerHTML = "&nbsp;";
			Dom.addClass(local.clear, "clear");
			elements.progressBar.appendChild(local.clear);


			currentImage = Dom.getFirstChild(elements.imageBar);
			Dom.addClass(Data(currentImage).Get("progressIndicator"), "selected");
	
	
			if (imageCount <= 1)
			{
				Dom.setStyle(elements.progressBar, "display", "none");
			}
		};


		var PauseTimer = function()
		{
			timerStatus = "paused";
			if (timer != null)
			{
				timer.cancel();
				timer = null;
			}
		};


		var Rotate = function()
		{
			if (nextImage === null)
			{
				timer = null;

				if (currentImage == null)
				{
					currentImage = Dom.getFirstChild(elements.imageBar);
				}

				nextImage = Dom.getNextSibling(currentImage);

				if (nextImage == null)
				{
					nextImage = Dom.getFirstChild(elements.imageBar);
				}


				ShowImageCover();
				AlignToImage(nextImage);
				HideImageCover();
			}
		};


		var SwapImage = function(ev, image)
		{
			if (nextImage === null)
			{
				timer = null;

				nextImage = image;

				ShowImageCover();
				AlignToImage(nextImage);
				HideImageCover();

				Event.stopEvent(ev);
			}
		};


		var ShowImageCover = function()
		{
			Dom.setStyle(elements.imageCover, "display", "block");
			Dom.setStyle(elements.imageCover, "opacity", 1);
			Dom.setStyle(elements.imageCover, "backgroundImage", currentImage.style.backgroundImage);

			elements.imageCover.innerHTML = currentImage.innerHTML;
		};


		var StartTimer = function()
		{
			if (timer == null)
			{
				timerStatus = "running";
				timer = YAHOO.lang.later(rotateSeconds * 1000, YAHOO.cmsIT.headerSlider, Rotate, null, false);
			}
		};


		var ToggleHover = function(ev)
		{
			if (ev.type == "mouseout")
			{
				Dom.removeClass(this, "hover");
			}
			else
			{
				Dom.addClass(this, "hover");
			}
		};


		Event.onContentReady("headerSlideShow", Init);




		// Public
		return {
			
		};
	}();
}
