﻿

/**
 * Sadly, this must be global for a flash video to hit it.
 */
 function pbplayer_DoFScommand (command, args)
 {
	switch (command)
	{
		case "halt":
			homePage.actions['PAUSE']();
			break;	
		default:
			break;
	}
 }
 
/**
 * @namespace Encapsulates homepage banner functionality.
 */
var homePage = {
	elements : {
		container : "Rotating_PromoWrapper",
		content : "Rotating_PromoContent",
		controls : "Rotating_PromoControls",
		left : "Rotating_PromoLeft",
		right : "Rotating_PromoRight",
		counter : "Rotating_PromoCount",
		title : "Rotating_PromoTitle",
		pauseButton : undefined
	},
	interval : undefined,
	period : 12000,
	hover : false,
	action : 'PAUSE',
	/**
	 * Collection of known, acceptable
	 * actions for the FSM.
	 */
	actions : {
		/**
		 * Set the interval into motion again.
		 */
		PLAY : function ()
		{	
			homePage.elements['pauseButton'].onclick = homePage.actions['PAUSE'];
			homePage.interval = window.setInterval(
				function() {
					homePage.rollPage("FORWARD");				
					homePage.updateCounter();
					homePage.renderPage();
					homePage.updateTitle();
				},
				homePage.period
			);
		},
		/**
		 * Simply clear the interval driving the scroll.
		 */
		PAUSE : function ()
		{
			window.clearInterval(homePage.interval);	
			homePage.elements['pauseButton'].onclick = homePage.actions['PLAY'];	
		},
		/**
		 * Clear interval, advance page, reset interval.
		 */
		FORWARD : function ()
		{
			window.clearInterval(homePage.interval);
			homePage.rollPage("FORWARD");
			homePage.updateCounter();
			homePage.renderPage();
			homePage.updateTitle();			
			homePage.actions['PLAY']();			
		},
		/**
		 * Clear interval, regress page, reset interval.
		 */
		BACKWARD : function ()
		{
			window.clearInterval(homePage.interval);
			homePage.rollPage("BACKWARD");
			homePage.updateCounter();
			homePage.renderPage();
			homePage.updateTitle();
			homePage.actions['PLAY']();
		}
	},
	page : -1,
	/**
	 * List of user content that will
	 * be utilized for display.
	 */	
	pages : [
	],
	/**
	 * Pulls content and sets up the FSM
	 * that handles rotation and input.
	 * Also, creates pause button and
	 * sets up event handlers.
	 */
	init : function()
	{	
		var
			elements = homePage.elements, 
			element;
		
		for (element in elements)
		{		
			elements[element] = (elements[element] != null) ?
				document.getElementById(elements[element]) : element;
		}
	
		elements['pauseButton'] = new Image();
		elements['pauseButton'].src = "/images/Layout/pause_button.gif";				
		elements['pauseButton'].onerror = function() { elements['pauseButton'] = document.createTextNode('PAUSE'); };
		elements['pauseButton'].id = "Rotating_PromoPause";
		
		// Pull in page content
		if (homePage.pages.length < 1)
		{
			//No content; terminate.
			homePage.destroy();
			return;
		}
		
		// Event handlers
		elements['left'].onclick = homePage.actions['BACKWARD'];
		elements['right'].onclick = homePage.actions['FORWARD'];
		elements['container'].onmouseover =
			function() 
			{
				if (homePage.hover === false)
				{
					var
						counter = homePage.elements['counter'];
					
					counter.insertBefore(homePage.elements['pauseButton'], counter.firstChild);					
					counter.removeChild(counter.lastChild);		
									
					homePage.hover = true;
				}
			};
		elements['container'].onmouseout =
			function(e)
			{
				var
					position = homePage.getPos(elements['container']),
					eventX = (e != null) ? e.clientX : window.event.clientX,
					eventY = (e != null) ? e.clientY : window.event.clientY;
					
				if (
					eventX <= position['x'] || 
					eventX >= position['x'] + elements['container'].offsetWidth ||
					eventY <= position['y'] ||
					eventY >= position['y'] + elements['container'].offsetHeight
				)
				{				
					homePage.hover = false;
					homePage.updateCounter();
				}
			};
		elements['pauseButton'].onclick = homePage.actions['PAUSE'];
		
		homePage.actions['FORWARD']();
	},
	/**
	 * Purges everything on destruction.
	 */
	destroy : function()
	{	
		var
			elements = homePage.elements;
	
		for (element in elements)
		{		
			elements[element] = undefined;
		}
		homePage.elements = undefined;
		
		window.clearInterval(homePage.interval);
		homePage.interval = undefined;
	},
	/**
	 * Renders out the currently displaying page.
	 */
	renderPage : function()
	{		
		var
			content = homePage.elements['content'];
	
		// Swap content to new page		
		content.innerHTML = homePage.pages[homePage.page].content;
	},
	/**
	 * Updates page counter.
	 */
	updateCounter : function()
	{	
		if (homePage.hover === false)
		{
			var
				counter = homePage.elements['counter'];
				
			counter.removeChild(counter.firstChild);			
			counter.appendChild(
				document.createTextNode( (homePage.page + 1) + " of " + homePage.pages.length )
			);
		}
	},
	/**
	 * Updates the title.
	 */
	updateTitle : function()
	{
		var
			title = homePage.elements['title'];
			
		title.removeChild(title.firstChild);
		if ((homePage.page + 1) == homePage.pages.length) {
			title.appendChild(
				document.createTextNode(homePage.pages[0].title)
			);
		}
		else {
			title.appendChild(
				document.createTextNode(homePage.pages[homePage.page + 1].title)
			);
		}
	},
	/**
	 * Rolls counter forward or backward depending on direction.
	 */
	rollPage : function(direction)
	{
		switch(direction) {
			case "FORWARD":
				homePage.page = (homePage.page + 1) % homePage.pages.length;
				break;
			case "BACKWARD":
				homePage.page = homePage.pages.length - 1 - (homePage.pages.length - homePage.page) % homePage.pages.length;
				break;
			default:
				return;
				break;
		}
	},
	/**
	 * Gets an element's rudimentary absolute position on screen.
	 */
	getPos : function(element)
	{
		var
			x = 0,
			y = 0;
	
		// Ascend until we hit the top of the tree.
		// Record offsets for all elements, as any other
		// node type (text, comment, document, etc.)
		// should not have relevant position information.
		while (element != null)
		{
			if (element.nodeType === 1)
			{
				x += element.offsetLeft;
				y += element.offsetTop;
			}	
			
			element = element.offsetParent;
		}
		
		return {
			'x' : x,
			'y' : y
		};
	},
	/**
	 * Quick and dirty utility function to unescape HTML.
	 */
	unescapeHTML : function(string)
	{
		return string.replace(/&lt\;/gi,"<").replace(/&gt\;/gi,">").replace(/&amp\;/gi,"&");
	}
};
