/*******************************************************************
*
* File    : AnimatedFader.js
*
* Created : 2000/05/28
*
* Author  : Roy Whittle  (Roy@Whittle.com) www.Roy.Whittle.com
*
* Purpose : To create fading text descriptions
*
* History
* Date         Version        Description
*
* 2000-05-28        1.0                Initial version. Based on the State Transition
*                                        Diagram created for animated rollovers I
*                                        modified the code to fade text.
* 2000-05-29        1.1                I did not follow the STD correctly and introduced
*                                        a bug that left objects in the ON state.
*                                        This is now corrected.
* 2000-06-07        1.2                Introduced a start colour so that the script
*                                        can be used on different backgrounds.
*                                        Change the var AnimationRunning and FrameInterval
*                                        so they don't conflict with animate2.js
* 2000-08-09        1.3                Added Gecko ( Netscape 6 Preview Release 1 ) support
*                                        - Ken workman k.workman@3DASA.com
* 2000-10-15        1.4                Modified to make Netscpe 6 (PR3) more efficient
*                                        by just changing the color instead of replacing
*                                        the whole content of the DIV.
***********************************************************************/
/*** Create some global variables ***/
var FadingObject = new Array();
var FadeRunning=false;
var FadeInterval=30;

/*******************************************************************************/
/*** These are the simplest HEX/DEC conversion routines I could come up with ***/
/*** I have seen a lot of fade routines that seem to make this a             ***/
/*** very complex task. I am sure somene else must've had this idea          ***/
/*******************************************************************************/
var hexDigit=new Array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
function dec2hex(dec)
{
        return(hexDigit[dec>>4]+hexDigit[dec&15]);
}
function hex2dec(hex)
{
        return(parseInt(hex,16))
}
/******************************************************************************************/

/***********************************************************
* Function   : createFaderObject
*
* Parameters : theDiv   - The name of the DIV in which to fade the text
*              numSteps - The number of steps to use in the fade.
*                       startColor - The background colour of the page.
*
* Description : Creates an object that can hold the current
*               state of the fade animation for a particular DIV
***********************************************************/
function createFaderObject(theDiv, numSteps, startColor)
{
        if(!startColor)
                startColor = "000000";

        this.name                = theDiv;
        this.text                = null;
        this.color                = "FFFFFF";
        this.next_text        = null;
        this.next_color        = null;
        this.state                = "OFF";
        this.index                = 0;
        this.steps                = numSteps;
        this.r                = hex2dec(startColor.slice(0,2));
        this.g                = hex2dec(startColor.slice(2,4));
        this.b                = hex2dec(startColor.slice(4,6));
}

