af730d9e24c0642fe39657f890bc117ed015ccbf
galt
  Wed Feb 15 01:12:26 2017 -0800
CSP code cleanup. Using new var-args versions of functions jsInlineF and jsOnEventByIdF to avoid using lots of fixed-size local javascript strings.

diff --git src/hg/lib/jsHelper.c src/hg/lib/jsHelper.c
index b2e42c7..0c2e34f 100644
--- src/hg/lib/jsHelper.c
+++ src/hg/lib/jsHelper.c
@@ -94,63 +94,57 @@
     "var %s='%s';\n", jsVar, val);
 jsInline(javascript);
 }
 
 void jsMakeTrackingRadioButtonExtraHtml(char *cgiVar, char *jsVar,
                                         char *val, char *selVal, char *extraHtml)
 /* Make a radio button with extra HTML attributes that also sets tracking variable
  * in javascript. */
 {
 char id[256];
 safef(id, sizeof id, "%s_%s", cgiVar, val);
 hPrintf("<INPUT TYPE=RADIO NAME='%s' ID='%s'", cgiVar, id);
 hPrintf(" VALUE=\"%s\"", val);
 if (isNotEmpty(extraHtml))
     hPrintf(" %s", extraHtml);
-char javascript[1024];
-safef(javascript, sizeof javascript, "%s='%s';", jsVar, val);
-jsOnEventById("click", id, javascript);
+jsOnEventByIdF("click", id, "%s='%s';", jsVar, val);
 if (sameString(val, selVal))
     hPrintf(" CHECKED");
 hPrintf(">");
 }
 
 void jsMakeTrackingRadioButton(char *cgiVar, char *jsVar,
 	char *val, char *selVal)
 /* Make a radio button that also sets tracking variable
  * in javascript. */
 {
 jsMakeTrackingRadioButtonExtraHtml(cgiVar, jsVar, val, selVal, NULL);
 }
 
 void jsMakeTrackingCheckBox(struct cart *cart,
 	char *cgiVar, char *jsVar, boolean usualVal)
 /* Make a check box filling in with existing value and
  * putting a javascript tracking variable on it. */
 {
 char buf[256];
 boolean oldVal = cartUsualBoolean(cart, cgiVar, usualVal);
-char javascript[1024];
-safef(javascript, sizeof javascript,
-    "var %s=%d;", jsVar, oldVal);
-jsInline(javascript);
+jsInlineF("var %s=%d;", jsVar, oldVal);
 hPrintf("<INPUT TYPE=CHECKBOX NAME='%s' ID='%s' VALUE=1", cgiVar, cgiVar);
 if (oldVal)
     hPrintf(" CHECKED");
-safef(javascript, sizeof javascript, "%s=(%s+1)%%2;", jsVar, jsVar);
-jsOnEventById("click", cgiVar, javascript);
 hPrintf(">");
+jsOnEventByIdF("click", cgiVar, "%s=(%s+1)%%2;", jsVar, jsVar);
 safef(buf, sizeof(buf), "%s%s", cgiBooleanShadowPrefix(), cgiVar);
 cgiMakeHiddenVar(buf, "0");
 }
 
 void jsTrackedVarCarryOver(struct dyString *dy, char *cgiVar, char *jsVar)
 /* Carry over tracked variable (radio button?) to hidden form. */
 {
 dyStringPrintf(dy, "document.hiddenForm.%s.value=%s; ", cgiVar, jsVar);
 }
 
 char *jsRadioUpdate(char *cgiVar, char *jsVar, char *val)
 /* Make a little javascript to check and uncheck radio buttons
  * according to new value.  To use this you must have called
  * jsInit somewhere, and also must use jsMakeTrackingRadioButton
  * to make the buttons. */
@@ -416,39 +410,37 @@
 char collapseGroupVar[512];
 safef(collapseGroupVar, sizeof(collapseGroupVar), "%s.section_%s_close", track, section);
 boolean isOpen = !cartUsualBoolean(cart, collapseGroupVar, !isOpenDefault);
 
 // Both plus button and title are now in same <TD>
 // but still colspan=2 because we are lib code and callers own the table.
 puts("<TR");
 if (oldStyle)
     puts(" class='subheadingBar'");
 puts (">");
 printf("<TD colspan=2 style='text-align:left;'>\n");
 printf("<input type='hidden' name='%s' id='%s' value='%s'>\n",
        collapseGroupVar, collapseGroupVar, isOpen ? "0" : "1");
 char *buttonImage = (isOpen ? "../images/remove_sm.gif" : "../images/add_sm.gif");
 char id[256];
-char javascript[1024];
 safef(id, sizeof id, "%s_button", section);
-safef(javascript, sizeof javascript, "return setTableRowVisibility(this, '%s', '%s.section', 'section', true);", 
-       section, track);
 printf("<IMG height='18' width='18' "
        "id='%s' src='%s' alt='%s' title='%s this section' class='bigBlue'"
        " style='cursor:pointer;'>\n",
        id, buttonImage, (isOpen ? "-" : "+"), (isOpen ? "Collapse": "Expand"));
-jsOnEventById("click", id, javascript);
+jsOnEventByIdF("click", id, "return setTableRowVisibility(this, '%s', '%s.section', 'section', true);", 
+       section, track);
 if (oldStyle || fontSize == NULL)
     printf("&nbsp;%s</TD></TR>\n", sectionTitle);
 else
     printf("<B style='font-size:%s;'>&nbsp;%s</B>", fontSize, sectionTitle);
 puts("</TD></TR>\n");
 printf("<TR %s id='%s-%d'><TD colspan=2>", isOpen ? "" : "style='display: none' ", section, 1);
 }
 
 void jsBeginCollapsibleSectionOldStyle(struct cart *cart, char *track, char *section,
 				       char *sectionTitle, boolean isOpenDefault)
 /* Make the hidden input, collapse/expand button and <TR id=...> needed for utils.js's
  * setTableRowVisibility().  Caller needs to have already created a <TABLE> and <FORM>. 
  * With support for varying font size */
 {
 jsBeginCollapsibleSectionFull(cart, track, section, sectionTitle, isOpenDefault, NULL, TRUE);