// Right nav highlighting
var sidebarObj = (document.getElementsByClassName("sidebar")[0]) ? document.getElementsByClassName("sidebar")[0] : document.getElementsByClassName("sidebar-home")[0]
var sidebarBottom = sidebarObj.getBoundingClientRect().bottom;
var footerTop = document.getElementsByClassName("footer")[0].getBoundingClientRect().top;
var headerOffset = document.getElementsByClassName("container-fluid")[0].getBoundingClientRect().bottom;

// ensure that the left nav visibly displays the current topic
var current = document.getElementsByClassName("active currentPage");
var body = document.getElementsByClassName("col-content content");
if (current[0]) {
    if (sidebarObj) {
      current[0].scrollIntoView(true);
      body[0].scrollIntoView(true);
    }
    // library hack
    if (document.location.pathname.indexOf("/samples/") > -1){
      $(".currentPage").closest("ul").addClass("in");
    }
  }

function addMyClass(classToAdd) {
  var classString = this.className; // returns the string of all the classes for myDiv
   // Adds the class "main__section" to the string (notice the leading space)
  this.className = newClass; // sets className to the new string
}

function navClicked(sourceLink)
{
  var classString = document.getElementById('#item' + sourceLink).className;
  if (classString.indexOf(' in') > -1)
  {
    //collapse
    var newClass = classString.replace(' in','');
    document.getElementById('#item' + sourceLink).className = newClass;
  } else {
    //expand
    var newClass = classString.concat(' in');
    document.getElementById('#item' + sourceLink).className = newClass;
  }

}

var outputHorzTabs = new Array();
var outputLetNav = new Array();
var totalTopics = 0;
var currentSection;
var sectionToHighlight;
function findMyTopic(tree)
{
  function processBranch(branch)
  {
    for (var k=0;k<branch.length;k++)
    {
      if (branch[k].section) {
        processBranch(branch[k].section);
      } else {
        if (branch[k].path == pageURL && !branch[k].nosync)
        {
          // console.log(branch[k].path + ' was == ' + pageURL)
          thisIsIt = true;
          break;
        } else {
          // console.log(branch[k].path + ' was != ' + pageURL)
        }
      }
    }
  }
  var thisIsIt = false;
  processBranch(tree)
  return thisIsIt;
}
function walkTree(tree)
{
  for (var j=0;j<tree.length;j++)
  {
    totalTopics++;
    if (tree[j].section)
    {
      var sectionHasPath = findMyTopic(tree[j].section);
      outputLetNav.push('<li><a onclick="navClicked(' + totalTopics +')" data-target="#item' + totalTopics +'" data-toggle="collapse" data-parent="#stacked-menu"')
      if (sectionHasPath)
      {
        outputLetNav.push('aria-expanded="true"')
      } else {
        outputLetNav.push('class="collapsed" aria-expanded="false"')
      }
      outputLetNav.push('>' + tree[j].sectiontitle + '<span class="caret arrow"></span></a>');
      outputLetNav.push('<ul class="nav collapse');
      if (sectionHasPath) outputLetNav.push(' in');
      outputLetNav.push('" id="#item' + totalTopics + '" aria-expanded="');
      if (sectionHasPath)
      {
        outputLetNav.push('true');
      } else {
        outputLetNav.push('false');
      }
      outputLetNav.push('">');
      var subTree = tree[j].section;
      walkTree(subTree);
      outputLetNav.push('</ul></li>');
    } else if (tree[j].generateTOC) {
      // auto-generate a TOC from a collection
      walkTree(collectionsTOC[tree[j].generateTOC])
    } else {
      // just a regular old topic; this is a leaf, not a branch; render a link!
      outputLetNav.push('<li><a href="' + tree[j].path + '"')
      if (tree[j].path == pageURL && !tree[j].nosync)
      {
        sectionToHighlight = currentSection;
        outputLetNav.push('class="active currentPage"')
      }
      outputLetNav.push('>'+tree[j].title+'</a></li>')
    }
  }
}
function renderNav(docstoc) {
  for (i=0;i<docstoc.horizontalnav.length;i++)
  {
    if (docstoc.horizontalnav[i].node != "glossary")
    {
      currentSection = docstoc.horizontalnav[i].node;
      // build vertical nav
      var itsHere = findMyTopic(docstoc[docstoc.horizontalnav[i].node]);
      if (itsHere || docstoc.horizontalnav[i].path == pageURL)
      {
        walkTree(docstoc[docstoc.horizontalnav[i].node]);
      }
    }
    // build horizontal nav
    outputHorzTabs.push('<li id="' + docstoc.horizontalnav[i].node + '"');
    if (docstoc.horizontalnav[i].path==pageURL || docstoc.horizontalnav[i].node==sectionToHighlight)
    {
      outputHorzTabs.push(' class="active"');
    }
    outputHorzTabs.push('><a href="'+docstoc.horizontalnav[i].path+'">'+docstoc.horizontalnav[i].title+'</a></li>\n');
  }
  if (outputLetNav.length==0)
  {
    // didn't find the current topic in the standard TOC; maybe it's a collection;
    for (var key in collectionsTOC)
    {
      var itsHere = findMyTopic(collectionsTOC[key]);
      if (itsHere) {
        walkTree(collectionsTOC[key]);
        break;
      }
    }
    // either glossary was true or no left nav has been built; default to glossary
    // show pages tagged with term and highlight term in left nav if applicable
    renderTagsPage()
    for (var i=0;i<glossary.length;i++)
    {
      var highlightGloss = '';
      if (tagToLookup) highlightGloss = (glossary[i].term.toLowerCase()==tagToLookup.toLowerCase()) ? ' class="active currentPage"' : '';
      outputLetNav.push('<li><a'+highlightGloss+' href="/glossary/?term=' + glossary[i].term + '">'+glossary[i].term+'</a></li>');
    }
  }
  document.getElementById('jsTOCHorizontal').innerHTML = outputHorzTabs.join('');
  document.getElementById('jsTOCLeftNav').innerHTML = outputLetNav.join('');
}

