/**
Generates 'Jump to' links.

Copyright: 1999-2016 by Digital Mars

License:   http://boost.org/LICENSE_1_0.txt, Boost License 1.0

Authors:   Andrei Alexandrescu, Nick Treleaven
*/

function lastName(a) {
    var pos = a.lastIndexOf('.');
    return a.slice(pos + 1);
}

// adds a anchor link to every documented declaration
function addAnchors()
{
    var items = document.getElementsByClassName('d_decl');
    if(!items) return;
    for (var i = 0; i < items.length; i++)
    {
        // we link to the first children
        var da = items[i].querySelector('span.def-anchor');
        if(!da) continue;
        var permLink = document.createElement("a");
        permLink.setAttribute('href', '#' + da.id);
        permLink.className = "fa fa-anchor decl_anchor";
        items[i].insertBefore(permLink, items[i].firstChild);
    }
}

function listanchors()
{
    var hideTop = (typeof inhibitQuickIndex !== 'undefined');
    var a = document.getElementById("quickindex");
    if (!a) return;

    // build hash of parent anchor names -> array of child anchor names
    var parentNames = [];
    var lastAnchor = '';
    var items = document.getElementsByClassName('quickindex');
    for (var i = 0; i < items.length; i++)
    {
        var text = items[i].id;
        // ignore top-level quickindex
        var pos = text.indexOf('.');
        if (pos < 0) continue;
        // skip 'quickindex'
        text = text.slice(pos);
        // ignore any ditto overloads (which have the same anchor name)
        if (text == lastAnchor) continue;
        lastAnchor = text;
        
        var pos = text.lastIndexOf('.');
        if (hideTop && pos == 0) continue;
        var parent = (pos == 0) ? '' : text.slice(0, pos);
        
        if (!parentNames[parent])
            parentNames[parent] = [text];
        else
            parentNames[parent].push(text);
    }
    // populate quickindex elements
    for (var key in parentNames)
    {
        var arr = parentNames[key];
        // we won't display the qualifying names to save space, so sort by last name
        arr.sort(function(a,b){
            var aa = lastName(a).toLowerCase();
            var bb = lastName(b).toLowerCase();
            return aa == bb ? 0 : (aa < bb ? -1 : 1);
        });
        var newText = "";
        for (var i = 0; i < arr.length; i++) {
            var a = arr[i];
            var text = lastName(a);
            if (i != 0) newText += " &middot;"; 
            newText += ' <a href="#' + a +
                '">' + text + '</a>';
        }
        if (newText != "")
        {
            newText = '<p><b>Jump to:</b><span class="jumpto notranslate donthyphenate">' +
                newText + '</span></p>';
        }
        var id = 'quickindex';
        id += key;
        var e = document.getElementById(id);
        e.innerHTML = newText;

    }
    function addVersionSelector() {
      // Latest version offered by the archive builds
      // This needs to be manually updated after new versions have been archived
      var currentArchivedVersion = 76;
      // build URLs for dlang.org: DDoc + Dox
      var ddocModuleURL = document.body.id.replace(/[.]/g, "_") + ".html";
      var ddoxModuleURL = document.body.id.replace(/[.]/g, "/") + ".html";

      // build list of versions available in the docarchives
      var archivedVersions = [];
      while (currentArchivedVersion >= 66) {
        archivedVersions.push("2.0" + currentArchivedVersion--);
      }
      archivedVersions = archivedVersions.map(function(e) {
          return {
            name: e,
            url: "https://docarchives.dlang.io/v" + e + ".0/phobos/" + ddocModuleURL,
            selected: false,
          };
      });

      var rootURL = location.href.split(/\/(phobos|library)(-prerelease)?/)[0]
      var onlineVersions = [{
        name: "master",
        url: rootURL + "/phobos-prerelease/" + ddocModuleURL,
      },{
        name: "master (ddox)",
        url: rootURL + "/library-prerelease/" + ddoxModuleURL,
      },{
        name: "stable",
        url: rootURL + "/phobos/" + ddocModuleURL,
      },{
        name: "stable (ddox)",
        url: rootURL + "/library/" + ddoxModuleURL,
      }];

      // set the current URL as selected
      var currentURL = location.href.split(/[#?]/)[0];
      onlineVersions.forEach(function(v, i) {
        onlineVersions[i].selected = v.url === currentURL;
      });
      // Don't show the option chooser if the page hasn't been recognized
      // For example, Ddox symbol pages are currently not supported
      if (onlineVersions.filter(function(v){return v.selected}).length === 0)
        return;

      // build select box of all versions and append to current DOM
      var versions = onlineVersions.concat(archivedVersions);
      var options = versions.map(function(e, i){
        return "<option value='" + i + "'" + (e.selected ? "selected" : "") + ">" + e.name + "</option>";
      });
      $("h1").after("<div class='version-changer-container fa-select'><select id='version-changer'>" + options.join("") + "</select></div>");
      // attach event listener to select box -> change URL
      $("#version-changer").change(function(){
        var selected = parseInt($(this).find("option:selected").val());
        var option = versions[selected];
        if (!option.selected) {
          window.location.href = option.url;
        }
      });
    }
    addAnchors();
    addVersionSelector();
}
