138466997afeed868f4265c70bd950ef75a643c6
hiram
  Wed Aug 21 12:04:23 2024 -0700
advanced search hoptions now hidden by default and allow debug flag to turn on API url reference refs #32596

diff --git src/hg/js/assemblySearch.js src/hg/js/assemblySearch.js
index dfd6944..b80ee0e 100644
--- src/hg/js/assemblySearch.js
+++ src/hg/js/assemblySearch.js
@@ -1,44 +1,64 @@
 // global variables:
 
+var debug = false;
 var measureTiming = false;
 var urlParams;
 var searchFor = "";
 var maxItemsOutput = 500;
 var asmIdText = null;
 var betterCommonName = null;
 var comment = null;
 var requestSubmitButton = null;
 var completedAsmId = new Map();	// keep track of requests completed
 				// so they won't be repeated
 
 // This function is called on DOMContentLoaded as the initialization
 //  procedure for first time page draw
 document.addEventListener('DOMContentLoaded', function() {
     // allow semi colon separators as well as ampersand
     var queryString = window.location.search.replaceAll(";", "&");
     urlParams = new URLSearchParams(queryString);
     if (urlParams.has('measureTiming')) { // accepts no value or other string
        var measureValue = urlParams.get('measureTiming');
        if ("0" === measureValue | "off" === measureValue) {
          measureTiming = false;
        } else {			// any other string turns it on
          measureTiming = true;
        }
     }
+    if (urlParams.has('debug')) { // accepts no value or other string
+       var debugValue = urlParams.get('debug');
+       if ("0" === debugValue | "off" === debugValue) {
+         debug = false;
+       } else {			// any other string turns it on
+         debug = true;
+       }
+    }
+
+    // add extra element to the help text bullet list for API example
+    if (debug) {
+      var searchTipList = document.getElementById("searchTipList");
+      // Create a new list item
+      var li = document.createElement("li");
+      li.innerHTML = "example API call: <span id=\"recentAjax\">n/a</span>";
+      // Append the new list item to the ordered list
+      searchTipList.appendChild(li);
+    }
 
     var searchForm = document.getElementById('searchForm');
+    var advancedSearchButton = document.getElementById('advancedSearchButton');
     var searchInput = document.getElementById('searchBox');
     var clearButton = document.getElementById('clearSearch');
     asmIdText = document.getElementById("formAsmId");
     betterCommonName = document.getElementById("betterCommonName");
     comment = document.getElementById("comment");
     requestSubmitButton = document.getElementById("submitButton");
 
     document.getElementById("modalFeedback").addEventListener("submit", checkForm, false);
     modalInit();
 
     clearButton.addEventListener('click', function() {
         searchInput.value = ''; // Clear the search input field
     });
 
     searchForm.addEventListener('submit', function(event) {
@@ -46,30 +66,43 @@
 
         var searchTerm = document.getElementById('searchBox').value;
         var resultCountLimit = document.getElementById('maxItemsOutput');
         var browserExist = "mustExist";
         var mustExist = document.getElementById('mustExist').checked;
         var notExist = document.getElementById('notExist').checked;
         if (mustExist && notExist) {
            browserExist = "mayExist";
         } else if (notExist) {
            browserExist = "notExist";
         }
         var wordMatch = document.querySelector('input[name="wordMatch"]:checked').value;
         makeRequest(searchTerm, browserExist, resultCountLimit.value, wordMatch);
     });
 
+    advancedSearchButton.addEventListener('click', function() {
+       var advancedSearchOptions = document.getElementById("advancedSearchOptions");
+       // I don't know why it is false the first time ?
+       if (! advancedSearchOptions.style.display ||
+             advancedSearchOptions.style.display === "none") {
+          advancedSearchOptions.style.display = "flex";
+          this.textContent = "hide advanced search options"; // Change button text
+       } else {
+          advancedSearchOptions.style.display = "none";
+          this.textContent = "show advanced search options"; // Change button text
+       }
+    });
+
     var tableHeader = document.getElementById('tableHeader');
     headerRefresh(tableHeader);
 
     if (urlParams.has('maxItemsOutput')) {
        maxItemsOutput = parseInt(urlParams.get('maxItemsOutput'), 10);
        if (maxItemsOutput < 1) {
          maxItemsOutput = 1;
        } else if (maxItemsOutput > 1000) {
          maxItemsOutput = 1000;
        }
        document.getElementById('maxItemsOutput').value = maxItemsOutput;
     }
     if (urlParams.has('searchFor')) {
        searchFor = urlParams.get('searchFor');
        if (searchFor.length > 0) {
@@ -264,30 +297,42 @@
     var xmlhttp = new XMLHttpRequest();
     xmlhttp.onreadystatechange = function() {
          if (4 === this.readyState && 200 === this.status) {
             requestSubmitButton.value = "request completed";
          } else {
             if (4 === this.readyState && 404 === this.status) {
                failedRequest(url);
             }
          }
        };
     xmlhttp.open("GET", url, true);
     xmlhttp.send();
 
 }  //      sendRequest: function(name, email. asmId)
 
+// do not allow both checkboxes to go off
+function atLeastOneCheckBoxOn(e) {
+  var mustExist = document.getElementById('mustExist').checked;
+  var notExist = document.getElementById('notExist').checked;
+  if (! mustExist && ! notExist ) {  // turn on the other one when both off
+     if (e.name === "mustExist") {
+       document.getElementById('notExist').checked = true;
+     } else {
+       document.getElementById('mustExist').checked = true;
+     }
+  }
+}
 
 function checkForm(e) {
   if (requestSubmitButton.value === "request completed") {
      if (e.preventDefault) {
        e.preventDefault();
      } else {
        e.returnValue = false;
      }
      closeModal(e);
      return;
   }
   var form = (e.target) ? e.target : e.srcElement;
   if(form.name.value === "") {
     alert("Please enter your Name");
     form.name.focus();
@@ -406,32 +451,34 @@
         });
       queryString = queryPlus.trimStart();	// remove first space character
       }
     }
 
     // Show the wait spinner
     document.querySelector(".submitContainer").classList.add("loading");
     document.getElementById("loadingSpinner").style.display = "block";
 
     var xhr = new XMLHttpRequest();
     var urlPrefix = "/cgi-bin/hubApi";
     var url = "/findGenome?genomeSearch=" + encodeURIComponent(queryString);
     url += ";browser=" + browserExist;
     url += ";maxItemsOutput=" + resultLimit;
 
+    if (debug) {
       var apiUrl = "<a href='" + urlPrefix + url + "' target=_blank>" + url + "</a>";
       document.getElementById("recentAjax").innerHTML = apiUrl;
+    }
 
     xhr.open('GET', urlPrefix + url, true);
 
     xhr.onload = function() {
         if (xhr.status === 200) {
             // Hide the wait spinner once the AJAX request is complete
             document.querySelector(".submitContainer").classList.remove("loading");
             document.getElementById("loadingSpinner").style.display = "none";
             enableButtons();
             var data = JSON.parse(xhr.responseText);
 	    populateTableAndInfo(data);
         } else {
             // Hide the wait spinner once the AJAX request is complete
             document.querySelector(".submitContainer").classList.remove("loading");
             document.getElementById("loadingSpinner").style.display = "none";