function highlightRightNav(heading)
{
  if (document.location.pathname.indexOf("/glossary/") < 0){
    $("#my_toc a.active").removeClass("active");

    if (heading !== "title") {
      $("#my_toc a[href='#" + heading + "']").addClass('active');
    }
  }
}

var currentHeading = "";
$(window).scroll(function(){
  var headingPositions = new Array();
  $("h1, h2, h3, h4, h5, h6").each(function(){
    if (this.id == "") this.id="title";
    headingPositions[this.id]=this.getBoundingClientRect().top;
  });
  headingPositions.sort();
  // the headings have all been grabbed and sorted in order of their scroll
  // position (from the top of the page). First one is toppermost.
  for(var key in headingPositions)
  {
    if (headingPositions[key] > 0 && headingPositions[key] < 200)
    {
      if (currentHeading != key)
      {
        // a new heading has scrolled to within 200px of the top of the page.
        // highlight the right-nav entry and de-highlight the others.
        highlightRightNav(key);
        currentHeading = key;
      }
      break;
    }
  }
});


// Cookie functions
function createCookie(name,value,days) {
    var expires = "";
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days*24*60*60*1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + value + expires + "; path=/";
}

function readCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function eraseCookie(name) {
    createCookie(name,"",-1);
}

var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
var selectedNightTheme = readCookie("night");

if (selectedNightTheme == "true" || (selectedNightTheme === null && prefersDark)) {
  applyNight();
  $('#switch-style').prop('checked', true);
} else {
  applyDay();
  $('#switch-style').prop('checked', false);
}



/*
 *
 * toggle menu *********************************************************************
 *
 */

$("#menu-toggle").click(function(e) {
        e.preventDefault();
        $(".wrapper").toggleClass("right-open");
        $(".col-toc").toggleClass("col-toc-hidden");
    });
$("#menu-toggle-left").click(function(e) {
        e.preventDefault();
        $(".col-nav").toggleClass("col-toc-hidden");
    });
$(".navbar-toggle").click(function(){
  $("#sidebar-nav").each(function(){
    $(this).toggleClass("hidden-sm");
    $(this).toggleClass("hidden-xs");
  });
});

