"use strict";

function toggleFoo(element) {
    element.classList.toggle("rotate-180");
}
    
function distanceToWindowBottom() {
    // https://stackoverflow.com/a/2800676/339144
    let scrollPosition = window.pageYOffset;
    let windowSize     = window.innerHeight;
    let bodyHeight     = document.querySelector("html").offsetHeight;
    return Math.max(bodyHeight - (scrollPosition + windowSize), 0);
}

onscroll = (event) => {
    setBodyMinHeight();
};

function setBodyMinHeight() {
  let body = document.querySelector("html");
  let bodyHeightPreCollapse = body.offsetHeight;
  // console.log("was actually", bodyHeightPreCollapse, "minimally", body.style.minHeight);
  body.style.minHeight = (bodyHeightPreCollapse - distanceToWindowBottom()) + "px";
  // console.log("is now actually", document.html.offsetHeight, "minimally", html.style.minHeight);
}

function collapseSection(element) {
  if (element.getAttribute("data-collapsed") === "true") {
    return;
  }

  // get the height of the element's inner content, regardless of its actual size
  const sectionHeight = element.scrollHeight;

  setBodyMinHeight();

  // temporarily disable all css transitions
  const elementTransition = element.style.transition;
  element.style.transition = '';

  // on the next frame (as soon as the previous style change has taken effect),
  // explicitly set the element's height to its current pixel height, so we
  // aren't transitioning out of 'auto'
  requestAnimationFrame(function() {
    element.style.height = sectionHeight + 'px';
    element.style.transition = elementTransition;

    // on the next frame (as soon as the previous style change has taken effect),
    // have the element transition to height: 0
    requestAnimationFrame(function() {
      element.style.height = 0 + 'px';
    });
  });

  // mark the section as "currently collapsed"
  element.setAttribute('data-collapsed', 'true');
}

function expandSection(element) {
  if (element.getAttribute("data-collapsed") !== "true") {
    return;
  }

  setBodyMinHeight();

  // get the height of the element's inner content, regardless of its actual size
  const sectionHeight = element.scrollHeight;

  // have the element transition to the height of its inner content
  let explicitlySetValue = sectionHeight + 'px';
  element.style.height = explicitlySetValue;

  // when the next css transition finishes (which should be the one we just triggered)
  const onTransitioned = function(e) {
    // remove this event listener so it only gets triggered once
    element.removeEventListener('transitionend', onTransitioned);
    
    // remove "height" from the element's inline styles, so it can return to its initial value
    if (element.style.height == explicitlySetValue) {
        element.style.removeProperty("height");
    }
  }

  element.addEventListener('transitionend', onTransitioned);

  // mark the section as "currently not collapsed"
  element.setAttribute('data-collapsed', 'false');
}

function toggleFrameVisibility(frameHeader) {
    const frameDetails = frameHeader.parentNode.querySelector(".js-frame-details");
    if (frameDetails.getAttribute("data-collapsed") === "true") {
        expandSection(frameDetails);
    } else {
        collapseSection(frameDetails);
    }
    frameHeader.querySelector(".js-chevron").classList.toggle("rotate-180");
}


function showAllFrames() {
    document.querySelectorAll(".js-frame-details").forEach((frameDetails) => {
        expandSection(frameDetails);
    });
    document.querySelectorAll(".js-chevron").forEach((chevron) => {
        chevron.classList.add("rotate-180");
    });
}

function showInAppFrames() {
    document.querySelectorAll(".js-frame-details").forEach((frameDetails) => {
        if (frameDetails.classList.contains("js-in-app")) {
            expandSection(frameDetails);
            frameDetails.parentNode.querySelector(".js-chevron").classList.add("rotate-180");
        } else {
            collapseSection(frameDetails);
            frameDetails.parentNode.querySelector(".js-chevron").classList.remove("rotate-180");
        }
    });
    // this works because when there are repeated anchors a browser will just jump to the first one.
    // the less lazy way would be to just have a single such anchor
    window.location = window.location.origin + window.location.pathname + '#in-app';
}

function showRaisingFrame() {
    document.querySelectorAll(".js-frame-details").forEach((frameDetails) => {
        if (frameDetails.classList.contains("js-raising-frame")) {
            expandSection(frameDetails);
            frameDetails.parentNode.querySelector(".js-chevron").classList.add("rotate-180");
        } else {
            collapseSection(frameDetails);
            frameDetails.parentNode.querySelector(".js-chevron").classList.remove("rotate-180");
        }
    });
    window.location = window.location.origin + window.location.pathname + '#raise';
}

function hideAllFrames() {
    document.querySelectorAll(".js-frame-details").forEach((frameDetails) => {
        collapseSection(frameDetails);
    });
    document.querySelectorAll(".js-chevron").forEach((chevron) => {
        chevron.classList.remove("rotate-180");
    });
}
