﻿/*
Version 2.0.0
File Name   : BlenderNew.js    
Description : Home page for the Intranet web site
Version History 
Author  Date    Description
-----------------------------
SMT 09/03/2010  Using this version for test purposed
    
*/




/* 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; //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;

var currentNewsItem = 0; // Added by Adrian Bennett
var count = 0;
var timer;

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 blenderGo');
    if (document.getElementById(blendContainer) != null && forceBlenderItemID == null && (typeof forceNoBlend == "undefined" || !forceNoBlend)) {
        devAlert('start blenderGo!');
        setTimeout((getPrevious ? previousItemFunctionName : nextItemFunctionName) + "()", 0);
        devAlert(timer);
    }
}

function blendItemReceived(_item) {
    devAlert("blendItemReceived");
    getPrevious = false;
    getNext = false;
    if (blenderDynamicPopulate(_item)) {
        timeAtStart = new Date();
        clearTimers();
        currentTimers[currentTimers.length] = setTimeout("shift()", !navClicked ? timeRemaining : 0);
        pausedAt = 0;
    }
}

function blendItemReceivedORIG(_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 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()

    //alert("webNewsIDCurr = " + webNewsIDCurr + "\n" + "webNewsIDNext = " + webNewsIDNext);

    // 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);
        // First time this runs it skips the second item
        if (count == 0) {
            //count++;
            blendItemReceived(newsItems[currentNewsItem]);
        }
        else {
            getNextNewsItem();
        }
    }
    count++;

}

function blendCompleted() {
    blendCompletedActions();
}

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 goToBlenderNext() {
    navClicked = true;
    getNext = true;
    if (count > 0) {
        setNextId();
        blenderDynamicPopulate(newsItems[currentNewsItem]);
    }
    clearTimers();
    currentTimers[currentTimers.length] = setTimeout("shift()", timeRemaining);
    // Not sure any of the above is needed...   
    shift();
}

function goToBlenderPrevious() {
    navClicked = true;
    getPrevious = true;
    if (count == 0)
        currentNewsItem = currentNewsItem = newsItems.length - 1;
    else
        setPreviousId();

    blenderDynamicPopulate(newsItems[currentNewsItem]);
    //timeAtStart = new Date();
    clearTimers();
    currentTimers[currentTimers.length] = setTimeout("shift()", timeRemaining);
    shift();
}

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();
        currentTimers[currentTimers.length] = setTimeout("shift()", interval);
        //shift();
    }
}

function blendItemReceivedError() {
    devAlert("Something has gone wrong - blendItemReceivedError() in Blender.js");
}

function go(url) {
    if (!loading)
        document.location.href = url;
}

function pad(str) {
    if (str.toString().length == 1)
        return "0" + str;
    return str;
}

function getDayName(day) {
    switch (day) {
        case 0:
            return "Sun";
        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 (!true)
        alert(msg);
}


// ORIGINAL FUNCTIONS 

function blenderGoORIG(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 blendItemReceivedORIG(_item) {
    devAlert("blendItemReceived");
    getPrevious = false;
    getNext = false;
    if (blenderDynamicPopulateNonWS(_item)) //blenderDynamicPopulate
    {
        var doShift = blenderDynamicPopulateNonWS(_item); //blenderDynamicPopulate(_item);
        if (doShift == true || doShift == null) {
            timeAtStart = new Date();
            clearTimers();
            currentTimers[currentTimers.length] = setTimeout("shift()", !navClicked ? timeRemaining : 0);
            pausedAt = 0;
        }
    }
}


function goToBlenderNextCURRENT() {
    navClicked = true;
    getNext = true;
    //alert(currentNewsItem);
    //if (count == 0)  populateNewsItem();
    //getTitle();
    clearTimers();
    shift();
    blenderStart();
    //populateNewsItem();
}

function goToBlenderPreviousCURRENT() {
    navClicked = true;
    getPrevious = true;
    //blenderStart();
    shift();
}
