// F. Permadi 2005.
// Highlights table row
// Copyright (C) F. Permadi
// This code is provided "as is" and without warranty of any kind.  Use at your own risk.



// These variables are for saving the original background colors
var savedStates=new Array();
var savedStateCount=0;

/////////////////////////////////////////////////////
// This function takes an element as a parameter and 
//   returns an object which contain the saved state
//   of the element's background color.
/////////////////////////////////////////////////////
function saveBackgroundStyle(myElement)
{
	saved=new Object();
	saved.element=myElement;
	saved.className=myElement.className;
	saved.backgroundColor=myElement.style["backgroundColor"];
	return saved;   
}

/////////////////////////////////////////////////////
// This function takes an element as a parameter and 
//   returns an object which contain the saved state
//   of the element's background color.
/////////////////////////////////////////////////////
function restoreBackgroundStyle(savedState)
{
	savedState.element.style["backgroundColor"]=savedState.backgroundColor;
	if (savedState.className)
	{
	savedState.element.className=savedState.className;    
	}
}

/////////////////////////////////////////////////////
// This function is used by highlightTableRow() to find table cells (TD) node
/////////////////////////////////////////////////////
function findNode(startingNode, tagName)
{
	// on Firefox, the TD node might not be the firstChild node of the TR node
	myElement=startingNode;
	var i=0;
	while (myElement && (!myElement.tagName || (myElement.tagName && myElement.tagName!=tagName)))
	{
	myElement=startingNode.childNodes[i];
	i++;
	}  
	if (myElement && myElement.tagName && myElement.tagName==tagName)
	{
	return myElement;
	}
	// on IE, the TD node might be the firstChild node of the TR node  
	else if (startingNode.firstChild)
	return findNode(startingNode.firstChild, tagName);
	return 0;
}

/////////////////////////////////////////////////////
// Highlight table row.
// newElement could be any element nested inside the table
// highlightColor is the color of the highlight
/////////////////////////////////////////////////////
function highlightTableRow(myElement, highlightColor)
{
	var i=0;
	// Restore color of the previously highlighted row
	for (i; i<savedStateCount; i++)
	{
	restoreBackgroundStyle(savedStates[i]);          
	}
	savedStateCount=0;

	// To get the node to the row (ie: the <TR> element), 
	// we need to traverse the parent nodes until we get a row element (TR)
	// Netscape has a weird node (if the mouse is over a text object, then there's no tagName
	while (myElement && ((myElement.tagName && myElement.tagName!="TR") || !myElement.tagName))
	{
	myElement=myElement.parentNode;
	}

	// If you don't want a particular row to be highlighted, set it's id to "header"
	// If you don't want a particular row to be highlighted, set it's id to "header"
	if (!myElement || (myElement && myElement.id && myElement.id=="header") )
	return;
		  
	// Highlight every cell on the row
	if (myElement)
	{
	var tableRow=myElement;

	// Save the backgroundColor style OR the style class of the row (if defined)
	if (tableRow)
	{
	  savedStates[savedStateCount]=saveBackgroundStyle(tableRow);
	  savedStateCount++;
	}

	// myElement is a <TR>, then find the first TD
	var tableCell=findNode(myElement, "TD");    

	var i=0;
	// Loop through every sibling (a sibling of a cell should be a cell)
	// We then highlight every siblings
	while (tableCell)
	{
	  // Make sure it's actually a cell (a TD)
	  if (tableCell.tagName=="TD")
	  {
		// If no style has been assigned, assign it, otherwise Netscape will 
		// behave weird.
		if (!tableCell.style)
		{
		  tableCell.style={};
		}
		else
		{
		  savedStates[savedStateCount]=saveBackgroundStyle(tableCell);        
		  savedStateCount++;
		}
		// Assign the highlight color
		tableCell.style["backgroundColor"]=highlightColor;

		// Optional: alter cursor
		tableCell.style.cursor='default';
		i++;
	  }
	  // Go to the next cell in the row
	  tableCell=tableCell.nextSibling;
	}
	}
}

/////////////////////////////////////////////////////
// This function is to be assigned to a <table> mouse event handler.
// If the element that fired the event is within a table row,
//   this function will highlight the row.
/////////////////////////////////////////////////////
function trackTableHighlight(mEvent, highlightColor)
{
	if (!mEvent)
	mEvent=window.event;
		
	// Internet Explorer
	if (mEvent.srcElement)
	{
	highlightTableRow( mEvent.srcElement, highlightColor);
	}
	// Netscape and Firefox
	else if (mEvent.target)
	{
	highlightTableRow( mEvent.target, highlightColor);		
	}
}

/////////////////////////////////////////////////////
// Highlight table row.
// newElement could be any element nested inside the table
// highlightColor is the color of the highlight
/////////////////////////////////////////////////////
function highlightTableRowVersionA(myElement)
{
	highlightColor = '#444';
	var i=0;
	// Restore color of the previously highlighted row
	for (i; i<savedStateCount; i++)
	{
	restoreBackgroundStyle(savedStates[i]);          
	}
	savedStateCount=0;

	// If you don't want a particular row to be highlighted, set it's id to "header"
	if (!myElement || (myElement && myElement.id && myElement.id=="header") )
	return;
		  
	// Highlight every cell on the row
	if (myElement)
	{
	var tableRow=myElement;

	// Save the backgroundColor style OR the style class of the row (if defined)
	if (tableRow)
	{
	  savedStates[savedStateCount]=saveBackgroundStyle(tableRow);
	  savedStateCount++;
	}

	// myElement is a <TR>, then find the first TD
	var tableCell=findNode(myElement, "TD");    

	var i=0;
	// Loop through every sibling (a sibling of a cell should be a cell)
	// We then highlight every siblings
	while (tableCell)
	{
	  // Make sure it's actually a cell (a TD)
	  if (tableCell.tagName=="TD")
	  {
		// If no style has been assigned, assign it, otherwise Netscape will 
		// behave weird.
		if (!tableCell.style)
		{
		  tableCell.style={};
		}
		else
		{
		  savedStates[savedStateCount]=saveBackgroundStyle(tableCell);        
		  savedStateCount++;
		}
		// Assign the highlight color
		tableCell.style["backgroundColor"]=highlightColor;

		// Optional: alter cursor
		tableCell.style.cursor='default';
		i++;
	  }
	  // Go to the next cell in the row
	  tableCell=tableCell.nextSibling;
	}
	}
}