﻿// 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) {
    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;
        }
    }
}