function getElementsByClass(searchClass, node, tag) {
    if (node == null) node = document;
    if (tag == null) tag = '*';

    var found = [];
    var elements = node.getElementsByTagName(tag);
    for (var i = 0; i < elements.length; i++) {
        var names = elements[i].className.split(' ');
        for (var j = 0; j < names.length; j++)
            if (names[j] == searchClass) found.push(elements[i]);
    }
    return found;
}

function getBackgroundColorOfElementId(id) {
    return getBackgroundColorOfElement(document.getElementById(id));
}
function getBackgroundColorOfElement(el) {
    if (el.currentStyle) return el.currentStyle.backgroundColor;
    if (document.defaultView) return document.defaultView.getComputedStyle(el, '').getPropertyValue('background-color');
    return null;
}

function hideElements(elts) {
    for (var i = 0; i < elts.length; i++) {
        elts[i].style.display = 'none';
        elts[i].style.visibility = 'hidden';
    }
}
function showElements(elts, type) {
    for (var i = 0; i < elts.length; i++) {
        elts[i].style.display = type ? type : '';
        elts[i].style.visibility = 'visible';
    }
}

function hideElementIds(ids) {
    for (var i = 0; i < ids.length; i++) {
        var elt = document.getElementById(ids[i]);
        if (elt) hideElements([ elt ]);
    }
}
function showElementIds(ids, type) {
    for (var i = 0; i < ids.length; i++) {
        var elt = document.getElementById(ids[i]);
        if (elt) showElements([ elt ], type);
    }
}

function makeElementsInvisible(elts) {
    for (var i = 0; i < elts.length; i++)
        elts[i].style.visibility = 'hidden';
}
function makeElementsVisible(elts) {
    for (var i = 0; i < elts.length; i++)
        elts[i].style.visibility = 'visible';
}

function toggleCheckboxElt(elt) {
    elt.checked = ! elt.checked;
}

function toggleCheckbox(id) {
    toggleCheckboxElt( document.getElementById(id) );
}

function toggleAllCheckboxes(elts) {
    for (var i = 0; i < elts.length; i++)
        toggleCheckboxElt( elts[i] );
}

function selectAllCheckboxes(elts) {
    for (var i = 0; i < elts.length; i++)
        elts[i].checked = true;
}

function deselectAllCheckboxes(elts) {
    for (var i = 0; i < elts.length; i++)
        elts[i].checked = false;
}

function disableButtonWithMessage(elt, msg) {
    elt.value = msg;
    elt.style = 'color: #ff3333; font-style: italic';
    elt.disabled = 1;
}

function disableElementsFromCheckbox(elts, checkbox_elt, inverse) {
    for (var i = 0; i < elts.length; i++)
        elts[i].disabled = inverse ? checkbox_elt.checked : ! checkbox_elt.checked;
}

function disableEnterKey(e) {
    var key;     
    if (window.event)
        key = window.event.keyCode; //IE
    else
        key = e.which; //firefox
    return (key != 13);
}

function highlightElementObject(elt, color) {
    if (! color) color = '#aaaaaa';
    if (elt) elt.style.backgroundColor = color;
}

function unhighlightElementObject(elt, uncolor) {
    if (! uncolor) uncolor = 'transparent';
    if (elt) elt.style.backgroundColor = uncolor;
}

function highlightElement(element_id, color) {
    highlightElementObject(document.getElementById(element_id), color);
}

function unhighlightElement(element_id, uncolor) {
    unhighlightElementObject(document.getElementById(element_id), uncolor);
}

function highlightElementsByClass(class_name, color) {
    var elts = getElementsByClass(class_name);
    for (var i=0; i < elts.length; i++) highlightElementObject(elts[i], color);
}

function unhighlightElementsByClass(class_name, uncolor) {
    var elts = getElementsByClass(class_name);
    for (var i=0; i < elts.length; i++) unhighlightElementObject(elts[i], uncolor);
}

function selectRowOnMouseover( row_id, checkbox_id, mouseover_color ) {
    if (! mouseover_color) mouseover_color = getBackgroundColorOfElementId('rowHighlightColor');
    highlightElement(row_id, mouseover_color);
}

function selectRowOnMouseout( row_id, checkbox_id, selected_color, unselected_color ) {
    if (! unselected_color) unselected_color = null;
    var checkbox;
    if (checkbox_id != null) checkbox = document.getElementById(checkbox_id);
    if (checkbox != null && checkbox.checked)
        highlightElement(row_id, selected_color);
    else
        unhighlightElement(row_id, unselected_color);
}

function toggleSelectRow( row_id, checkbox_id, toggle_checkbox, selected_color ) {
    var checkbox = document.getElementById(checkbox_id);
    if (toggle_checkbox)
        toggleCheckboxElt( checkbox );
    toggleSelectRowHighlighting( checkbox, row_id, selected_color );
}

function toggleSelectRowHighlighting( checkbox, row_id, selected_color ) {
    if (checkbox.checked)
        highlightElement(row_id, selected_color);
    else
        unhighlightElement(row_id);
}

function navigateToHrefId( anchor_id ) {
    location.href = document.getElementById(anchor_id).getAttribute('href');
}

function hideThemeNavigationMenu() {
    hideElementIds([ 'hideLinkList', 'larchives', 'lselect', 'volunteerSignupSheet', 'volunteerSignupSheetAdmin' ]);
    showElementIds([ 'showLinkList' ], 'block'); 
    document.getElementById('container').style.paddingRight = '10px';
    document.getElementById('supportingText').style.width = '100%';
    var sfld = document.getElementById('searchField');
    if (sfld) {
        var width;
        // TODO: find a way to abstract this, as in getBackgroundColorOfElement(), but generalized for any style property
        var navbar = document.getElementById('linkList2');
        if (navbar.currentStyle)
            width = navbar.currentStyle.width;
        else if (document.defaultView)
            width = document.defaultView.getComputedStyle(navbar, '').getPropertyValue('width');
        if (width)
            sfld.style.paddingRight = width;
    }
}
function showThemeNavigationMenu() {
    hideElementIds([ 'showLinkList' ]); 
    showElementIds([ 'hideLinkList', 'larchives', 'lselect', 'volunteerSignupSheet', 'volunteerSignupSheetAdmin' ], 'block');
    document.getElementById('container').style.paddingRight = null;
    document.getElementById('supportingText').style.width = null;
    var sfld = document.getElementById('searchField');
    if (sfld)
        sfld.style.paddingRight = null;
}

