<script type="text/javascript" nonce="[nonce]">
runOnLoad(function() {

  [# Pass the list of column names from HTML to JS ]
  window._allColumnNames = [
    [for column_values]'[column_values.column_name]'[if-index column_values last][else], [end][end]
    ];

  [# Update the issue link hrefs on-load and whenever the column-spec changes.]
  _ctxCan = [can];
  _ctxQuery = "[format "js"][query][end]";
  _ctxSortspec = "[format "js"][sortspec][end]";
  _ctxGroupBy = "[format "js"][groupby][end]";
  _ctxDefaultColspec = "[format "js"][default_colspec][end]";
  _ctxStart = [start];
  _ctxNum = [num];
  _ctxResultsPerPage = [default_results_per_page];
  _ctxHotlistID = "[hotlist_id]";
  _ctxArgs = _formatContextQueryArgs();

  function _goIssue(issueIndex, newWindow) {
    var url = _makeIssueLink(issueRefs[[]issueIndex]);
    _go(url, newWindow);
  }
  // Added to enable calling from TKR_openArtifactAtCursor
  window._goIssue = _goIssue;

  window.issueRefs = [[]
   [for table_data]
     {project_name: "[format "js"][table_data.project_name][end]",
      id: [table_data.local_id]}[if-index table_data last][else],[end][end]
   ];

  function _handleResultsClick(event) {
    var target = event.target;
    if (event.button >= 3)
      return;
    if (target.classList.contains("label"))
      return;
    if (target.classList.contains("rowwidgets") || target.parentNode.classList.contains("rowwidgets"))
      return;
    while (target && target.tagName != "TR") target = target.parentNode;
    if ('[is_hotlist]') {
       if (!target.attributes[[]"issue-context-url"]) return;
       _go(target.attributes[[]"issue-context-url"].value, (event.metaKey || event.ctrlKey || event.button == 1));
       }
    else {
       if (!target.attributes[[]"data-idx"]) return;
       _goIssue(target.attributes[[]"data-idx"].value,
       (event.metaKey || event.ctrlKey || event.button == 1));
         }
  };
  [if-any table_data]
    _addClickListener($("resultstable"), _handleResultsClick);
  [end]

  var issueCheckboxes = document.getElementsByClassName("checkRangeSelect");
  for (var i = 0; i < issueCheckboxes.length; ++i) {
    var el = issueCheckboxes[[]i];
    el.addEventListener("click", function (event) {
        _checkRangeSelect(event, event.target);
        _highlightRow(event.target);
    });
  }

  function _handleHeaderClick(event) {
    var target = event.target;
    while (target && target.tagName != "TH") target = target.parentNode;
    var colIndex = target.getAttribute("data-col-index");
    if (colIndex) {
      _showBelow("pop_" + colIndex, target);
    }
    event.preventDefault();
  }
  var resultsTableHead = $("resultstablehead");
  if (resultsTableHead) {
    resultsTableHead.addEventListener("click", _handleHeaderClick);
  }

  if (typeof(ClientLogger) == "function") {
    let cl = new ClientLogger("issues");
    if (cl.started("issue-search")) {
      cl.logPause("issue-search", "computer-time");
      cl.logResume("issue-search", "user-time");

      // Now we want to listen for clicks on any issue search result.
      let logResultClick = function() {
        cl.logPause("issue-search", "user-time");
        cl.logResume("issue-search", "computer-time");
      }

      let links = document.querySelectorAll("#resultstable tbody .id a");
      for (let i = 0; i < links.length; i++) {
        links[[]i].addEventListener("click", logResultClick);
      }
    }
  }
});
</script>

<script type="text/javascript" defer src="/static/third_party/js/keys.js?version=[app_version]" nonce="[nonce]"></script>
<script type="text/javascript" defer src="/static/third_party/js/skipper.js?version=[app_version]" nonce="[nonce]"></script>
<script type="text/javascript" nonce="[nonce]">
runOnLoad(function() {
  _setupKibblesOnListPage(
    [is arg0 "issuelist"]'[project_home_url]/issues/list'[else]'[currentPageURLEncoded]'[end],
    '[project_home_url]/issues/entry',
    '[projectname]', [is arg0 "issuelist"]1[else]5[end], 0);
});
</script>
