48cd1865d252867ebbd3852d76bed271d0028d29
max
  Tue Jun 30 05:33:14 2026 -0700
hgBlat: move showAliPlaces autoBigPsl inline JS into src/hg/js/hgBlat.js

The "Create a stable custom track" (autoBigPsl) results page emitted ~140 lines
of JavaScript as C string literals via jsInlineF/jsInline. Move that code into a
real, jshint-clean hgBlat.js and have hgBlat.c emit only a small hgBlatData config
object (url, trackName, trackDescription, and the custom-track cart var names) plus
a jsIncludeFile("hgBlat.js"). Behavior is unchanged. The track name/description are
still javaScriptLiteralEncode'd before interpolation.

diff --git src/hg/js/hgBlat.js src/hg/js/hgBlat.js
new file mode 100644
index 00000000000..f1b919fc034
--- /dev/null
+++ src/hg/js/hgBlat.js
@@ -0,0 +1,74 @@
+// hgBlat.js - client-side support for the hgBlat "Create a stable custom track"
+// (autoBigPsl) results page.  hgBlat.c emits an inline hgBlatData object with this
+// request's parameters, then includes this file.
+
+/* global $, hgBlatData, luckyLocation, catchErrorOrDispatch, errorHandler */
+
+var ctBlat = '';  // name of the custom track created by buildBigPslCt; saved for later rename/delete
+
+function buildBigPslCtSuccess(content) {
+    // Finish the successful creation of the blat custom track (bigPsl).  Called by ajax return.
+    // Saves the ct name so it can be used later for rename or delete.
+    var matchWord = '&table=';
+    var ctBlatPos = content.indexOf(matchWord) + matchWord.length;
+    if (ctBlatPos >= 0) {
+        var ctBlatPosEnd = content.indexOf('"', ctBlatPos);
+        ctBlat = content.slice(ctBlatPos, ctBlatPosEnd);
+        if (luckyLocation === '') {
+            $('input[name="' + hgBlatData.ctTableVar + '"]')[0].value = ctBlat;
+            $('input[name="' + hgBlatData.ctTableVar + '"]')[1].value = ctBlat;
+        }
+    }
+}
+
+function buildBigPslCt(url, trackName, trackDescription) {
+    // Call hgc to buildBigPsl from the blat result.
+    var cgiVars = 'trackName=' + encodeURIComponent(trackName) +
+                  '&trackDescription=' + encodeURIComponent(trackDescription);
+    if (ctBlat !== '') {
+        cgiVars += '&' + hgBlatData.ctRemoveVar + '=' + encodeURIComponent('Remove Custom Track');
+        cgiVars += '&' + hgBlatData.ctTableVar + '=' + encodeURIComponent(ctBlat);
+    }
+    $.ajax({
+        type: 'GET',
+        url: url,
+        data: cgiVars,
+        dataType: 'html',
+        trueSuccess: buildBigPslCtSuccess,
+        success: catchErrorOrDispatch,
+        error: errorHandler,
+        cache: false,
+        async: false
+    });
+}
+
+$(document).ready(function() {
+    buildBigPslCt(hgBlatData.url, hgBlatData.trackName, hgBlatData.trackDescription);
+    if (luckyLocation !== '') {
+        location.replace(luckyLocation);
+        return;
+    }
+
+    // Not feeling lucky: reveal the rename/delete custom-track controls and wire their buttons.
+    $('#renameFormItem')[0].style.display = 'block';
+    $('#deleteCtForm')[0].style.display = 'block';
+
+    $('#showRenameForm').click(function() {
+        $('#renameForm')[0].style.display = 'block';
+        $('#renameFormItem')[0].style.display = 'none';
+        $('#showRenameForm')[0].style.display = 'none';
+        $('input[name="trackName"]')[0].value = hgBlatData.trackName;
+        $('input[name="trackDescription"]')[0].value = hgBlatData.trackDescription;
+        return false;
+    });
+
+    $('#submitTrackNameDescr').click(function() {
+        $('#renameForm')[0].style.display = 'none';
+        $('#renameFormItem')[0].style.display = 'block';
+        $('#showRenameForm')[0].style.display = 'block';
+        hgBlatData.trackName = $('input[name="trackName"]')[0].value;
+        hgBlatData.trackDescription = $('input[name="trackDescription"]')[0].value;
+        buildBigPslCt(hgBlatData.url, hgBlatData.trackName, hgBlatData.trackDescription);
+        return false;
+    });
+});