var faderMessages = 0;
var slides = Array();
var slideQueue = Array();
var slideSizes = Array();
var slideHeaderH = 0;
var slideBodyH = 0;
var slideIndex = 0;
var slidePriorIndex = 0;
var slideQueueIndex = 0;
var slidePriorQueueIndex = 0;
var mots = Array();
var motQueue = Array();
var motSizes = Array();
var morleyMots = 0;
var motHeaderH = 0;
var motBodyH = 0;
var motIndex = 0;
var motPriorIndex = 0;
var motQueueIndex = 0;
var motPriorQueueIndex = 0;

function InitializeFaderMessages()
{
	var curHeaderH = 0;
	var curBodyH = 0;
	faderMessages = $('FaderMessages');
	if (faderMessages)
	{
		// Hide all but the first slide
		faderMessages.childElements().each(function(s){
			if ($(s).nodeName == 'H2')
			{ 
				slideQueue[slides.length] = Array();
				slideSizes[slides.length] = Array();
				slides[slides.length] = $(s);
				curHeaderH = $(s).getHeight();
				if (curHeaderH > slideHeaderH) slideHeaderH = curHeaderH;
				if (slides.length > 1) {
					$(s).setStyle({opacity:0});
					$(s).hide();
				}
			}			
			else if($(s).nodeName == 'P')
			{
				curBodyH = $(s).getHeight();
				if (curBodyH > slideBodyH) slideBodyH = curBodyH;
				slideQueue[slides.length-1][slideQueue[slides.length - 1].length] = $(s);
				if (slides.length + slideQueue[slides.length - 1].length > 2)
				{
					$(s).setStyle({opacity:0});
					$(s).hide();
				}
			}
			else
			{
				$(s).remove();
			}
		});

		// Set first height
		SetNewHeight(slides[slideIndex], slideHeaderH); 
		SetNewHeight(slideQueue[slideIndex][slideQueueIndex], slideBodyH);
	}
	
	// More of the same w/o pix
	morleyMots = $('MorleyMots');
	if (morleyMots)	{
		// Remove slides and add to element list
		morleyMots.childElements().each(function(s){
			if ($(s).nodeName == 'DT') {
				motQueue[mots.length] = Array();
				motSizes[mots.length] = Array();
				mots[mots.length] = $(s);
				curHeaderH = $(s).getHeight();
				if (curHeaderH > motHeaderH) motHeaderH = curHeaderH;
				if (mots.length > 1) {
					$(s).setStyle({opacity:0});
					$(s).hide();
				}
			}
			else if ($(s).nodeName == 'DD') {
				curBodyH = $(s).getHeight();
				if (curBodyH > motBodyH) motBodyH = curBodyH;
				motQueue[mots.length-1][motQueue[mots.length - 1].length] = $(s);
				if (mots.length + motQueue[mots.length - 1].length > 2)
				{
					$(s).setStyle({opacity:0});
					$(s).hide();
				}
			}
		});

		// Set first height
		SetNewHeight(mots[motIndex], motHeaderH); 
		SetNewHeight(motQueue[motIndex][motQueueIndex], motBodyH);
	}
	if (morleyMots && faderMessages) {
		// Crank it up
		FaderMessageIdleLoop();		
	}
}

