/*! loadJS: load a JS file asynchronously. [c]2014 @scottjehl, Filament Group, Inc. (Based on http://goo.gl/REQGQ by Paul Irish). Licensed MIT */
(function( w ){
        var loadJS = function( src, cb, ordered ){
                "use strict";
                var tmp;
                var ref = w.document.getElementsByTagName( "script" )[ 0 ];
                var script = w.document.createElement( "script" );

                if (typeof(cb) === 'boolean') {
                        tmp = ordered;
                        ordered = cb;
                        cb = tmp;
                }

                script.src = src;
                script.async = !ordered;
                ref.parentNode.insertBefore( script, ref );

                if (cb && typeof(cb) === "function") {
                        script.onload = cb;
                }
                return script;
        };
        // commonjs
        if( typeof module !== "undefined" ){
                module.exports = loadJS;
        }
        else {
                w.loadJS = loadJS;
        }
}( typeof global !== "undefined" ? global : this ));
/*! end loadJS */

// Remaining portions of this file are
//
// Copyright (c) 2019 Baldur Karlsson
//
// SPDX-License-Identifier: Apache-2.0

var searchengine = undefined;

// scroll to the first <a> linking to a chapter
function scrollChapter(element, chapter) {
  for(var i=0; i < element.children.length; i++) {
    if(element.children[i].nodeName == "A" && element.children[i].href.indexOf(chapter) >= 0) {
      element.children[i].scrollIntoView(true);
      return true;
    }

    if(scrollChapter(element.children[i], chapter))
      return true;
  }

  return false;
}

var results = undefined;
var searchbox = undefined;
var searchTimeout = undefined;

function clearSearch() {
  while(results.children.length > 0) {
    results.removeChild(results.children[0]);
  }

  document.getElementById("resultsdiv").classList.remove("results");
}

function doSearch() {
  clearSearch();

  var searchtext = searchbox.value;

  if(searchtext == '')
    return;

  if(searchtext.indexOf(' ') == -1 && searchtext.indexOf('\t') == -1 && searchtext.indexOf('"') == -1)
    searchtext = searchtext + ' ' + searchtext + '*';

  searchtext = searchtext.replace(/"/g, '')

  var searchresults = searchengine.search(searchtext);

  if(searchresults.length == 0) {
    var r = document.createElement('LI');
    r.innerHTML = 'No results';

    results.appendChild(r);
  }

  document.getElementById("resultsdiv").classList.add("results");

  for(var i=0; i < 10 && i < searchresults.length; i++) {
    var a = document.createElement('A');
    a.setAttribute('href', searchresults[i].ref);
    a.innerHTML = searchlookup[searchresults[i].ref];

    var r = document.createElement('LI');
    r.appendChild(a);

    results.appendChild(r);
  }
}

function searchInput(e) {
  if(searchTimeout !== undefined)
    clearTimeout(searchTimeout);

  searchTimeout = setTimeout(doSearch, 50);
}

function searchKeyDown(e) {
  if(e.keyCode == 27) {
    // escape
    if(searchTimeout !== undefined)
      clearTimeout(searchTimeout);

    searchbox.value = '';

    clearSearch();
  } else if(e.keyCode == 10 || e.keyCode == 13) {
    // enter/return
    doSearch();
  } else if(e.keyCode == 8) {
    clearSearch();

    searchInput(e);
  }
}

document.addEventListener("DOMContentLoaded", function(event) {
  // get the chapter name from the current URL
  var chap = window.location.pathname.replace(/.*\//, '');

  var toc = document.getElementById("toc");

  // Scroll the sidebar to the appropriate chapter
  if(chap != "") {
    scrollChapter(toc, chap);
    toc.scrollTop -= 96;
  }

  // add anchor links to code blocks
  var blocks = document.getElementsByClassName("listingblock")

  for(var i=0; i < blocks.length; i++) {
    if(blocks[i].id.length > 0) {
      var a = document.createElement("A");
      a.innerHTML = '\u00B6';
      a.setAttribute('class', 'link');
      a.setAttribute('href', '#' + blocks[i].id);

      blocks[i].insertBefore(a, blocks[i].childNodes[0]);
    }
  }

  results = document.getElementById('results');
  searchbox = document.getElementById('searchbox');

  loadJS("lunr.js", function() {
    loadJS(searchindexurl, function() {
      searchengine = lunr.Index.load(searchindex);

      searchbox.value = '';
      searchbox.disabled = false;
      searchbox.addEventListener('keydown', searchKeyDown, false);
      searchbox.addEventListener('input', searchInput, false);
    }, true);
  }, true);
});
