/* Collapse/Expand long second-level menus
 *
 * @author Dayan Paez, OpenWeb Solutions, LLC
 * @version 2012-11-06
 */

var ACC_THRESHOLD = 13;
var ACC_VISIBLE = 8;
var ACC_EXP_MES = "↓ Show all";
var ACC_COL_MES = "↑ Hide";

var ACC_STACK = Array();
var ACC_OPEN = false;
var ACC_TIMEOUT = 30;

function initCollapse(evt) {
    // Fetch second-level menus
    var cont = document.getElementById('links');
    if (!cont)
        return;
    var menus = Array();
    for (var i = 0; i < cont.childNodes.length; i++) {
        if (cont.childNodes[i].tagName.toLowerCase() == 'ul') {
            var children = cont.childNodes[i].getElementsByTagName('ul');
            for (var j = 0; j < children.length; j++)
                menus.push(children[j]);
        }
    }
    
    // Apply accordion where applicable
    for (var i = 0; i < menus.length; i++) {
        if (menus[i].childNodes.length >= ACC_THRESHOLD) {
            var link = document.createElement('li');
            link.className = 'accordion-button';
            link.style.cursor = 'pointer';
            link.onclick = acc_toggle;
            menus[i].appendChild(link);
            ACC_OPEN = false;
            acc_collapse(link);
        }
    }
}

function acc_set_display(open) {
    if (ACC_STACK.length == 0)
        return;
    var other = ACC_STACK.shift();
    if (ACC_OPEN)
        other.style.display = "list-item";
    else
        other.style.display = "none";
    setTimeout(acc_set_display, ACC_TIMEOUT);
}

function acc_collapse(li) {
    // Remove children beyond certain limit, except for itself
    var siblings = li.parentNode.childNodes;
    for (var j = ACC_VISIBLE; j < siblings.length - 1; j++) {
        ACC_STACK.push(siblings[j]);
    }
    acc_set_display();

    // Replace text
    while (li.childNodes.length > 0)
        li.removeChild(li.childNodes[0]);
    if (ACC_OPEN) {
        li.appendChild(document.createTextNode(ACC_COL_MES));
        li.classList.remove('collapsed');
    }
    else {
        li.appendChild(document.createTextNode(ACC_EXP_MES));
        li.classList.add('collapsed');
    }
}

function acc_toggle(evt) {
    var elem;
    var e = evt ? evt : event;
    if (e.srcElement)
        elem = evt.srcElement;
    else if (evt.target)
        elem = evt.target;
    else
        return;

    ACC_OPEN = elem.classList.contains('collapsed');
    acc_collapse(elem);
}

// ------------------------------------------------------------
// Call initCollapse on page load
// ------------------------------------------------------------

var old = window.onload;
if (old) {
    window.onload = function(evt) {
        old();
        initCollapse(evt);
    };
}
else
    window.onload = initCollapse;
