
// This script should be included at the END of the document. 
// For the fastest loading it does not inlude $(document).ready()

// This Document contains a few helper functions for the documentation to display the current version,
// collapse and expand the menu etc.


// Function to make the sticky header possible
function shiftWindow() { 
    scrollBy(0, -70);
    console.log("window shifted")
}

window.addEventListener("hashchange", shiftWindow);

function loadShift() {
    if (window.location.hash) {
        console.log("window has hash");
        shiftWindow();
    }
}

$(window).load(function() {
    loadShift();
});

$(function(){

    // sidebar accordian-ing
    // don't apply on last object (it should be the FAQ) or the first (it should be introduction)

    // define an array to which all opened items should be added
    var openmenus = [];

    var elements = $('.toctree-l2');
    // for (var i = 0; i < elements.length; i += 1) { var current = $(elements[i]); current.children('ul').hide();}


    // set initial collapsed state
    var elements = $('.toctree-l1');
    for (var i = 0; i < elements.length; i += 1) {
        var current = $(elements[i]);
        if (current.hasClass('current')) {
            current.addClass('open');
            currentlink = current.children('a')[0].href;
            openmenus.push(currentlink);

            // do nothing
        } else {
            // collapse children
            current.children('ul').hide();
        }
    }

    if (doc_version == "") {
        $('.version-flyer ul').html('<li class="alternative active-slug"><a href="" title="Switch to local">Local</a></li>');
    }

    // mark the active documentation in the version widget
    $(".version-flyer a:contains('" + doc_version + "')").parent().addClass('active-slug');


    // attached handler on click
    // Do not attach to first element or last (intro, faq) so that
    // first and last link directly instead of accordian
    $('.sidebar > ul > li > a').not(':last').not(':first').click(function(){

        var index = $.inArray(this.href, openmenus)

        if (index > -1) {
            console.log(index);
            openmenus.splice(index, 1);


            $(this).parent().children('ul').slideUp(200, function() {
                $(this).parent().removeClass('open'); // toggle after effect
            });
        }
        else {
            openmenus.push(this.href);

            var current = $(this);

            setTimeout(function() {
                // $('.sidebar > ul > li').removeClass('current');
                current.parent().addClass('current').addClass('open'); // toggle before effect
                current.parent().children('ul').hide();
                current.parent().children('ul').slideDown(200);
            }, 100);
        }
        return false;
    });

    // add class to all those which have children
    $('.sidebar > ul > li').not(':last').not(':first').addClass('has-children');

});