var languageTabs = null;
var languageSpecificElements = null;
var availableLanguages = null;

// Helper function to iterate over an HTMLCollection or NodeList (https://stackoverflow.com/questions/3871547/js-iterating-over-result-of-getelementsbyclassname-using-array-foreach)
function forEachElement(collection, func) {
  Array.prototype.forEach.call(collection, func);
}

function matchLanguage(el, lang) {
  if (lang == "language-all" || el.classList.contains("language-all")) {
    return true;
  } else if ((lang === "language-c" || lang === "language-cpp") && el.classList.contains("language-c-cpp")) {
    return true;
  } else {
    return el.classList.contains(lang);
  }
}

function setLanguage(lang) {
  if (languageSpecificElements == null) {
    return;
  }

  window.localStorage.setItem("FMOD.Documents.selected-language", lang);

  if (availableLanguages.length > 0 && !availableLanguages.includes(lang)) {
    lang = availableLanguages[0];
  }

  forEachElement(languageTabs, function(el) {
    var ellang = el.attributes['data-language'].value;
    
    if (ellang === lang) {
      el.classList.add("selected");
    } else {
      el.classList.remove("selected");
    }
  });

  forEachElement(languageSpecificElements, function(el) {
    if (matchLanguage(el, lang)) {
      el.style.display = 'block';
    } else {
      el.style.display = 'none';
    }
  });

  window.localStorage.setItem("FMOD.Documents.selected-language", lang);
}

function init() {
  var docsBody = document.querySelector("div.manual-content.api");

  if (docsBody) {
      // API docs

      // Setup language tabs
      languageTabs = docsBody.getElementsByClassName("language-tab");

      forEachElement(languageTabs, function(el) {
        el.onclick = function() { setLanguage(this.attributes['data-language'].value); }
      });

      // Cache language specific elements on the page
      languageSpecificElements = docsBody.querySelectorAll(".language-c, .language-cpp, .language-c-cpp, .language-csharp, .language-javascript");

      // Determine languages used on the page
      availableLanguages = [];
      ["language-c", "language-cpp", "language-c-cpp", "language-csharp", "language-javascript"].forEach(function(lang) {
        if (docsBody.querySelector("." + lang) != null) {
          availableLanguages.push(lang);
        }
      });
      
      if (availableLanguages.indexOf("language-c-cpp") >=0) {
        if (availableLanguages.indexOf("language-c") < 0) availableLanguages.push("language-c"); 
        if (availableLanguages.indexOf("language-cpp") < 0) availableLanguages.push("language-cpp"); 
      }
      // Set initial language
      var lang = window.localStorage.getItem("FMOD.Documents.selected-language");

      if (lang == null) {
        lang = "language-cpp";
      }

      setLanguage(lang);
  }
}

if (typeof module !== 'undefined') {
    module.exports = { initLanguageSelector: init };
} else {
  // Call our init function when the document is loaded. (https://plainjs.com/javascript/events/running-code-when-the-document-is-ready-15/)
  if (document.readyState != 'loading') init();
  else if (document.addEventListener) document.addEventListener('DOMContentLoaded', init);
  else document.attachEvent('onreadystatechange', function() { if (document.readyState == 'complete') init(); });
}