/*
Requires: common.js
Requires: scriptaculous/lib/prototype.js
Requires: scriptaculous/src/scriptaculous.js
*/

function contentSlideshow() 
{
	var self = this;
	var slideshowContainerID = "slideshowContainer";
	var slideshowContentID = slideshowContainerID + "_content";
	var slideshowHeaderID = slideshowContainerID + "_header";
	var slideshowFooterID = slideshowContainerID + "_footer";
	var showDetailsProcID = 0;
	var showContentProcID = 0;
	this.xmlFile = "";
	this.targetID = "";
	this.maxWidth = "100%";
	this.maxHeight = "100%";
	var targetElement = {};
	this.displayTime = 5;
	this.effectTime = 4;
	var groupIndex = 0;
	var itemIndex = -1;
	var headerEffectTime = 1;
	var footerEffectTime = 2;
	var containerElement = {};
	var contentElement = {};
	var headerElement = {};
	var footerElement = {};
	var myContentGroups = new contentGroups();
	var longestDetailEffectDuration = 0;	
	
	function startShow()
	{
	    var html = "";
		var node = {};		
		if(!(hasSlides()))
			return;
		
		longestDetailEffectDuration = headerEffectTime;
		if(footerEffectTime>headerEffectTime)
		{
			longestDetailEffectDuration = footerEffectTime;
		}
		longestDetailEffectDuration *= 1000;
		
		node = $(document.createElement("div"));
		node.setStyle({width:self.maxWidth,height:self.maxHeight});
		targetElement.appendChild(node);
		
		containerElement = $(document.createElement("div"));
		containerElement.id = slideshowContainerID;
		containerElement.setStyle({width:self.maxWidth,height:self.maxHeight});
		containerElement.addClassName("slideshowContainer");
		node.appendChild(containerElement);
		
		headerElement = $(document.createElement("div"));
		headerElement.id = slideshowHeaderID;
		headerElement.setStyle({display:"none",position:"absolute",width:(containerElement.getWidth()-8) + "px"});
		headerElement.addClassName("slideshowHeader");
		containerElement.appendChild(headerElement);
		
		contentElement = $(document.createElement("div"));
		contentElement.id = slideshowContentID;
		contentElement.addClassName("slideshowContent");
		containerElement.appendChild(contentElement);
		
		footerElement = $(document.createElement("div"));
		footerElement.id = slideshowFooterID;
		footerElement.setStyle({display:"none",position:"absolute",width:(containerElement.getWidth()-8) + "px"});
		footerElement.addClassName("slideshowFooter");
		containerElement.appendChild(footerElement);
		footerElement.setStyle({top: (Position.cumulativeOffset(containerElement)[1] + containerElement.getHeight() - footerElement.getHeight()) + "px"});
		nextSlide();
	}
	
	function hasSlides()
	{
		var hasSlides = false;
		for(var i=0;i<myContentGroups.count();i++)
		{
			for(var j=0;j<myContentGroups.get(i).items.count();j++)
			{
				hasSlides = true;
				break;
			}
		}
		return hasSlides;
	}
	
	function nextSlide()
	{
		itemIndex++;
		
		if(itemIndex>=myContentGroups.get(groupIndex).items.count())
		{
			groupIndex++;
			itemIndex = 0;
		}
		
		if(groupIndex>=myContentGroups.count())
		{
			groupIndex = 0;
			itemIndex = 0;
		}	
		
		loadSlide(groupIndex,itemIndex);
	}
	
	function loadSlide(slideGroupIndex, slideIndex)
	{
		var myContentGroup = {};
		var myContentGroupItem = {};
		var headerText = "";
		var contentText = "";
		var footerText = "";
		//alert(slideGroupIndex + ":" + slideIndex);
		if(slideGroupIndex > -1 || slideIndex > -1)
		{
			if(slideGroupIndex>-1)
				groupIndex = slideGroupIndex;
			if(slideIndex>-1)
				itemIndex = slideIndex;
		}
		else
			return;
		
		try
		{
			myContentGroup = myContentGroups.get(groupIndex);
		}
		catch(e){}
				
		try
		{
			myContentGroupItem = myContentGroup.items.get(itemIndex);
		}
		catch(e){}
		
		if(myContentGroupItem == null || myContentGroup == null)
		{
			return;			
		}

		contentElement.setStyle({display:"none"});
		contentElement.update(myContentGroupItem.content);
		headerElement.update(myContentGroupItem.header);
		footerElement.update(myContentGroupItem.description);
		
		clearInterval(showDetailsProcID);
		
		if(headerElement.innerHTML.length>0 || footerElement.innerHTML.length>0)
		{
			showDetailsProcID = setInterval(details_mouseOver,100);
		}
	
		clearInterval(showContentProcID);		
		Effect.Appear(contentElement,
		{ 	
			duration:self.effectTime,
			queue:{position:"end",scope:"contentscope"},
			afterFinish:function()
			{
				setTimeout(function()
				{
					showContentProcID = setInterval(function()
					{
						if(!Position.within(containerElement,mouseX,mouseY))
							contentFade();
					},1000);
				},(self.displayTime*1000));
			}
		});
	}
	
	function showDetails()
	{
		//Event.stopObserving(containerElement,"mouseover",showDetails);
		if(headerElement.innerHTML.length>0)
			Effect.BlindDown(headerElement, { duration:headerEffectTime, to:0.65, scope:"headerScope"}); 
		if(footerElement.innerHTML.length>0)
			Effect.Appear(footerElement, { duration:footerEffectTime, to:0.65, scope:"footerScope"});
		
		//setTimeout(setupAfterShowDetails,longestDetailEffectDuration);
	}
	
	function setupAfterShowDetails()
	{
		if(Position.within(containerElement,mouseX,mouseY))
		{
			//clearInterval(showDetailsProcID);
			//showDetailsProcID = setInterval(details_mouseOut,100);
			//Event.observe(contentElement,"mouseover", details_mouseOver);
			//Event.observe(contentElement,"mouseout", details_mouseOut);
		}
		else
			hideDetails();
	}
	
	function details_mouseOver()
	{
		if(Position.within(containerElement,mouseX,mouseY))
		{
			clearInterval(showDetailsProcID);
			showDetails();
		}
	}
	
	function details_mouseOut()
	{
		if(!Position.within(containerElement,mouseX,mouseY))
		{
			clearInterval(showDetailsProcID);
			hideDetails();
			/*setTimeout(function(){
				if(!Position.within(containerElement,mouseX,mouseY))
				{
					clearInterval(showDetailsProcID);
					showDetailsProcID = setInterval(hideDetails,2000);
				}
			},10);
			*/
		}
	}
	
	function hideDetails()
	{
		clearInterval(showDetailsProcID);
		//Event.stopObserving(contentElement,"mouseover", details_mouseOver);
		//Event.stopObserving(contentElement,"mouseout", details_mouseOut);
		if(headerElement.getStyle("display") != "none")
			Effect.BlindUp(headerElement, {duration:headerEffectTime,scope:"headerScope"}); 
		if(footerElement.getStyle("display") != "none")
			Effect.Fade(footerElement, {duration:footerEffectTime,scope:"footerScope"});
		
		//setTimeout(setupAfterHideDetails,longestDetailEffectDuration);
	}
	
	function setupAfterHideDetails()
	{
		//Event.observe(contentElement,"mouseover", showDetails);
		clearInterval(showContentProcID);
		showContentProcID = setInterval(function()
		{
			if(!Position.within(containerElement,mouseX,mouseY))
				contentFade();
		},1000);
	}
	
	function contentFade()
	{
		clearInterval(showDetailsProcID);
		Effect.Fade(headerElement, {duration:self.effectTime,scope:"headerScope"}); 
		Effect.Fade(footerElement, {duration:self.effectTime,scope:"footerScope"});	
		clearInterval(showContentProcID);
		Effect.Fade(contentElement, 
		{ 	
			duration:self.effectTime,
			queue:{position:"end",scope:"contentscope"},
			afterFinish:function()
			{
				nextSlide();
			}
		});
	}
	
	function parseXML(data)
	{
		var rootNode = data.responseXML;
		var groupNodes = rootNode.getElementsByTagName("group");
		var groupItemNodes;
		for(var i=0;i<groupNodes.length;i++)
		{
			myContentGroups.add(getNodeValue(groupNodes[i],"title"), getNodeValue(groupNodes[i],"description"), getNodeValue(groupNodes[i],"link"));
			groupItemNodes = groupNodes[i].getElementsByTagName("item");
			for(var j=0;j<groupItemNodes.length;j++)
			{
				myContentGroups.get((myContentGroups.count()-1)).items.add(getNodeValue(groupItemNodes[j],"header"),getNodeValue(groupItemNodes[j],"content"), getNodeValue(groupItemNodes[j],"description"));
			}
		}
	}
	
	function loadXML()
	{
		new Ajax.Request(self.xmlFile, 
		{
			method: "get",
			onSuccess : parseXML,
			onFailure : function()
			{
				targetElement.innerHTML = requestFailed();
			},
			onComplete: function()
			{
				postLoad();
			}
		});
	}
	
	function postLoad()
	{
		startShow();
	}
	
	this.load = function() 
	{
		if(self.xmlFile.length == 0 || self.targetID.length == 0)
			return;
		targetElement = $(self.targetID);
		
		if(targetElement == null)
			return;
		
		slideshowContainerID = self.targetID + "_" + slideshowContainerID;
		slideshowContentID = self.targetID + "_" + slideshowContentID;
		slideshowHeaderID = self.targetID + "_" + slideshowHeaderID;
		slideshowFooterID = self.targetID + "_" + slideshowFooterID;
		loadXML();
	}
	
	function contentGroups()
	{
		var myGroups = [];
		this.add = function(title, description, link)
		{
			myGroups.push(new group(title, description, link));
		}
		
		this.get = function(index)
		{
			return myGroups[index];
		}
		
		this.count = function()
		{
			return myGroups.length;
		}
		
		function group(title, description, link)
		{
			this.title = title;
			this.description = description;
			this.link = link;
			this.items = new groupItems();
						
			function groupItems()
			{
				var items = [];
				this.add = function(header,content, description)
				{
					items.push(new item(header,content, description));
				}
				
				this.get = function(index)
				{
					return items[index];
				}
				
				this.count = function()
				{
					return items.length;
				}
				
				function item(header, content, description)
				{
					this.header = header;
					this.content = content;
					this.description = description;
				}
			}
		}
	}
} 
