/*******************************************************************
 * Dynamic Navigation Code by mitch@comandsolutions.com 3/20/2007
 *
 * Copyright (C) 2007 COMAND Solutions, Inc.
 * http://www.comandsolutions.com/
 */
var UpdateInterval = 10; // update every UpdateInterval milliseconds
var EnableSlidingDescriptions = false;
var FlashValueMin = 128;
var FlashValueMax = 255;
var FlashValueStep = 4;
var SlideValueMin = 0;
var SlideValueMax = 188;
var SlideValueStep = 8;
var NavState = new Array();
var NavIDIndex = 0;

function NavOver( Element )
{
	var ElementID = Element.id;

	// if this element does not have an ID, give it a unique one
	while( !ElementID )
	{
		var AttemptID = 'NavID-' + NavIDIndex;
		if( document.getElementById( AttemptID ) == null )
		{
			ElementID = AttemptID;
			Element.id = ElementID;
		}
		NavIDIndex++;
	}

	if( !NavState[ElementID] )
	{
		NavState[ElementID] = new Object();
		NavState[ElementID].FlashChange = 0;
		NavState[ElementID].FlashActive = false;
		NavState[ElementID].SlideChange = 0;
		NavState[ElementID].SlideActive = false;
	}

	// start the flashing link
	if( NavState[ElementID].FlashChange == 0 )
	{
		NavState[ElementID].FlashChange = FlashValueStep * -1;
	}

	// if we aren't already flashing this element
	if( !NavState[ElementID].FlashActive )
	{
		NavState[ElementID].FlashValue = FlashValueMax;
		FlashLink( ElementID );
	}

	// slide description up
	NavState[ElementID].SlideChange = SlideValueStep;
	if( !NavState[ElementID].SlideActive && EnableSlidingDescriptions )
	{
		NavState[ElementID].SlideValue = SlideValueMin;
		SlideDescription( ElementID );
	}
}

function NavOut( Element )
{
	var ElementID = Element.id;
	if( ElementID )
	{
		// stop flashing link
		NavState[ElementID].FlashChange = 0;

		// slide description down
		NavState[ElementID].SlideChange = SlideValueStep * -1;
		if( !NavState[ElementID].SlideActive && EnableSlidingDescriptions )
		{
			SlideDescription( ElementID );
		}
	}
}

// Handle Link "Animation"
function FlashLink( ElementID )
{
	var Element = document.getElementById( ElementID );

	if( NavState[ElementID].FlashChange != 0 )
	{
		if( NavState[ElementID].FlashActive )
		{
			NavState[ElementID].FlashValue += NavState[ElementID].FlashChange;

			if( NavState[ElementID].FlashValue < FlashValueMin )
			{
				NavState[ElementID].FlashValue = FlashValueMin + (FlashValueMin - NavState[ElementID].FlashValue);
				NavState[ElementID].FlashChange *= -1;
			}
			else if( NavState[ElementID].FlashValue > FlashValueMax )
			{
				NavState[ElementID].FlashValue = FlashValueMax - (NavState[ElementID].FlashValue - FlashValueMax);
				NavState[ElementID].FlashChange *= -1;
			}

			// adjust link background color
			var HexValue = NavState[ElementID].FlashValue.toString( 16 );
			Element.style.backgroundColor = '#' + HexValue + HexValue + HexValue;
		}
		else
		{
			NavState[ElementID].FlashActive = true;
		}

		// update again in a few milliseconds
		window.setTimeout( 'FlashLink("' + ElementID + '")', UpdateInterval );
	}
	else
	{
		Element.style.backgroundColor = '';
		NavState[ElementID].FlashActive = false;
	}
}

// Handle Description "Animation"
function SlideDescription( ElementID )
{
	var Element = document.getElementById( ElementID );
	var AnchorHeight = (Element && Element.clientHeight ? Element.clientHeight : 0);

	// if we found a following div
	Element = GetFollowingElement( Element, 'DIV' );
	if( Element )
	{
		if( NavState[ElementID].SlideChange != 0 )
		{
			// don't update position until we have waited one update interval
			// this works around the way Safari fires back-to-back MouseOut and MouseOver
			if( NavState[ElementID].SlideActive )
			{
				NavState[ElementID].SlideValue += NavState[ElementID].SlideChange;

				if( NavState[ElementID].SlideValue < SlideValueMin )
				{
					NavState[ElementID].SlideValue = SlideValueMin;
					NavState[ElementID].SlideChange = 0;
				}
				else if( NavState[ElementID].SlideValue > SlideValueMax )
				{
					NavState[ElementID].SlideValue = SlideValueMax;
					NavState[ElementID].SlideChange = 0;
				}

				// adjust description position
				Element.style.marginTop = (0 - NavState[ElementID].SlideValue - AnchorHeight) + 'px';
				Element.style.clip = 'rect(0px 152px ' + (NavState[ElementID].SlideValue) + 'px 0px)';
				if( Element.style.display != 'block' )
				{
					Element.style.display = 'block';
				}
			}
			else
			{
				NavState[ElementID].SlideActive = true;
			}

			// update again in a few milliseconds
			window.setTimeout( 'SlideDescription("' + ElementID + '")', UpdateInterval );
		}
		else
		{
			if( NavState[ElementID].SlideValue == SlideValueMin )
			{
				Element.style.display = 'none';
			}

			NavState[ElementID].SlideActive = false;
		}
	}
}

function GetPrecedingElement( Element, Tag )
{
	// get the preceding element with matching tag name
	while( Element && (!Element.tagName || Element.tagName != Tag) )
	{
		Element = Element.previousSibling;
	}

	return Element;
}

function GetFollowingElement( Element, Tag )
{
	// get the preceding element with matching tag name
	while( Element && (!Element.tagName || Element.tagName != Tag) )
	{
		Element = Element.nextSibling;
	}

	return Element;
}

function EnableDynamicNav( NavElementID, SlideDescriptions )
{
	EnableSlidingDescriptions = SlideDescriptions;
	var NavElement = document.getElementById( NavElementID );

	for( var ChildIndex = 0; ChildIndex < NavElement.childNodes.length; ChildIndex++ )
	{
		var Child = NavElement.childNodes[ ChildIndex ];
		if( Child && Child.tagName && Child.tagName == 'LI' )
		{
			Element = GetFollowingElement( Child.firstChild, 'A' );
			if( Element )
			{
				// attache MouseOver and MouseOut event handlers
				AddEvent( Element, 'mouseover', new Function( 'NavOver(this)' ) );
				AddEvent( Element, 'mouseout', new Function( 'NavOut(this)' ) );
			}
		}
	}
}
