internal/dl: add HaTS to golang.org downloads page

Adds a script to trigger HaTS on the download page in an
effort to track developer happiness with the core Go
distribution. Uses the same bucketing and rate limiting
logic as go.dev and pkg.go.dev.

Change-Id: I73cdb4577eaf71a77f09b94965e12871296a6699
Reviewed-on: https://go-review.googlesource.com/c/website/+/286293
Trust: Jamal Carvalho <jamal@golang.org>
Run-TryBot: Jamal Carvalho <jamal@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Julie Qiu <julie@golang.org>
diff --git a/internal/dl/tmpl.go b/internal/dl/tmpl.go
index 3a77b6a..6329eae 100644
--- a/internal/dl/tmpl.go
+++ b/internal/dl/tmpl.go
@@ -242,6 +242,66 @@
   });
 });
 </script>
+<script>
+(function () {
+  var cookieName = 'HaTS_BKT_DIST';
+  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() < 0.03);
+    document.cookie =
+      cookieName + '=' + inBucket + '; path=/; max-age=2592000;';
+  }
+
+  if (inBucket === 'true') {
+    var shouldPrompt = Math.random() < 0.1;
+    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: 'dz6fkRxyz0njVvnD1rP0QxCXzhSX',
+          callback: function (requestSurveyCallbackParam) {
+            if (!requestSurveyCallbackParam.surveyData) {
+              return;
+            }
+            helpApi.presentSurvey({
+              surveyData: requestSurveyCallbackParam.surveyData,
+              colorScheme: 1, // light
+              customZIndex: 10000,
+            });
+          },
+        });
+      };
+    }
+  }
+})();
+</script>
 {{end}}
 
 {{define "releases"}}