var MOVEMENT_DELAY_MS           = 1;
var MOVEMENT_AMOUNT_PX          = 1;
var EXPANDED_VERTICAL_PADDING   = 12;
var CONTRACTED_VERTICAL_PADDING = 7;
var HORIZONTAL_PADDING          = 5;
var CONTRACTED_COLOR            = '006633';
var EXPANDED_COLOR              = '8AB155';
var aExpandingDivs                  = new Array();
var aContractingDivs                = new Array();
var iExpandingDivsInterval          = -1;
var bThreadRunning                  = false;
var aColourChangeArray              = new Array();
var bExpandingRolloversInitialised  = false;
function expandingRolloversInit()
{
setupColourChangeArray();
startExpandingDivsThread();
bExpandingRolloversInitialised  = true;
}
function setupColourChangeArray()
{
var iArrayLength        = EXPANDED_VERTICAL_PADDING - CONTRACTED_VERTICAL_PADDING;
var iNextStep           = 0;
var iRedContracted      = hexToDec( CONTRACTED_COLOR.substr( 0, 2 ) );
var iGreenContracted    = hexToDec( CONTRACTED_COLOR.substr( 2, 2 ) );
var iBlueContracted     = hexToDec( CONTRACTED_COLOR.substr( 4, 2 ) );
var iRedExpanded        = hexToDec( EXPANDED_COLOR.substr( 0, 2 ) );
var iGreenExpanded      = hexToDec( EXPANDED_COLOR.substr( 2, 2 ) );
var iBlueExpanded       = hexToDec( EXPANDED_COLOR.substr( 4, 2 ) );
var iRedStep            = ( iRedExpanded - iRedContracted ) / iArrayLength;
var iGreenStep          = ( iGreenExpanded - iGreenContracted ) / iArrayLength;
var iBlueStep           = ( iBlueExpanded - iBlueContracted ) / iArrayLength;
var iRedNextLevel       = 0;
var iGreenNextLevel     = 0;
var iBlueNextLevel      = 0;
for ( var i = CONTRACTED_VERTICAL_PADDING; i <= EXPANDED_VERTICAL_PADDING; i++ )
{
iNextStep       = ( i - CONTRACTED_VERTICAL_PADDING );
iRedNextLevel   = Math.round( iRedContracted + ( iNextStep * iRedStep ) );
iGreenNextLevel = Math.round( iGreenContracted + ( iNextStep * iGreenStep ) );
iBlueNextLevel  = Math.round( iBlueContracted + ( iNextStep * iBlueStep ) );
sNextRgb        = '#' + decToHex( iRedNextLevel ) + decToHex( iGreenNextLevel ) + decToHex( iBlueNextLevel );
aColourChangeArray[i]   = sNextRgb;
}
}
function decToHex( iDecimal )
{
var sHexValue   = iDecimal.toString( 16 );
if ( sHexValue.length == 1 )
{
sHexValue   = '0' + sHexValue;
}
return sHexValue;
}
function hexToDec( sHexadecimal )
{
return parseInt( sHexadecimal, 16 );
}
function expandOver( oContainingCell )
{
startExpandingDivsThread();
expandDiv( oContainingCell.getElementsByTagName( 'DIV' )[0] );
}
function expandOut( oContainingCell )
{
startExpandingDivsThread();
contractDiv( oContainingCell.getElementsByTagName( 'DIV' )[0] );
}
function startExpandingDivsThread()
{
if ( !bThreadRunning )
{
iExpandingDivsInterval  = window.setInterval( checkExpandingArrays, MOVEMENT_DELAY_MS );
bThreadRunning          = true;
}
}
function stopExpandingDivsThread()
{
window.clearInterval( iExpandingDivsInterval );
bThreadRunning  = false;
}
function checkExpandingArrays()
{
var oNextDiv        = null;
var sPaddingAttrib  = null;
var iPaddingAmount  = 0;
var sNextColor      = '';
for ( var i = 0; i < aExpandingDivs.length; i++ )
{
oNextDiv        = aExpandingDivs[i];
sPaddingAttrib  = oNextDiv.style.paddingTop;
iPaddingAmount  = parseInt( sPaddingAttrib.substring( 0, sPaddingAttrib.length - 2 ) );
if ( iPaddingAmount < EXPANDED_VERTICAL_PADDING )
{
iPaddingAmount += MOVEMENT_AMOUNT_PX;
if ( iPaddingAmount > EXPANDED_VERTICAL_PADDING )
{
iPaddingAmount  = EXPANDED_VERTICAL_PADDING;
}
sNextColor                  = aColourChangeArray[iPaddingAmount];
oNextDiv.style.padding      = iPaddingAmount + 'px ' + HORIZONTAL_PADDING + 'px';
oNextDiv.style.background   = sNextColor;
}
else
{
removeExpandingDiv( oNextDiv );
}
}
for ( var i = 0; i < aContractingDivs.length; i++ )
{
oNextDiv        = aContractingDivs[i];
sPaddingAttrib  = oNextDiv.style.paddingTop;
iPaddingAmount  = parseInt( sPaddingAttrib.substring( 0, sPaddingAttrib.length - 2 ) );
if ( iPaddingAmount > CONTRACTED_VERTICAL_PADDING )
{
iPaddingAmount -= MOVEMENT_AMOUNT_PX;
if ( iPaddingAmount < CONTRACTED_VERTICAL_PADDING )
{
iPaddingAmount  = CONTRACTED_VERTICAL_PADDING
}
sNextColor                      = aColourChangeArray[iPaddingAmount];
oNextDiv.style.padding          = iPaddingAmount + 'px ' + HORIZONTAL_PADDING + 'px';
oNextDiv.style.backgroundColor  = sNextColor;
}
else
{
removeContractingDiv( oNextDiv );
}
}
if ( aExpandingDivs.length == 0 && aContractingDivs.length == 0 )
{
stopExpandingDivsThread();
}
}
function expandDiv( oDiv )
{
if ( bExpandingRolloversInitialised )
{
addExpandingDiv( oDiv );
removeContractingDiv( oDiv );
}
}
function contractDiv( oDiv )
{
if ( bExpandingRolloversInitialised )
{
addContractingDiv( oDiv );
removeExpandingDiv( oDiv );
}
}
function addContractingDiv( oDiv )
{
var bAlreadyInArray = false;
for ( var i = 0; i < aContractingDivs.length; i++ )
{
if ( aContractingDivs[i] == oDiv )
{
bAlreadyInArray = true;
}
}
if ( !bAlreadyInArray )
{
aContractingDivs[aContractingDivs.length]   = oDiv;
}
}
function addExpandingDiv( oDiv )
{
var bAlreadyInArray = false;
for ( var i = 0; i < aExpandingDivs.length; i++ )
{
if ( aExpandingDivs[i] == oDiv )
{
bAlreadyInArray = true;
}
}
if ( !bAlreadyInArray )
{
aExpandingDivs[aExpandingDivs.length]   = oDiv;
}
}
function removeContractingDiv( oDiv )
{
var bRemoved    = false;
for ( var i = 0; i < aContractingDivs.length; i++ )
{
if ( bRemoved )
{
aContractingDivs[i-1]   = aContractingDivs[i];
}
if ( aContractingDivs[i] == oDiv )
{
bRemoved    = true;
}
}
if ( bRemoved )
{
aContractingDivs.pop();
}
}
function removeExpandingDiv( oDiv )
{
var bRemoved    = false;
for ( var i = 0; i < aExpandingDivs.length; i++ )
{
if ( bRemoved )
{
aExpandingDivs[i-1] = aExpandingDivs[i];
}
if ( aExpandingDivs[i] == oDiv )
{
bRemoved    = true;
}
}
if ( bRemoved )
{
aExpandingDivs.pop();
}
}