﻿/* HOW TO USE BLENDER
 * 1) Create a function called blenderStart() (N.B. You must use that name!!)
 * 2) From that function, call blenderGo(blendContainer, nextItemFunctionName)
 *		- blendContainer: The div container of both blend items
 *		- nextItemFunctionName: The function name, without brackets, of the function
 *		  that calls the web service to retrieve the object used to populate the div
 * Example:
 * function blenderStart()
 * {
 *		blenderGo("webNewsContainer", "getNextWebNewsItem");
 * }
 * 3) Create the "getNextWebNewsItem" or whatever you named the function, and have it
 *	  get the data you require
 * 4) Create a function called blenderDynamicPopulate(item) (N.B. Again, you must use that
 *	  name!!). In that function, the item object will be the object received from the
 *	  web service. Use that object to populate your div. Use the following format:
 *	  
 *    var myDiv = document.getElementById("myDiv" + blenderNext);
 *
 *    This ensures that the correct div of the is affected
 *    
 *    Returning true or nothing from the blenderDynamicPopulate method will start the
 *    blend effect, false will skip the blend.
 *    
 * 5) Finally, set the window.onload = blenderStart;
 */
var navClicked = false;
var blenderCurrent = 2;
var blenderNext = 1;
var webNewsIDCurr;
var webNewsIDNext;
var webNewsCurr;
var webNewsNext;
var interval = 10000;
var currentBlenderItemID = -1;
var nextBlenderItemID = null;
var forceBlenderItemID = null;
var loading = false;
var itemContainerID = "";
var currentTimers = new Array();

// Set to true if **nav** link clicked
var getPrevious = false;
var getNext = false;

var paused = false;
var timeAtStart = null;
var pausedAt = 0;
var timeRemaining = interval;
var divToBlend = null;
var divToHide = null;
var blendFrom = null;
var blendTo = null;
var clearTypeEnabled = false;

function blenderGo(blendContainer, nextItemFunctionName, previousItemFunctionName, itemContainerID_)
{
	itemContainerID = itemContainerID_;

	// IE loses clear type when any opacity is applied. This creates a strange effect
	// on the initial load and fade - so to work around this we apply the opacity
	// immediately on load of the page so we never see the clear type in the first place
	// and thus avoid the initial odd cross over of clear-type and non-clear-type on the
	// fade 
	// N.B. We only want this to happen once
	if(!clearTypeEnabled)
	{
		clearTypeEnabled = true;
		changeOpac(100, itemContainerID + blenderCurrent.toString());
		changeOpac(100, itemContainerID + blenderNext.toString());
	}

	devAlert('start');
	if(document.getElementById(blendContainer) != null && forceBlenderItemID == null && (typeof forceNoBlend == "undefined" || !forceNoBlend))
	{
		devAlert('start!');
		setTimeout((getPrevious ? previousItemFunctionName : nextItemFunctionName) + "()", 0);
	}
}

function blendItemReceived(_item)
{
	devAlert("blendItemReceived");
	getPrevious = false;			
	getNext = false;
	if(blenderDynamicPopulate)
	{
		var doShift = blenderDynamicPopulate(_item);
		if(doShift == true || doShift == null)
		{
			timeAtStart = new Date();
			clearTimers();
			currentTimers[currentTimers.length] = setTimeout("shift()",!navClicked ? timeRemaining : 0);
			pausedAt = 0;
		}
	}
}

function blendItemReceivedError()
{
}