// Set next height
function SetNewHeight(element, height)
{
	element.setStyle( { height: height+'px' } );
	var h = element.getHeight() - height;
	if (h > 0)
	{
		// Must be some padding - adjust to
		// force the browser to show the correct height
		element.setStyle( { height: (height - h)+'px' } );
	}
}
// Control fading messages
var slideTicks = 0, slideTimer;
function FaderMessageIdleLoop()
{
	if (slideTicks < 1) {
		slideTicks = 6;
	}
	else {
		slideTicks--;
		if (slideTicks < 1) {
			if (slideTimer)	
			{
				window.clearTimeout(slideTimer);
				slideTimer = '';
			}
			FaderMessageLoop();
			return;
		}
	}
	if (slideTimer)	window.clearTimeout(slideTimer);
	slideTimer = window.setTimeout(FaderMessageIdleLoop, 500);
}
// Fading relative blocks
function FaderMessageLoop() {
	var slideNextIndex = slideIndex;
	var slideNextQueueIndex = slideQueueIndex + 1;
	if (slideNextQueueIndex > slideQueue[slideNextIndex].length-1)
	{
		// Change header and message
		slideNextQueueIndex = 0;
		slideNextIndex = (slideIndex + 1) % (slides.length);		
		new Effect.Opacity(slides[slideIndex], { from: 1.0, to: 0.0, queue: { position: 'end', scope: 'faderheaders'}, afterFinish : FaderHeaderShow  } );
	}
	new Effect.Opacity(slideQueue[slideIndex][slideQueueIndex], { from: 1.0, to: 0.0, queue: { position: 'end', scope: 'fadermessages'}, afterFinish : FaderMessageShow } );
	slidePriorIndex = slideIndex;
	slideIndex = slideNextIndex;
	slidePriorQueueIndex = slideQueueIndex;
	slideQueueIndex = slideNextQueueIndex;
}
function MotMessageLoop() {
	var motNextIndex = motIndex;
	var motNextQueueIndex = motQueueIndex + 1;
	if (motNextQueueIndex > motQueue[motNextIndex].length-1)
	{
		// Change header and message
		motNextQueueIndex = 0;
		motNextIndex = (motIndex + 1) % (mots.length);		
		new Effect.Opacity(mots[motIndex], { from: 1.0, to: 0.0, queue: { position: 'end', scope: 'faderheaders'}, afterFinish : MotHeaderShow  } );
	}
	new Effect.Opacity(motQueue[motIndex][motQueueIndex], { from: 1.0, to: 0.0, queue: { position: 'end', scope: 'fadermessages'}, afterFinish : MotMessageShow } );
	motPriorIndex = motIndex;
	motIndex = motNextIndex;
	motPriorQueueIndex = motQueueIndex;
	motQueueIndex = motNextQueueIndex;

}

function FaderHeaderShow()
{
	// Reset the new height. The order of the height
	// reset and the show and hide is
	// important to prevent flickering
	SetNewHeight(slides[slideIndex], slideHeaderH);
	slides[slideIndex].show(); 
	slides[slidePriorIndex].hide();
	new Effect.Opacity(slides[slideIndex], { from: 0.0, to: 1.0, queue: { position: 'end', scope: 'faderheaders'} } );
}
function MotHeaderShow()
{
	SetNewHeight(mots[motIndex], motHeaderH);
	mots[motIndex].show(); 
	mots[motPriorIndex].hide();
	new Effect.Opacity(mots[motIndex], { from: 0.0, to: 1.0, queue: { position: 'end', scope: 'faderheaders'} } );
}

function FaderMessageShow()
{
	// Reset the new height. The order of the height
	// reset and the show and hide is
	// important to prevent flickering
	SetNewHeight(slideQueue[slideIndex][slideQueueIndex], slideBodyH);
	slideQueue[slideIndex][slideQueueIndex].show();
	slideQueue[slidePriorIndex][slidePriorQueueIndex].hide();
	new Effect.Opacity(slideQueue[slideIndex][slideQueueIndex], { from: 0.0, to: 1.0, queue: { position: 'end', scope: 'fadermessages'}, afterFinish : MotMessageLoop } );
}
function MotMessageShow()
{
	SetNewHeight(motQueue[motIndex][motQueueIndex], motBodyH);
	motQueue[motIndex][motQueueIndex].show();
	motQueue[motPriorIndex][motPriorQueueIndex].hide();
	new Effect.Opacity(motQueue[motIndex][motQueueIndex], { from: 0.0, to: 1.0, queue: { position: 'end', scope: 'fadermessages'}, afterFinish : FaderMessageIdleLoop } );
}

if(window.FastInit) {
	FastInit.addOnLoad(InitializeFaderMessages);
} else {
	Event.observe(window, 'load', InitializeFaderMessages);
}
