/* http://gregfranko.com/blog/jquery-best-practices/ */
(function($) {
 $(function() {

   $('nav.navbar').headroom();

   Toc.init({
     $nav: $("#toc"),
     $scope: $("main h2, main h3, main h4, main h5, main h6")
   });

   if ($('#toc').length) {
     $('body').scrollspy({
       target: '#toc',
       offset: $("nav.navbar").outerHeight() + 1
     });
   }

   // Activate popovers
   $('[data-bs-toggle="popover"]').popover({
     container: 'body',
     html: true,
     trigger: 'focus',
     placement: "top",
     sanitize: false,
   });

   $('[data-bs-toggle="tooltip"]').tooltip();

 /* Clipboard --------------------------*/

 function changeTooltipMessage(element, msg) {
   var tooltipOriginalTitle=element.getAttribute('data-bs-original-title');
   element.setAttribute('data-bs-original-title', msg);
   $(element).tooltip('show');
   element.setAttribute('data-bs-original-title', tooltipOriginalTitle);
 }

 if(ClipboardJS.isSupported()) {
   $(document).ready(function() {
     var copyButton = "<button type='button' class='btn btn-primary btn-copy-ex' title='Copy to clipboard' aria-label='Copy to clipboard' data-toggle='tooltip' data-placement='left' data-trigger='hover' data-clipboard-copy><i class='fa fa-copy'></i></button>";

     $("div.sourceCode").addClass("hasCopyButton");

     // Insert copy buttons:
     $(copyButton).prependTo(".hasCopyButton");

     // Initialize tooltips:
     $('.btn-copy-ex').tooltip({container: 'body'});

     // Initialize clipboard:
     var clipboard = new ClipboardJS('[data-clipboard-copy]', {
       text: function(trigger) {
         return trigger.parentNode.textContent.replace(/\n#>[^\n]*/g, "");
       }
     });

     clipboard.on('success', function(e) {
       changeTooltipMessage(e.trigger, 'Copied!');
       e.clearSelection();
     });

     clipboard.on('error', function(e) {
       changeTooltipMessage(e.trigger,'Press Ctrl+C or Command+C to copy');
     });

   });
 }

   /* Search marking --------------------------*/
   var url = new URL(window.location.href);
   var toMark = url.searchParams.get("q");
   var mark = new Mark("main#main");
   if (toMark) {
     mark.mark(toMark, {
       accuracy: {
         value: "complementary",
         limiters: [",", ".", ":", "/"],
       }
     });
   }

 /* Search --------------------------*/
 /* Adapted from https://github.com/rstudio/bookdown/blob/2d692ba4b61f1e466c92e78fd712b0ab08c11d31/inst/resources/bs4_book/bs4_book.js#L25 */
   // Initialise search index on focus
 var fuse;
 $("#search-input").focus(async function(e) {
   if (fuse) {
     return;
   }

   $(e.target).addClass("loading");
   var response = await fetch($("#search-input").data("search-index"));
   var data = await response.json();

   var options = {
     keys: ["what", "text", "code"],
     ignoreLocation: true,
     threshold: 0.1,
     includeMatches: true,
     includeScore: true,
   };
   fuse = new Fuse(data, options);

   $(e.target).removeClass("loading");
 });

 // Use algolia autocomplete
 var options = {
   autoselect: true,
   debug: true,
   hint: false,
   minLength: 2,
 };
 var q;
async function searchFuse(query, callback) {
 await fuse;

 var items;
 if (!fuse) {
   items = [];
 } else {
   q = query;
   var results = fuse.search(query, { limit: 20 });
   items = results
     .filter((x) => x.score <= 0.75)
     .map((x) => x.item);
   if (items.length === 0) {
     items = [{dir:"Sorry 😿",previous_headings:"",title:"No results found.",what:"No results found.",path:window.location.href}];
   }
 }
 callback(items);
}
 $("#search-input").autocomplete(options, [
   {
     name: "content",
     source: searchFuse,
     templates: {
       suggestion: (s) => {
         if (s.title == s.what) {
           return `${s.dir} >  <div class="search-details"> ${s.title}</div>`;
         } else if (s.previous_headings == "") {
           return `${s.dir} >  <div class="search-details"> ${s.title}</div> > ${s.what}`;
         } else {
           return `${s.dir} >  <div class="search-details"> ${s.title}</div> > ${s.previous_headings} > ${s.what}`;
         }
       },
     },
   },
 ]).on('autocomplete:selected', function(event, s) {
   window.location.href = s.path + "?q=" + q + "#" + s.id;
 });
 });
})(window.jQuery || window.$)