text: class DownloadsController {
    constructor() {
      // Parts of tabbed section.
      this.tablist = document.querySelector('.js-tabSection');
      this.tabs = this.tablist.querySelectorAll('[role="tab"]');
      this.panels = document.querySelectorAll('[role="tabpanel"]');
  
      // OS for which to display download and install steps.
      this.osName = 'Unknown OS';
  
      // URL to JSON containing list of installer downloads.
      const fileListUrl = 'https://golang.org/dl/?mode=json';
      this.activeTabIndex = 0;
  
      // Get the install file list, then get names and sizes
      // for each OS supported on the install page.
      fetch(fileListUrl)
        .then((response) => response.json())
        .then((data) => {
          const files = data[0]['files'];
          for (var i = 0; i < files.length; i++) {
            let file = files[i].filename;
            let fileSize = files[i].size;
            if (file.match('.linux-amd64.tar.gz$')) {
              this.linuxFileName = file;
              this.linuxFileSize = Math.round(fileSize / Math.pow(1024, 2));
            }
            if (file.match('.darwin-amd64(-osx10.8)?.pkg$')) {
              this.macFileName = file;
              this.macFileSize = Math.round(fileSize / Math.pow(1024, 2));
            }
            if (file.match('.windows-amd64.msi$')) {
              this.windowsFileName = file;
              this.windowsFileSize = Math.round(fileSize / Math.pow(1024, 2));
            }
          }
          this.detectOS();
          const osTab = document.getElementById(this.osName);
          if (osTab !== null) {
            osTab.click();
          }
          this.setDownloadForOS(this.osName);
        })
        .catch(console.error);
        this.setEventListeners();
    }
  
    setEventListeners() {
      this.tabs.forEach((tabEl) => {
        tabEl.addEventListener('click', e => this.handleTabClick((e)));
      });
    }
  
    // Set the download button UI for a specific OS.
    setDownloadForOS(osName) {
      const baseURL = 'https://golang.org/dl/';
      let download;
  
      switch(osName){
        case 'linux':
          document.querySelector('.js-downloadButton').textContent =
            'Download Go for Linux';
          document.querySelector('.js-downloadDescription').textContent =
            this.linuxFileName + ' (' + this.linuxFileSize + ' MB)';
          document.querySelector('.js-download').href = baseURL + this.linuxFileName;
          break;
        case 'mac':
          document.querySelector('.js-downloadButton').textContent =
            'Download Go for Mac';
          document.querySelector('.js-downloadDescription').textContent =
            this.macFileName + ' (' + this.macFileSize + ' MB)';
          document.querySelector('.js-download').href = baseURL + this.macFileName;
          break;
        case 'windows':
          document.querySelector('.js-downloadButton').textContent =
            'Download Go for Windows';
          document.querySelector('.js-downloadDescription').textContent =
            this.windowsFileName + ' (' + this.windowsFileSize + ' MB)';
          document.querySelector('.js-download').href = baseURL + this.windowsFileName;
          break;
        default:
          document.querySelector('.js-downloadButton').textContent = 'Download Go';
          document.querySelector('.js-downloadDescription').textContent =
            'Visit the downloads page.';
          document.querySelector('.js-download').href = baseURL;
          break;
      }
    }
  
    // Updates install tab with dynamic data.
    setInstallTabData(osName) {
      const fnId = `#${osName}-filename`;
      const el = document.querySelector(fnId);
      if (!el) {
        return;
      }
      switch(osName) {
        case 'linux':
          // Update filename for linux installation step
          if (this.linuxFileName) {
            el.textContent = this.linuxFileName;
          }
          break;
      }
    }
  
    // Detect the users OS for installation default.
    detectOS() {
      if (navigator.userAgent.indexOf('Linux') !== -1) {
        this.osName = 'linux';
      } else if (navigator.userAgent.indexOf('Mac') !== -1) {
        this.osName = 'mac';
      } else if (navigator.userAgent.indexOf('X11') !== -1) {
        this.osName = 'unix';
      } else if (navigator.userAgent.indexOf('Win') !== -1) {
        this.osName = 'windows';
      }
    }
  
    // Activates the tab at the given index.
    activateTab(index) {
      this.tabs[this.activeTabIndex].setAttribute('aria-selected', 'false');
      this.tabs[this.activeTabIndex].setAttribute('tabindex', '-1');
      this.panels[this.activeTabIndex].setAttribute('hidden', '');
      this.tabs[index].setAttribute('aria-selected', 'true');
      this.tabs[index].setAttribute('tabindex', '0');
      this.panels[index].removeAttribute('hidden');
      this.tabs[index].focus();
      this.activeTabIndex = index;
    }
  
    // Handles clicks on tabs.
    handleTabClick(e) {
      const el = (e.target);
      this.activateTab(Array.prototype.indexOf.call(this.tabs, el));
      this.setDownloadForOS(el.id);
      this.setInstallTabData(el.id);
    }
  
  }
  
  // Instantiate controller for page event handling.
  new DownloadsController();
  