feb380e4c526092d9793e1d70f8a484cca2ae338
galt
  Tue Oct 20 01:18:28 2020 -0700
Fix speed of javascript in View, Facets, and Subtracks for hgTrackUi. fixes #26381

diff --git src/lib/cheapcgi.c src/lib/cheapcgi.c
index 51e1071..7d71148 100644
--- src/lib/cheapcgi.c
+++ src/lib/cheapcgi.c
@@ -1742,50 +1742,53 @@
 cgiMakeCheckBox2Bool(name,checked,TRUE,NULL,moreHtml);
 }
 
 void cgiMakeCheckBoxIdAndMore(char *name, boolean checked, char *id, char *moreHtml)
 /* Make check box with ID and extra (non-javascript) html. */
 {
 cgiMakeCheckBox2Bool(name,checked,TRUE,id,moreHtml);
 }
 
 void cgiMakeCheckBoxFourWay(char *name, boolean checked, boolean enabled, char *id,
                             char *classes, char *moreHtml)
 /* Make check box - with fourWay functionality (checked/unchecked by enabled/disabled)
  * Also makes a shadow hidden variable that supports the 2 boolean states. */
 {
 char shadName[256];
+char shadId[256];
 
 printf("<INPUT TYPE=CHECKBOX NAME='%s'", name);
 if (id)
     printf(" id='%s'", id);
 if (checked)
     printf(" CHECKED");
 if (!enabled)
     {
     if (findWordByDelimiter("disabled",' ', classes) == NULL) // fauxDisabled ?
         printf(" DISABLED");
     }
 if (classes)
     printf(" class='%s'",classes);
 if (moreHtml)
     printf(" %s",moreHtml);
 printf(">");
 
 // The hidden var needs to hold the 4way state
 safef(shadName, sizeof(shadName), "%s%s", cgiBooleanShadowPrefix(), name);
-cgiMakeHiddenVarWithExtra(shadName, ( enabled ? "0" : (checked ? "-1" : "-2")),BOOLSHAD_EXTRA);
+if (id)
+    safef(shadId, sizeof(shadId), "%s%s", cgiBooleanShadowPrefix(), id);
+cgiMakeHiddenVarWithIdExtra(shadName, id ? shadId : NULL, ( enabled ? "0" : (checked ? "-1" : "-2")),BOOLSHAD_EXTRA);
 }
 
 
 void cgiMakeHiddenBoolean(char *name, boolean on)
 /* Make hidden boolean variable. Also make a shadow hidden variable so we
  * can distinguish between variable not present and
  * variable set to false. */
 {
 char buf[256];
 cgiMakeHiddenVar(name, on ? "on" : "off");
 safef(buf, sizeof(buf), "%s%s", cgiBooleanShadowPrefix(), name);
 cgiMakeHiddenVarWithExtra(buf, "1",BOOLSHAD_EXTRA);
 }
 
 void cgiMakeTextArea(char *varName, char *initialVal, int rowCount, int columnCount)
@@ -2322,45 +2325,46 @@
     printf(" NAME='%s'", name);
 if (extra)
     printf("%s", extra);
 printf(">\n");
 for (i=0; i<count; ++i)
     {
     if (sameWord(values[i], selected))
         selString = " SELECTED";
     else
         selString = "";
     printf("<OPTION%s value='%s'>%s</OPTION>\n", selString, values[i], text[i]);
     }
 printf("</SELECT>\n");
 }
 
-void cgiMakeHiddenVarWithExtra(char *varName, char *string,char *extra)
+void cgiMakeHiddenVarWithIdExtra(char *varName, char *id, char *string,char *extra)
 /* Store string in hidden input for next time around. */
 {
-printf("<INPUT TYPE=HIDDEN NAME='%s' VALUE='%s'", varName, string);
+printf("<INPUT TYPE=HIDDEN NAME='%s'", varName);
+if (id)
+    printf(" ID='%s'", id);
 if (extra)
-    printf(" %s>\n",extra);
-else
-    puts(">");
+    printf(" %s",extra);
+printf(" VALUE='%s'>\n", string);
 }
 
 void cgiContinueHiddenVar(char *varName)
 /* Write CGI var back to hidden input for next time around. */
 {
 if (cgiVarExists(varName))
-    cgiMakeHiddenVar(varName, cgiString(varName));
+    cgiMakeHiddenVarWithIdExtra(varName, varName, cgiString(varName), NULL);
 }
 
 void cgiVarExclude(char *varName)
 /* If varName exists, remove it. */
 {
 if (cgiVarExists(varName))
     {
     struct cgiVar *cv = hashRemove(inputHash, varName);
     slRemoveEl(&inputList, cv);
     }
 }
 
 void cgiVarExcludeExcept(char **varNames)
 /* Exclude all variables except for those in NULL
  * terminated array varNames.  varNames may be NULL