/***********************************************************
* Function   : FadingText
*
* Parameters : theDiv   - The name of the DIV in which to fade the text
*              numSteps - The number of steps to use in the fade.
*
* Description : Library function to be called from the main HTML.
*                        Creates an object that can hold the current
*               state of the fade animation for a particular DIV
***********************************************************/
function FadingText(theDiv, numSteps, startColor)
{
        FadingObject[theDiv] = new createFaderObject(theDiv, numSteps, startColor);
}
/*****************************************************************
* Function    : start_fading
*
* Description : If the FadeAnimation loop is not currently running
*                        then it is started.
*****************************************************************/
function start_fading()
{
        if(!FadeRunning)
                FadeAnimation();
}
/*****************************************************************
* Function    : set_text
*
* Description : In the new W3C DOM model we need only set the text
*                        once, after that we can just change the colour
*****************************************************************/
function set_text(f)
{
        if(navigator.appName.indexOf("Netscape") != -1
                && document.getElementById)
        {
                var theElement = document.getElementById(f.name);
                var newRange   = document.createRange();
                newRange.setStartBefore(theElement);
                var strFrag    = newRange.createContextualFragment(f.text);

                while (theElement.hasChildNodes())
                        theElement.removeChild(theElement.lastChild);
                theElement.appendChild(strFrag);
                theElement.style.color="#"+f.startColor;
        }
}
/*****************************************************************
*
* Function   : getColor
*
* Parameters : f - the fade object for which to calculate the colour.
*
* Description: Calculates the color of the link depending on
*                       how far through the fade we are.
*
*****************************************************************/
function getColor(f)
{
        var r=hex2dec(f.color.slice(0,2));
        var g=hex2dec(f.color.slice(2,4));
        var b=hex2dec(f.color.slice(4,6));

        r2= Math.floor(f.r+(f.index*(r-f.r))/(f.steps) + .5);
        g2= Math.floor(f.g+(f.index*(g-f.g))/(f.steps) + .5);
        b2= Math.floor(f.b+(f.index*(b-f.b))/(f.steps) + .5);

        return("#" + dec2hex(r2) + dec2hex(g2) + dec2hex(b2));
}
/*****************************************************************
*
* Function   : setColor
*
* Parameters : fadeObj   - The TextFader object to set
*
* Description: Gets the color of the text and writes it to
*                       the DIV.
*
*****************************************************************/
function setColor(fadeObj)
{
        var theColor=getColor(fadeObj);
        var str="<FONT COLOR="+ theColor + ">" + fadeObj.text + "</FONT>";
        var theDiv=fadeObj.name;

//if IE 4+
        if(document.all)
        {
                document.all[theDiv].innerHTML=str;
        }
//else if NS 4
        else if(document.layers)
        {
                document.nscontainer.document.layers[theDiv].document.write(str);
                document.nscontainer.document.layers[theDiv].document.close();
        }
//else if NS 6 (supports new DOM, may work in IE5) - see Website Abstraction for more info.
//http://www.wsabstract.com/javatutors/dynamiccontent4.shtml
        else if (document.getElementById)
        {
                theElement = document.getElementById(theDiv);
                theElement.style.color=theColor;
        }

}
/*****************************************************************
*
* Function   : fade_up
*
* Parameters : theDiv  - The div in which to display the text
*                       newText - The text to display when faded in
*                       newColor- The color the text will be.
*
* Description: Depending on the current "state" of the fade
*                       this function will determine the new state and
*                       if neccessary, start the fade effect.
*
*****************************************************************/
function fade_up(theDiv, newText, newColor)
{
        var f=FadingObject[theDiv];

        if(newColor == null)
                newColor="FFFFFF";

        if(f.state == "OFF")
        {
                f.text  = newText;
                f.color = newColor;
                f.state = "FADE_UP";
                set_text(f);
                start_fading();
        }
        else if( f.state == "FADE_UP_DOWN"
                || f.state == "FADE_DOWN"
                || f.state == "FADE_DOWN_UP")
        {
                if(newText == f.text)
                        f.state = "FADE_UP";
                else
                {
                        f.next_text  = newText;
                        f.next_color = newColor;
                        f.state      = "FADE_DOWN_UP";
                }
        }
}
/*****************************************************************
*
* Function   : fade_down
*
* Parameters : theDiv  - The div in which to display the text
*
* Description: Depending on the current "state" of the fade
*                       this function will determine the new state and
*                       if neccessary, start the fade effect.
*
*****************************************************************/
function fade_down(theDiv)
{
        var f=FadingObject[theDiv];

        if(f.state=="ON")
        {
                f.state="FADE_DOWN";
                start_fading();
        }
        else if(f.state=="FADE_DOWN_UP")
        {
                f.state="FADE_DOWN";
                f.next_text = null;
        }
        else if(f.state == "FADE_UP")
        {
                f.state="FADE_UP_DOWN";
        }
}
/*******************************************************************
*
* Function    : Animate
*
* Description : This function is based on the Animate function
*                        of animate.js (animated rollovers).
*                        Each fade object has a state. This function
*                        modifies each object and changes its state.
*****************************************************************/
function FadeAnimation()
{
        FadeRunning = false;
        for (var d in FadingObject)
        {
                var f=FadingObject[d];

                if(f.state == "FADE_UP")
                {
                        if(f.index < f.steps)
                                f.index++;
                        else
                                f.index = f.steps;
                        setColor(f);

                        if(f.index == f.steps)
                                f.state="ON";
                        else
                                FadeRunning = true;
                }
                else if(f.state == "FADE_UP_DOWN")
                {
                        if(f.index < f.steps)
                                f.index++;
                        else
                                f.index = f.steps;
                        setColor(f);

                        if(f.index == f.steps)
                                f.state="FADE_DOWN";
                        FadeRunning = true;
                }
                else if(f.state == "FADE_DOWN")
                {
                        if(f.index > 0)
                                f.index--;
                        else
                                f.index = 0;
                        setColor(f);

                        if(f.index == 0)
                                f.state="OFF";
                        else
                                FadeRunning = true;
                }
                else if(f.state == "FADE_DOWN_UP")
                {
                        if(f.index > 0)
                                f.index--;
                        else
                                f.index = 0;
                        setColor(f);

                        if(f.index == 0)
                        {
                                f.text      = f.next_text;
                                f.color     = f.next_color;
                                f.next_text = null;
                                f.state     ="FADE_UP";
                                set_text(f);
                        }
                        FadeRunning = true;
                }
        }
        /*** Check to see if we need to animate any more frames. ***/
        if(FadeRunning)
                setTimeout("FadeAnimation()", FadeInterval);

}