function shift()
{
	devAlert("shift()");
	// Get the ID of the web news to fade out
	webNewsIDCurr = itemContainerID + blenderCurrent.toString();

	// Get the ID of the blenderNext web news div
	webNewsIDNext = itemContainerID + blenderNext.toString()
	
	// Get the object of the web news div
	webNewsCurr = document.getElementById(webNewsIDCurr);

	// Get the object of the blenderNext web news div
	webNewsNext = document.getElementById(webNewsIDNext);
	
	// Temporarily make both visible
	webNewsNext.style.display = "block";
	webNewsCurr.style.display = "block";

	loading = true;
	// Fade out the blenderCurrent one
	divToBlend = blenderCurrent == 2 ? webNewsIDCurr : webNewsIDNext;
	divToHide = blenderCurrent == 2 ? webNewsIDNext : webNewsIDCurr;

	blendFrom = blenderCurrent == 1 ? 0 : 100;
	blendTo = blenderCurrent == 1 ? 100 : 0;
//	devAlert(webNewsIDCurr);
//	devAlert(webNewsIDNext);
//	devAlert(divToBlend);
//	devAlert(from);
//	devAlert(to);
//	changeOpac(100, webNewsIDCurr);
//	changeOpac(0, webNewsIDNext);
	if(navClicked)
	{
		changeOpac(blendTo, divToBlend);
	// Reset the div zIndex settings so that the blend appears nicely

//		changeOpac(from, divToHide);
		blendCompleted();
	}
	else
	{
		document.getElementById(divToBlend).style.zIndex = 10;
		document.getElementById(divToHide).style.zIndex = 2;
//		changeOpac(blendTo, divToBlend);
//		alert('divToBlend: ' + divToBlend + ' -- blendFrom: ' + blendFrom + ' -- blendTo: ' + blendTo);
		opacity(divToBlend, blendFrom, blendTo, 0);
	}
}

function blendCompleted()
{
	blendCompletedActions();
	if(!paused)
		blenderStart();
}

function blendCompletedActions()
{
	// Set the zIndexes so that links work
	webNewsNext.style.zIndex = 10;
	webNewsCurr.style.zIndex = 2;

	timeRemaining = interval;
	
	loading = false;

	// Switch the visible div
	//changeOpac(100, webNewsIDNext);
	
	// Switch round blenderNext
	blenderNext = blenderCurrent;
	
	// Switch to the blenderCurrent web news
	blenderCurrent = 1+(1-(blenderCurrent - 1));
	
	currentBlenderItemID = nextBlenderItemID;

	if(navClicked)
		navClicked = false;
}

function go(url)
{	
	if(!loading)
		document.location.href = url;
}

function pad(str)
{
	if(str.toString().length == 1)
		return "0" + str;
	return str;
}

function goToBlenderNext()
{
	navClicked = true;
	getNext = true;
	blenderStart();
}

function goToBlenderPrevious()
{
	navClicked = true;
	getPrevious = true;
	blenderStart();
}

function clearTimers()
{
	for(var i=0;i<currentTimers.length;i++)
	{
		if(currentTimers[i] != null)
			clearTimeout(currentTimers[i]);
		currentTimers[i] = null;
	}
}

function blenderTogglePause()
{
	var elms = document.getElementsByName("wnNavigationPause");
	for(var i=0;i<elms.length;i++)
	{
		if(!paused)
			elms[i].innerHTML = "resume";
		else
			elms[i].innerHTML = "pause";
	}
	
	// Switch the pause variable
	paused = !paused;

	// If now paused, clear the timeout
	if(paused)
	{
		timeRemaining = timeRemaining - (new Date() - timeAtStart);
		clearTimers();
	}
	else
		blenderStart();
}

function getDayName(day)
{
	switch(day)
	{
		case 1:
			return "Mon";
		case 2:
			return "Tue";
		case 3:
			return "Wed";
		case 4:
			return "Thu";
		case 5:
			return "Fri";
		case 6:
			return "Sat";
		case 7:
			return "Sun";
	}
}

function getMonthName(day)
{
	switch(day)
	{
		case 0:
			return "Jan";
		case 1:
			return "Feb";
		case 2:
			return "Mar";
		case 3:
			return "Apr";
		case 4:
			return "May";
		case 5:
			return "Jun";
		case 6:
			return "Jul";
		case 7:
			return "Aug";
		case 8:
			return "Sep";
		case 9:
			return "Oct";
		case 10:
			return "Nov";
		case 11:
			return "Dec";
	}
}

function devAlert(msg)
{
	if(false)
		alert(msg);
}
