$(function () {
    //this script says, if the height of the viewport is greater than 800px, then insert affix class, which makes the
    // nav bar float in a fixed position as your scroll. if you have a lot of nav items, this height may not work for
    // you. var h = $(window).height(); console.log (h); if (h > 800) { $( "#mysidebar" ).attr("class", "nav affix"); }
    // activate tooltips. although this is a bootstrap js function, it must be activated this way in your theme.
    $('[data-toggle="tooltip"]').tooltip({ placement: 'top' });

    anchors.add('h2,h3,h4,h5');

    $(document).ready(function() {
        $("#mysidebar li.subfolders > a").click(function (e) {
            e.preventDefault();
            var theUl = $(this).parent().select("ul");
            if (!theUl.hasClass("open")) {
                theUl.addClass("open");
                theUl.removeClass("closed");
            } else {
                theUl.addClass("closed");
                theUl.removeClass("open");
            }
        });
        $("#collapseAll").click(function(e) {
            e.preventDefault();
            var theLis = $("#mysidebar li.subfolders");
            theLis.addClass("closed");
            theLis.removeClass("open");
        });

        $("#expandAll").click(function(e) {
            e.preventDefault();
            var theLis = $("#mysidebar li.subfolders");
            theLis.addClass("open");
            theLis.removeClass("closed");
        });

    });

    $("#dev-warning").hide();
    changeSelectedDocVersionDropdownSelection($("#docVersion")[0]);
    $("#docVersion").change(changeSelectedDocVersion);
});

function changeSelectedDocVersionDropdownSelection(element) {
    var pathName = window.location.pathname;

    var versionOptions = element.options;
    for (var i = 0; i < versionOptions.length; i++) {
        var versionValue = versionOptions[i].value;
        if ((versionValue !== "") && pathName.startsWith("/ditto/"+versionValue+"/")) {
            $("#docVersion").val(versionValue).change();
            return;
        }
    }
    // fallback: dev with "empty" version value:
    $("#docVersion").val("").change();
    $("#dev-warning").show();
}

function changeSelectedDocVersion() {
    var versionValue = $('#docVersion').val();
    var remainingPath = window.location.pathname.replace("/ditto/", "/");
    remainingPath = remainingPath.startsWith("/") ? remainingPath.substr(1) : remainingPath;
    var versionMatch = remainingPath.match("([0-9].[0-9])/(.*)");
    if (versionValue === "" && !versionMatch) {
        // do nothing, we're already on the correct "dev" version
    } else if (versionMatch && (versionValue === versionMatch[1])) {
        // do nothing, we're already on the correct version
    } else {
        if (versionValue === "" && versionMatch) {
            window.location.pathname = "ditto/" + versionMatch[2];
        } else if (versionValue === "") {
            window.location.pathname = "ditto/" + remainingPath;
        } else if (versionMatch) {
            window.location.pathname = "ditto/" + versionValue + "/" + versionMatch[2];
        } else {
            window.location.pathname = "ditto/" + versionValue + "/" + remainingPath;
        }
    }
}
