function requestHaTs(cookieName, triggerId, bucketSample, promptSample) {
  var inBucket;

  var cookies = decodeURIComponent(document.cookie).split(';');

  for (let i = 0; i < cookies.length; i++) {
    var c = cookies[i];

    while (c.charAt(0) == ' ') c = c.substring(1);

    if (c.indexOf(cookieName + '=') == 0)
      inBucket = c.substring((cookieName + '=').length, c.length);
  }

  if (typeof inBucket === 'undefined') {
    inBucket = String(Math.random() < bucketSample);
    document.cookie =
      cookieName + '=' + inBucket + '; path=/; max-age=2592000;';
  }

  if (inBucket === 'true') {
    var shouldPrompt = Math.random() < promptSample;
    if (shouldPrompt) {
      document.cookie = cookieName + '=false ; path=/; max-age=2592000;';

      var tag = document.createElement('script');
      tag.src =
        'https://www.gstatic.com/feedback/js/help/prod/service/lazy.min.js';
      tag.type = 'text/javascript';
      document.head.appendChild(tag);

      tag.onload = function () {
        var helpApi = window.help.service.Lazy.create(0, {
          apiKey: 'AIzaSyDfBPfajByU2G6RAjUf5sjkMSSLNTj7MMc',
          locale: 'en-US',
        });

        helpApi.requestSurvey({
          triggerId: triggerId,
          callback: function (requestSurveyCallbackParam) {
            if (!requestSurveyCallbackParam.surveyData) {
              return;
            }
            helpApi.presentSurvey({
              surveyData: requestSurveyCallbackParam.surveyData,
              colorScheme: 1, // light
              customZIndex: 10000,
            });
          },
        });
      };
    }
  }
}

(function () {
  // HaTS - go.dev
  requestHaTs('HaTS_BKT', 'RLVVv5Lf10njVvnD1rP0QUpmtosS', 0.1, 0.5);

  // All download links on the go.dev homepage may trigger a survey.
  [
    document.querySelector('.js-downloadBtn'),
    document.querySelector('.js-downloadWin'),
    document.querySelector('.js-downloadMac'),
    document.querySelector('.js-downloadLinux'),
  ].forEach(function (el) {
    if (el) {
      el.addEventListener('click', () => {
        // HaTS - Core Go distribution
        requestHaTs('HaTS_BKT_DIST', 'dz6fkRxyz0njVvnD1rP0QxCXzhSX', 0.2, 1);
      });
    }
  });
})();
