
/** 
 * This array is used to remember mark status of rows in browse mode 
 */ 
var marked_row = new Array; 


/** 
 * Sets/unsets the pointer and marker in browse mode 
 * 
 * @param   object    the table row 
 * @param   interger  the row number 
 * @param   string    the action calling this script (over, out or click) 
 * @param   string    the default background color 
 * @param   string    the color to use for mouseover 
 * @param   string    the color to use for marking a row 
 * 
 * @return  boolean  whether pointer is set or not 
 */ 
function setPointer(theRow, theRowNum, theAction, theDefaultColor, thePointerColor, theMarkColor) 
{ 
    var theCells = null; 

    // 1. Pointer and mark feature are disabled or the browser can't get the 
    //    row -> exits 
    if ((thePointerColor == '' && theMarkColor == '') 
        || typeof(theRow.style) == 'undefined') { 
        return false; 
    } 

    // 2. Gets the current row and exits if the browser can't get it 
    if (typeof(document.getElementsByTagName) != 'undefined') { 
        theCells = theRow.getElementsByTagName('td'); 
    } 
    else if (typeof(theRow.cells) != 'undefined') { 
        theCells = theRow.cells; 
    } 
    else { 
        return false; 
    } 

    // 3. Gets the current color... 
    var rowCellsCnt  = theCells.length; 
    var domDetect    = null; 
    var currentColor = null; 
    var newColor     = null; 
    // 3.1 ... with DOM compatible browsers except Opera that does not return 
    //         valid values with "getAttribute" 
    if (typeof(window.opera) == 'undefined' 
        && typeof(theCells[0].getAttribute) != 'undefined') { 
        currentColor = theCells[0].getAttribute('bgcolor'); 
        domDetect    = true; 
    } 
    // 3.2 ... with other browsers 
    else { 
        currentColor = theCells[0].style.backgroundColor; 
        domDetect    = false; 
    } // end 3 

    // 3.3 ... Opera changes colors set via HTML to rgb(r,g,b) format so fix it 
    if (currentColor.indexOf("rgb") >= 0) 
    { 
        var rgbStr = currentColor.slice(currentColor.indexOf('(') + 1, 
                                     currentColor.indexOf(')')); 
        var rgbValues = rgbStr.split(","); 
        currentColor = "#"; 
        var hexChars = "0123456789ABCDEF"; 
        for (var i = 0; i < 3; i++) 
        { 
            var v = rgbValues[i].valueOf(); 
            currentColor += hexChars.charAt(v/16) + hexChars.charAt(v%16); 
        } 
    } 

    // 4. Defines the new color 
    // 4.1 Current color is the default one 
    if (currentColor == '' 
        || currentColor.toLowerCase() == theDefaultColor.toLowerCase()) { 
        if (theAction == 'over' && thePointerColor != '') { 
            newColor              = thePointerColor; 
        } 
        else if (theAction == 'click' && theMarkColor != '') { 
            newColor              = theMarkColor; 
            marked_row[theRowNum] = true; 
        } 
    } 
    // 4.1.2 Current color is the pointer one 
    else if (currentColor.toLowerCase() == thePointerColor.toLowerCase() 
             && (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum])) { 
        if (theAction == 'out') { 
            newColor              = theDefaultColor; 
        } 
        else if (theAction == 'click' && theMarkColor != '') { 
            newColor              = theMarkColor; 
            marked_row[theRowNum] = true; 
        } 
    } 
    // 4.1.3 Current color is the marker one 
    else if (currentColor.toLowerCase() == theMarkColor.toLowerCase()) { 
        if (theAction == 'click') { 
            newColor              = (thePointerColor != '') 
                                  ? thePointerColor 
                                  : theDefaultColor; 
            marked_row[theRowNum] = (typeof(marked_row[theRowNum]) == 'undefined' || !marked_row[theRowNum]) 
                                  ? true 
                                  : null; 
        } 
    } // end 4 

    // 5. Sets the new color... 
    if (newColor) { 
        var c = null; 
        // 5.1 ... with DOM compatible browsers except Opera 
        if (domDetect) { 
            for (c = 0; c < rowCellsCnt; c++) { 
                theCells[c].setAttribute('bgcolor', newColor, 0); 
            } // end for 
        } 
        // 5.2 ... with other browsers 
        else { 
            for (c = 0; c < rowCellsCnt; c++) { 
                theCells[c].style.backgroundColor = newColor; 
            } 
        } 
    } // end 5 

    return true; 
} // end of the 'setPointer()' function 

