/** 
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements.  See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership.  The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License.  You may obtain a copy of the License at
* 
*   http://www.apache.org/licenses/LICENSE-2.0
* 
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied.  See the License for the
* specific language governing permissions and limitations
* under the License.
*/

/**
 * Function to synchronize all tabs on a page to a given user selection. 
 * 
 * The selection of a tab group should only change if it contains an 
 * input with the given tabId. Otherwise, its current seletion should
 * remain unchanged.
 * 
 * See layouts/shortcodes/tabs.html
 */
function onSwitch(tabId) {
    var selectorForId = "[data-tab-group='flink-tabs'][data-tab-item='" + tabId + "']";

    Array
        // find all tab group elements on the page
        .from(document.getElementsByClassName("book-tabs"))
        // filter out any elements that do not contain 
        // the specific tab the user wants to switch to.
        // these tabs should remain on their current selection
        .filter(div => div.querySelectorAll(selectorForId).length > 0)
        // extract the input elements for all tab groups
        // that do contain the target tab id
        .flatMap(div => Array.from(div.querySelectorAll("[data-tab-group='flink-tabs']")))
        // check input elements that contain the selected tabId
        // and uncheck all others
        .forEach(input => {
            if (input.matches(selectorForId)) {
                input.setAttribute("checked", "checked")
            } else {
                input.removeAttribute("checked")
            }
        });
}

/**
 * Function to collapse the ToC in desktop mode.
 */
function collapseToc() {
    document.querySelector(".book-toc").style["display"] = "none";
    document.querySelector(".expand-toc").style["display"] = "block";

    sessionStorage.setItem("collapse-toc", "true");
}

/**
 * Function to expand the ToC in desktop mode.
 */
function expandToc() {
    document.querySelector(".book-toc").style["display"] = "block";
    document.querySelector(".expand-toc").style["display"] = "none";

    sessionStorage.removeItem("collapse-toc");
}



/**
 * Selects all text within the given container and copies it
 * to the users clipboard. If any actions are not supported
 * by a users browser this function will do nothing.
 */
function selectTextAndCopy(containerId) {
    if (wasLastCopied(containerId)) {
        return;
    }

    try {
        if (highlightContent(containerId)) {
            if (document.queryCommandSupported("copy")) {
                document.execCommand("copy") && showCurrentCopyAlert(containerId);
            }
        }  
    } catch (e) {}
}

/**
 * Checks if this container was the most recent one copied
 * to the clipboard. This was users can double click and
 * highlight specific portions of the dep. 
 */
function wasLastCopied(containerId) {
    return document
        .querySelector("[copyable='flink-module'][copyattribute='" + containerId + "'")
        .style["display"] == "block";
}

/**
 * Highlights the content of the given container.
 * Returns true on success, false otherwise.
 */
function highlightContent(containerId) {
    try {
        if (document.selection) {
            var range = document.body.createTextRange();
            range.moveToElementText(document.getElementById(containerId));
            range.select().createTextRange();
            return true;
        } else if (window.getSelection) {
            var range = document.createRange();
            range.selectNode(document.getElementById(containerId));
            window.getSelection().removeAllRanges();
            window.getSelection().addRange(range);
            return true;
        } else {
            return false;
        }
    } catch (err) {
        // Text highlighting is not supported by this browser
        return false;
    }
}


/**
 * Makes the copy alert for the given container
 * visible while hiding all others.
 */
function showCurrentCopyAlert(containerId) {
    document
        .querySelectorAll("[copyable='flink-module']")
        .forEach(function (alert) {
            alert.style["display"] = "none";
        });

    var alert = document.querySelector("[copyable='flink-module'][copyattribute='" + containerId + "'");

    alert.style["text-align"] = "center";
    alert.style["display"] = "block";
}

/**
 * Adds forEach to NodeList for old versions
 * of microsoft IE and Edge.
 */
if (window.NodeList && !NodeList.prototype.forEach) {
    NodeList.prototype.forEach = Array.prototype.forEach;
}

/**
 * Adds forEach to Element for old versions
 * of microsoft IE and Edge.
 */
if (!Element.prototype.matches) {
  Element.prototype.matches = Element.prototype.msMatchesSelector ||
                              Element.prototype.webkitMatchesSelector;
}


document.addEventListener("DOMContentLoaded", function(event) { 
    if (sessionStorage.getItem("collapse-toc") === "true") {
        collapseToc();
    }

    // Display anchor links when hovering over headers. For documentation of the
    // configuration options, see the AnchorJS documentation.
    anchors.options = {
        placement: 'right'
    };
    
	// add anchors to h5 headings, hugo already adds them
	// to h1-h4 but we use h5 in generated documentation
    anchors.add('h5');
});
