// tablecollapse.js
// Copyright (c) 2009 'Ili Butterfield except where otherwise noted. No
// permission is granted to copy, modify, or distribute this code in full or in
// part without prior written permission from the author.

var collapsedImageSrc = "arrow-collapsed.png";
var expandedImageSrc = "arrow-expanded.png";

window.onload = setupCollapsingTables;

function setupCollapsingTables() {
    getElementsByClass("gameworkstable", document, "table").forEach(setupCollapsingTable);
}

function setupCollapsingTable(table) {
    var massToggleData = new Array();
    
    var games = table.getElementsByTagName("td")
    for (var i = 0; i < games.length; i++) {
        var toggleElements = setupCollapsingGame(games[i]);
        
        if (toggleElements) {
            massToggleData.push(toggleElements);
        }
    }
    
    var toggleAllImage = new Image();
    toggleAllImage.className = "collapsetoggler";
    toggleAllImage.src = collapsedImageSrc;
    toggleAllImage.onclick = function() { toggleBatch(massToggleData, toggleAllImage); };
    toggleAllImage.expandedAll = false;
    
    var gameHeader = table.children[0].children[0].children[1];
    gameHeader.insertBefore(toggleAllImage, gameHeader.firstChild);
}

function setupCollapsingGame(game) {
    // Do some error checking first before we start messing with the DOM.
    if (!game.hasChildNodes() || game.children.length != 2) {
        return;
    }
    var header = game.children[0];
    if (header.tagName.toLowerCase() != "p") {
        return;
    }
    var details = game.children[1];
    if (details.tagName.toLowerCase() != "div") {
        return;
    }
    
    var toggleImage = new Image();
    toggleImage.className = "collapsetoggler";
    toggleImage.src = collapsedImageSrc;
    toggleImage.onclick = function() { toggleCollapse(details, toggleImage); };
    header.parentNode.insertBefore(toggleImage, header);
    
    toggleCollapse(details, toggleImage);
    
    return {details: details, toggleImage: toggleImage};
}

function toggleBatch(toggleData, toggleAllImage) {
    if (toggleAllImage.expandedAll) {
        var toggleAction = collapseGame;
        toggleAllImage.src = collapsedImageSrc;
        toggleAllImage.expandedAll = false;
    } else {
        var toggleAction = expandGame;
        toggleAllImage.src = expandedImageSrc;
        toggleAllImage.expandedAll = true;
    }
    
    for (var i = 0; i < toggleData.length; i++) {
        toggleAction(toggleData[i].details, toggleData[i].toggleImage);
    }
}

function toggleCollapse(details, toggleImage) {
    if (details.style.display == "none") {
        expandGame(details, toggleImage);
    } else {
        collapseGame(details, toggleImage);
    }
}

function expandGame(details, toggleImage) {
    toggleImage.src = expandedImageSrc;
    details.style.display = "block";
}

function collapseGame(details, toggleImage) {
    toggleImage.src = collapsedImageSrc;
    details.style.display = "none";
}

// Code (c) 2005 Dustin Diaz
// http://www.dustindiaz.com/getelementsbyclass/
function getElementsByClass(searchClass,node,tag) {
    var classElements = new Array();
    if ( node == null )
        node = document;
    if ( tag == null )
        tag = '*';
    var els = node.getElementsByTagName(tag);
    var elsLen = els.length;
    var pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)");
    for (i = 0, j = 0; i < elsLen; i++) {
        if ( pattern.test(els[i].className) ) {
            classElements[j] = els[i];
            j++;
        }
    }
    return classElements;
}

