fe68c1b1ff0235428aefefd9e8f68679f73f3fd6
hiram
  Sat Aug 17 07:16:35 2024 -0700
initial prototype code for assemblySearch function refs #32596

diff --git src/hg/js/assemblySearch.js src/hg/js/assemblySearch.js
new file mode 100644
index 0000000..a1fe210
--- /dev/null
+++ src/hg/js/assemblySearch.js
@@ -0,0 +1,153 @@
+document.addEventListener('DOMContentLoaded', function() {
+    var searchForm = document.getElementById('searchForm');
+    var searchInput = document.getElementById('searchBox');
+    var clearButton = document.getElementById('clearSearch');
+
+    clearButton.addEventListener('click', function() {
+        searchInput.value = ''; // Clear the search input field
+    });
+
+    searchForm.addEventListener('submit', function(event) {
+        event.preventDefault(); // Prevent form submission
+
+        var searchTerm = document.getElementById('searchBox').value;
+        var resultCountLimit = document.getElementById('limitResultCount');
+        var browserExist = document.querySelector('input[name="browserExist"]:checked').value;
+        var wordMatch = document.querySelector('input[name="wordMatch"]:checked').value;
+        makeRequest(searchTerm, browserExist, resultCountLimit.value, wordMatch);
+    });
+});
+
+// Function to generate the table and extra information
+function populateTableAndInfo(jsonData) {
+    var tableBody = document.getElementById('tableBody');
+    var metaData = document.getElementById('metaData');
+    document.getElementById('searchString').innerHTML = "";
+    document.getElementById('matchCounts').innerHTML = "0";
+    document.getElementById('availableAssemblies').innerHTML = "0";
+    document.getElementById('elapsedTime').innerHTML = "0";
+
+    // Clear existing table content
+    tableBody.innerHTML = '';
+    metaData.innerHTML = '';
+
+    // Extract the genomic entries and the extra info
+    const genomicEntries = {};
+    const extraInfo = {};
+
+    for (const key in jsonData) {
+        if (jsonData[key].scientificName) {
+            genomicEntries[key] = jsonData[key];
+        } else {
+            extraInfo[key] = jsonData[key];
+        }
+    }
+
+    var count = 0;
+    for (const id in genomicEntries) {
+        var dataRow = '<tr>';
+        dataRow += "<th>" + ++count + "</th>";
+        var urlReference = id;
+        if (genomicEntries[id].browserExists) {
+          if (id.startsWith("GC")) {
+            urlReference = "<a href='/h/" + id + "?position=lastDbPos' target=_blank>" + id + "</a>";
+          } else {
+            urlReference = "<a href='/cgi-bin/hgTracks?db=" + id + "' target=_blank>" + id + "</a>";
+          }
+        }
+        dataRow += "<th>" + urlReference + "</th>";
+        dataRow += "<td>" + genomicEntries[id].scientificName + "</td>";
+        dataRow += "<td>" + genomicEntries[id].commonName + "</td>";
+        dataRow += "<td>" + genomicEntries[id].clade + "</td>";
+        dataRow += "<td>" + genomicEntries[id].description + "</td>";
+        dataRow += '</tr>';
+        tableBody.innerHTML += dataRow;
+    }
+    var dataTable = document.getElementById('dataTable');
+    sorttable.makeSortable(dataTable);
+
+    document.getElementById('searchString').innerHTML = extraInfo['genomeSearch'];
+    document.getElementById('matchCounts').innerHTML = extraInfo['totalMatchCount'].toLocaleString();
+    document.getElementById('availableAssemblies').innerHTML = extraInfo['availableAssemblies'].toLocaleString();
+    var etMs = extraInfo['elapsedTimeMs'];
+    var elapsedTime = etMs.toLocaleString() + " milliseconds";
+    if ( etMs > 1000 ) {
+       var etSec = etMs/1000;
+       elapsedTime = etSec.toFixed(2) + " seconds";
+    }
+    document.getElementById('elapsedTime').innerHTML = elapsedTime.toLocaleString();
+}	//	function populateTableAndInfo(jsonData)
+
+function enableButtons() {
+    document.getElementById('submitButton').disabled = false;
+    document.getElementById('clearSearch').disabled = false;
+}
+
+function disableButtons() {
+    document.getElementById('submitButton').disabled = true;
+    document.getElementById('clearSearch').disabled = true;
+}
+
+function makeRequest(query, browserExist, resultLimit, wordMatch) {
+    // Disable the submit button
+    disableButtons();
+    var queryString = query;
+    // for allWords, place + sign in front of each word if not already there
+    if (wordMatch === "allWords") {
+      const words = query.split(/\s+/);
+      if (words.length > 1) {	// not needed on only one word
+        var queryPlus = "";	// compose new query string
+        words.forEach(word => {
+          if (word.startsWith("+")) {
+            queryPlus += " " + word;	// space separated each word
+          } else {
+            queryPlus += " +" + word;
+          }
+        });
+      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 url = "https://genome-test.gi.ucsc.edu/cgi-bin/hubApi/findGenome?genomeSearch=" + encodeURIComponent(queryString);
+    url += ";browser=" + browserExist;
+    url += ";maxItemsOutput=" + resultLimit;
+
+    xhr.open('GET', 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";
+            enableButtons();
+	    var tableBody = document.getElementById('tableBody');
+            var metaData = document.getElementById('metaData');
+            tableBody.innerHTML = '';
+            metaData.innerHTML = '';
+            metaData.innerHTML = "<b>no results found for query: '" + queryString + "'</b>";
+            document.getElementById('searchString').innerHTML = queryString;
+            document.getElementById('matchCounts').innerHTML = "0";
+            document.getElementById('availableAssemblies').innerHTML = "0";
+            document.getElementById('elapsedTime').innerHTML = "0";
+        }
+    };
+
+    xhr.onerror = function() {
+        alert('console.log("Request failed")');
+        console.log('Request failed');
+    };
+
+    xhr.send();
+}