var navHeight = $('.navbar').outerHeight(true) + 80;

$(document.body).scrollspy({
	target: '#leftCol',
	offset: navHeight
});

function loadHash(hashObj)
{
  // Using jQuery's animate() method to add smooth page scroll
  // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
  $('html, body').animate({
    scrollTop: $(hashObj).offset().top-80
  }, 800);
}

$(document).ready(function(){
  // Add smooth scrolling to all links
  // $( ".toc-nav a" ).addClass( "active" );
  $(".toc-nav a").on('click', function(event) {
    // $(this).addClass('active');
    // Make sure this.hash has a value before overriding default behavior
    if (this.hash !== "") {
      // Prevent default anchor click behavior
      event.preventDefault();

      // Store hash
      var hash = this.hash;
      loadHash(hash);

      // Add hash (#) to URL when done scrolling (default click behavior)
      window.location.hash = hash;

    } // End if
  });
  if (window.location.hash) loadHash(window.location.hash);
});


$(document).ready(function(){
  $(".sidebar").Stickyfill();

  // Add smooth scrolling to all links
  $(".nav-sidebar ul li a").on('click', function(event) {

    // Make sure this.hash has a value before overriding default behavior
    if (this.hash !== "") {
      // Prevent default anchor click behavior
      event.preventDefault();

      // Store hash
      var hash = this.hash;

      // Using jQuery's animate() method to add smooth page scroll
      // The optional number (800) specifies the number of milliseconds it takes to scroll to the specified area
      $('html, body').animate({
        scrollTop: $(hash).offset().top-80
      }, 800, function(){

        // Add hash (#) to URL when done scrolling (default click behavior)
        window.location.hash = hash;
      });
    } // End if
  });
});


/*
 *
 * make dropdown show on hover *********************************************************************
 *
 */

$('ul.nav li.dropdown').hover(function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeIn(500);
}, function() {
  $(this).find('.dropdown-menu').stop(true, true).delay(200).fadeOut(500);
});

/*
 *
 * swapStyleSheet*********************************************************************
 *
 */

// function swapStyleSheet(sheet) {
//     document.getElementById('pagestyle').setAttribute('href', sheet);
// }

function applyNight() {
  $( "body" ).addClass( "night" );
}

function applyDay() {
  $( "body" ).removeClass( "night" );
}

$('#switch-style').change(function() {

    if ($(this).is(':checked')) {
        applyNight();
        createCookie("night",true,999)
    } else {
        applyDay();
        createCookie("night",false,999);
    }
});


/*
 *
 * TEMP HACK For side menu*********************************************************************
 *
 */

$('.nav-sidebar ul li a').click(function() {
    $(this).addClass('collapse').siblings().toggleClass('in');
});

if($('.nav-sidebar ul a.active').length != 0)
{
  $('.nav-sidebar ul').click(function() {
      $(this).addClass('collapse in').siblings;
  });
}


/*
 *
 * Components *********************************************************************
 *
 */

$(function () {
  $('[data-toggle="tooltip"]').tooltip()
})

// Enable glossary link popovers
$('.glossLink').popover();

// sync tabs with the same data-group
window.onload = function() {
  $('.nav-tabs > li > a').click(function(e) {
    var group = $(this).attr('data-group');
    $('.nav-tabs > li > a[data-group="'+ group +'"]').tab('show');
  })

  // isArchive is set by logic in archive.js
  if ( isArchive == false ) {
    //console.log("Showing content that should only be in the current version.");
    // Hide elements that are not appropriate for archives
    // PollDaddy
    $('#ratings-div').css("visibility","visible");
    //console.log("Ratings widget shown.");
    // Archive drop-down
    $('.ctrl-right .btn-group').css("visibility","visible");
    //console.log("Archive widget shown.");
    // Swarch
    $('.search-form').css("visibility","visible");
    //console.log("Search widget shown.");
    // Page edit link
    $('.feedback-links li').first().css("visibility","visible");
    //console.log("Page edit link shown.");
  } else {
    //console.log("Keeping non-applicable elements hidden.");
  }
};