(function () {
  "use strict";
  const smoothScrollLinks = document.getElementsByClassName("smooth-scroll");

  const easeInOutQuad = function (t) {
    return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
  };

  const scrollToEl = (
    startTime,
    currentTime,
    duration,
    scrollEndElemTop,
    startScrollOffset
  ) => {
    const runtime = currentTime - startTime;
    let progress = runtime / duration;

    progress = Math.min(progress, 1);

    const ease = easeInOutQuad(progress);

    window.scroll(0, startScrollOffset + scrollEndElemTop * ease);
    if (runtime < duration) {
      window.requestAnimationFrame((timestamp) => {
        const currentTime = timestamp || new Date().getTime();
        scrollToEl(
          startTime,
          currentTime,
          duration,
          scrollEndElemTop,
          startScrollOffset
        );
      });
    }
  };

  if (smoothScrollLinks.length > 0) {
    for (let i = 0; i < smoothScrollLinks.length; i++) {
      const smoothScrollLink = smoothScrollLinks[i];

      smoothScrollLink.addEventListener("click", function (e) {
        e.preventDefault();
        const link = e.target.closest(".smooth-scroll");
        const targetId = link.href.split("#")[1];
        const target = document.getElementById(targetId);
        const duration = link.getAttribute("data-duration") || 1000;

        if (!target) return;

        window.requestAnimationFrame((timestamp) => {
          const stamp = timestamp || new Date().getTime();
          const start = stamp;

          const startScrollOffset = window.pageYOffset;
          const scrollEndElemTop = target.getBoundingClientRect().top;

          scrollToEl(
            start,
            stamp,
            duration,
            scrollEndElemTop,
            startScrollOffset
          );
        });
      });
    }
  }
})();
