function initSidebar() {
  var filename = document.location.pathname;

  if (filename.slice(0, 5) == "/next") {
    filename = filename.slice(5);
  }

  if (filename == "/") {
    filename = "/index.html";
  } else if (filename.slice(0, 6) == "/news/") {
    filename = "/news/";
  }

  var menu = document.getElementById("menu");
  var setMenuLayout = function() {
    if (window.innerWidth < 900) {
      document.body.className = "narrow";
      menu.className = "";
      document.getElementById("main_content").style.minHeight = "0";
    } else {
      if (document.body.clientWidth < 1340) {
        document.body.className = "normal";
      } else {
        document.body.className = "wide";
      }

      var y = (window.pageYOffset !== undefined) ? window.pageYOffset :
        (document.documentElement || document.body.parentNode || document.body).scrollTop;

      if (y < 444 || window.innerHeight < menu.clientHeight + 100) {
        menu.className = "";
      } else {
        menu.className = "floating";
      }

      setTimeout(function () {
        document.getElementById("main_content").style.minHeight = menu.clientHeight + 100 + "px";
      }, 10);
    }
  };
  setMenuLayout();
  window.onresize = setMenuLayout;
  window.onscroll = setMenuLayout;

  var items = menu.getElementsByTagName("li");
  var toc = null;
  for (var i = 0; i < items.length; i++) {
    var link = items[i].getElementsByTagName("a")[0];
    var href = link.href;
    if (href.lastIndexOf(filename) >= 0) {
      var parent = link.parentNode;

      while (link.childNodes.length > 0) {
        var child = link.childNodes[0];
        link.removeChild(child);
        parent.appendChild(child);
      }
      parent.removeChild(link);
      items[i].className = "selected";
      toc = document.createElement("ul");
      toc.id = "toc";
      items[i].appendChild(toc);
    }
  }

  return toc;
}

function setupSidebar() {
  if (window.CAPNP_NEWS_SIDEBAR) {
    setupNewsSidebar(CAPNP_NEWS_SIDEBAR);
    return;
  }

  var filename = document.location.pathname;

  if (filename.slice(0, 5) == "/next") {
    filename = filename.slice(5);
  }

  var isNews = filename.slice(0, 6) == "/news/";

  var toc = initSidebar();
  if (toc) {
    var content = document.getElementById("main_content").childNodes;
    var headings = [];

    for (var i = 0; i < content.length; i++) {
      if (content[i].tagName == "H2" ||
          (!isNews && (content[i].tagName == "H3" || content[i].tagName == "H4"))) {
        headings.push(content[i]);
      }
    }

    var levels = [toc];
    for (var i in headings) {
      var hl = headings[i].tagName.slice(1) - 1;
      while (hl > levels.length) {
        var parent = levels[levels.length - 1];
        var item = parent.childNodes[parent.childNodes.length - 1];
        var sublist = document.createElement("ul");
        item.appendChild(sublist);
        levels.push(sublist);
      }
      while (hl < levels.length) {
        levels.pop();
      }

      var parent = levels[levels.length - 1];
      var item = document.createElement("li");
      var p = document.createElement("p");
      var link = document.createElement("a");
      p.appendChild(document.createTextNode(headings[i].innerText || headings[i].textContent));
      var hlinks = headings[i].getElementsByTagName("a");
      if (hlinks.length == 1) {
        link.href = hlinks[0].href;
      } else {
        link.href = "#" + headings[i].id;
      }
      link.appendChild(p);
      item.appendChild(link);
      parent.appendChild(item);
    }
  }
}

function setupNewsSidebar(items) {
  var toc = initSidebar();
  if (toc) {
    for (var i in items) {
      var item = document.createElement("li");
      var p = document.createElement("p");
      var link = document.createElement("a");
      p.appendChild(document.createTextNode(items[i].title));
      link.href = items[i].url;
      link.appendChild(p);
      item.appendChild(link);
      toc.appendChild(item);
    }
  }
}

function setupSlides() {
  var slides = document.querySelectorAll("body.slides main section");
  var headerTitle = document.querySelector("body.slides header .title");
  var slideNum = document.querySelector("#slide-num");

  var current = 0;
  var hash = document.location.hash;
  if (hash) {
    current = parseInt(hash.slice(1)) - 1;
  }
  slides[current].className = "current";
  headerTitle.textContent = slides[current].dataset.title || "";
  slideNum.textContent = window.location.hash;

  function navSlide(diff) {
    slides[current].className = "";
    current = Math.min(slides.length - 1, Math.max(0, current + diff));
    slides[current].className = "current";

    headerTitle.textContent = slides[current].dataset.title || "";
    if (current) {
      history.replaceState({}, "", "#" + (current + 1));
      slideNum.textContent = "#" + (current + 1);
    } else {
      history.replaceState({}, "", window.location.pathname);
      slideNum.textContent = "";
    }
  }

  document.body.addEventListener("keydown", event => {
    if (event.keyCode == 39) {
      navSlide(1);
    } else if (event.keyCode == 37) {
      navSlide(-1);
    }
  });

  document.querySelector("body.slides footer button.back").addEventListener("click", event => {
    navSlide(-1);
  });
  document.querySelector("body.slides footer button.forward").addEventListener("click", event => {
    navSlide(1);
  });

  if (document.location.hostname === "localhost") {
    var lastModified = new Date(document.lastModified);
    setInterval(function () {
      var req = new Request(".", {headers: {
          "If-Modified-Since": lastModified.toUTCString()}});
      fetch(req).then(response => {
        if (response.status == 200 &&
            new Date(response.headers.get("Last-Modified")) > lastModified) {
          document.location.reload();
        }
      });
    }, 1000);
  }
}