/*************************************************************
* NLB Background Color Fader v1.0
* Author: Justin Barlow - www.netlobo.com
*
* Description:
* The Background Color Fader allows you to gradually fade the
* background of any HTML element.
*
* Usage:
* Call the Background Color Fader as follows:
*   NLBfadeBg( elementId, startBgColor, endBgColor, fadeTime );
*
* Description of Parameters
*   elementId - The id of the element you wish to fade the
*             background of.
*   startBgColor - The background color you wish to start the
*             fade from.
*   endBgColor - The background color you want to fade to.
*   fadeTime - The duration of the fade in milliseconds.
*************************************************************/

var nlbFade_hextable = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' ]; // used for RGB to Hex and Hex to RGB conversions
var nlbFade_elemTable = new Array( ); // global array to keep track of faded elements
var nlbFade_t = new Array( ); // global array to keep track of fading timers
function NLBfadeBg( elementId, startBgColor, endBgColor, fadeTime )
{
    var timeBetweenSteps = Math.round( Math.max( fadeTime / 300, 30 ) );
    var nlbFade_elemTableId = nlbFade_elemTable.indexOf( elementId );
    if( nlbFade_elemTableId > -1 )
    {
        for( var i = 0; i < nlbFade_t[nlbFade_elemTableId].length; i++ )
            clearTimeout( nlbFade_t[nlbFade_elemTableId][i] );
    }
    else
    {
        nlbFade_elemTable.push( elementId );
        nlbFade_elemTableId = nlbFade_elemTable.indexOf( elementId );
    }
    var startBgColorRGB = hexToRGB( startBgColor );
    var endBgColorRGB = hexToRGB( endBgColor );
    var diffRGB = new Array( );
    for( var i = 0; i < 3; i++ )
        diffRGB[i] = endBgColorRGB[i] - startBgColorRGB[i];
    var steps = Math.ceil( fadeTime / timeBetweenSteps );
    var nlbFade_s = new Array( );
    for( var i = 1; i <= steps; i++ )
    {
        var changes = new Array( );
        for( var j = 0; j < diffRGB.length; j++ )
            changes[j] = startBgColorRGB[j] + Math.round( ( diffRGB[j] / steps ) * i );
        if( i == steps )
            nlbFade_s[i - 1] = setTimeout( 'document.getElementById("'+elementId+'").style.backgroundColor = "'+endBgColor+'";', timeBetweenSteps*(i-1) );
        else
            nlbFade_s[i - 1] = setTimeout( 'document.getElementById("'+elementId+'").style.backgroundColor = "'+RGBToHex( changes )+'";', timeBetweenSteps*(i-1) );
    }
    nlbFade_t[nlbFade_elemTableId] = nlbFade_s;
}
function hexToRGB( hexVal )
{
    hexVal = hexVal.toUpperCase( );
    if( hexVal.substring( 0, 1 ) == '#' )
        hexVal = hexVal.substring( 1 );
    var hexArray = new Array( );
    var rgbArray = new Array( );
    hexArray[0] = hexVal.substring( 0, 2 );
    hexArray[1] = hexVal.substring( 2, 4 );
    hexArray[2] = hexVal.substring( 4, 6 );
    for( var k = 0; k < hexArray.length; k++ )
    {
        var num = hexArray[k];
        var res = 0;
        var j = 0;
        for( var i = num.length - 1; i >= 0; i-- )
            res += parseInt( nlbFade_hextable.indexOf( num.charAt( i ) ) ) * Math.pow( 16, j++ );
        rgbArray[k] = res;
    }
    return rgbArray;
}
function RGBToHex( rgbArray )
{
    var retval = new Array( );
    for( var j = 0; j < rgbArray.length; j++ )
    {
        var result = new Array( );
        var val = rgbArray[j];
        var i = 0;
        while( val > 16 )
        {
            result[i++] = val%16;
            val = Math.floor( val/16 );
        }
        result[i++] = val%16;
        var out = '';
        for( var k = result.length - 1; k >= 0; k-- )
            out += nlbFade_hextable[result[k]];
        retval[j] = padLeft( out, '0', 2 );
    }
    out = '#';
    for( var i = 0; i < retval.length; i++ )
        out += retval[i];
    return out;
}
if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function( val, fromIndex ) {
        if( typeof( fromIndex ) != 'number' ) fromIndex = 0;
        for( var index = fromIndex, len = this.length; index < len; index++ )
            if( this[index] == val ) return index;
        return -1;
    }
}
function padLeft( string, character, paddedWidth )
{
    if( string.length >= paddedWidth )
        return string;
    else
    {
        while( string.length < paddedWidth )
            string = character + string;
    }
    return string;
}