9b67cdea994aadecdacbdac6fc9a521b94d84d71
max
  Wed Sep 30 07:08:31 2020 -0700
applying fixes to analytics click handler found by Jonathan, refs #21916, many thanks to Jonathan for finding these!

diff --git src/hg/lib/googleAnalytics.c src/hg/lib/googleAnalytics.c
index 6bf230d..4e1b436 100644
--- src/hg/lib/googleAnalytics.c
+++ src/hg/lib/googleAnalytics.c
@@ -27,44 +27,51 @@
 
 jsInlineF(
 "  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){\n"
 "  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),\n"
 "  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)\n"
 "  })(window,document,'script','//www.google-analytics.com/analytics.js','ga');\n"
 "  ga('create', '%s', 'auto');\n"
 "  ga('require', 'displayfeatures');\n"
 "  ga('set', 'transport', 'beacon');\n"
 "  ga('send', 'pageview');\n"
 "\n"
 , analyticsKey);
 // see https://support.google.com/analytics/answer/1136920?hl=en
 jsInlineF(
 "  function anchorClicked(ev) {\n"
-"  /* user clicked an anchor: send event to Google analytics and navigate to the link */\n"
-"      var isExternal = (ev.target.target==='_blank');\n"
-"      var url = ev.target.href;\n"
-"      if (url === undefined)\n" // this happens on hgTracks, for the case <a href....><p>bla</p></a>
-"           url = ev.target.closest('a');\n"
+"  /* user clicked an anchor: if external link, send event to Google analytics and navigate to the link */\n"
+"      var isExternal = (ev.currentTarget.target.toLowerCase()==='_blank');\n"
+"      var url = ev.currentTarget.href;\n"
+"      var hostname = null;\n"
+"      if (typeof URL===undefined) {\n"
+"          hostname = url.split('//')[1].split('/')[0];\n" // for MSIE
+"      } else {\n"
+"          var urlObj = new URL(url);\n"
+"          hostname = urlObj.hostname;\n"
+"          if (hostname.indexOf('.ncbi.')!==-1)\n" // for NCBI, we keep the first part of the pathname
+"              hostname = hostname+'/'+urlObj.pathname.split('/')[1];\n"
+"      }\n"
 "      if (isExternal) {\n"
-"         ga('send', 'event', 'outbound', 'click', url,\n"
+"         ga('send', 'event', 'outbound', 'click', hostname, url,\n"
 "           { 'transport': 'beacon', 'hitCallback': function(){window.open(url);} });\n"
 "      } else {\n"
 "         document.location=url;\n"
 "      }\n"
 "      return false;\n"
 "  }"
 "  $(document).ready(function() {\n"
-"      if (!window.ga || ga.loaded)\n"
+"      if (!window.ga || ga.loaded)\n" // When using an Adblocker, the ga object does not exist
 "          return;\n"
 "      var anchors = document.getElementsByTagName('a');\n"
 "      for (var i = 0; i < anchors.length; i++) { \n"
 "           var a = anchors[i];\n"
 "           if (a.attributes.href && a.attributes.href.value!=='#')\n" // do not run on javascript links
 "               a.onclick = anchorClicked;"
 "      };\n"
 "      // on hgTracks: send an event with the current db, so we can report popularity of assemblies to NIH\n"
 "      if (typeof hgTracks !== undefined)\n"
 "          ga('send', 'event', 'hgTracks', 'load', getDb());\n"
 "  });"
 );
 
 }