8fdc86ea29f656cf7efee9954fdae6b573190fb3
tdreszer
  Fri May 6 17:23:22 2011 -0700
Standardized replacement for <P> with cgiDown and worked out more spacing issues in hgFileUi and hgTrackUi.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index c22e694..9584bb8 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -270,66 +270,71 @@
         metadataAsHtmlTable(db,tdb,showLongLabel,TRUE,trackHash) );
     }
 else
     printf("<DIV id='div_%s_meta' style='display:none;'></div>",tdb->track);
 return TRUE;
 }
 
 void extraUiLinks(char *db,struct trackDb *tdb, struct hash *trackHash)
 /* Show downlaods, schema and metadata links where appropriate */
 {
 boolean schemaLink = (isCustomTrack(tdb->table) == FALSE)
                   && (hTableOrSplitExists(db, tdb->table));
 boolean metadataLink = (!tdbIsComposite(tdb)
                   && metadataForTable(db, tdb, NULL) != NULL);
 boolean downloadLink = (trackDbSetting(tdb, "wgEncode") != NULL && !tdbIsSuperTrack(tdb));
-boolean moreThanOne = (schemaLink && metadataLink)
-                   || (schemaLink && downloadLink)
-                   || (downloadLink && metadataLink);
+int links = 0;
+if (schemaLink)
+    links++;
+if (metadataLink)
+    links++;
+if (downloadLink)
+    links++;
 
-printf("\n<div style='height:.8em;'></div>");
-if(moreThanOne)
+if(links > 0)
+    cgiDown(0.7);
+if(links > 1)
     printf("<table><tr><td nowrap>View table: ");
 
 if(schemaLink)
     {
-    makeSchemaLink(db,tdb,(moreThanOne ? "schema":"View table schema"));
+    makeSchemaLink(db,tdb,(links > 1 ? "schema":"View table schema"));
     if(downloadLink || metadataLink)
         printf(", ");
     }
 if(downloadLink)
     {
     // special case exception (hg18:NHGRI BiPs are in 7 different dbs but only hg18 has downloads):
     char *targetDb = trackDbSetting(tdb, "compareGenomeLinks");
     if (targetDb != NULL)
         {
         targetDb = cloneFirstWordByDelimiter(targetDb,'=');
         if (!startsWith("hg",targetDb))
             freez(&targetDb);
         }
     if (targetDb == NULL)
         targetDb = cloneString(db);
 
-    makeNamedDownloadsLink(targetDb, tdb, (moreThanOne ? "downloads":"Downloads"), trackHash);
+    makeNamedDownloadsLink(targetDb, tdb, (links > 1 ? "downloads":"Downloads"), trackHash);
     freez(&targetDb);
     if(metadataLink)
         printf(",");
     }
 if (metadataLink)
     compositeMetadataToggle(db,tdb,"metadata", TRUE, TRUE, trackHash);
 
-if(moreThanOne)
+if(links > 1)
     printf("</td></tr></table>");
 }
 
 
 char *hUserCookie()
 /* Return our cookie name. */
 {
 return cfgOptionDefault("central.cookie", "hguid");
 }
 
 char *hDownloadsServer()
 /* get the downloads server from hg.conf or the default */
 {
 return cfgOptionDefault("downloads.server", "hgdownload.cse.ucsc.edu");
 }
@@ -3026,108 +3031,96 @@
     return NULL;
 
 sortOrder_t *sortOrder = needMem(sizeof(sortOrder_t));
 sortOrder->htmlId = needMem(strlen(parentTdb->track)+15);
 safef(sortOrder->htmlId, (strlen(parentTdb->track)+15), "%s.sortOrder", parentTdb->track);
 char *cartSetting = NULL;
 if(cart != NULL)
     cartSetting = cartCgiUsualString(cart, sortOrder->htmlId, setting);
 if(cart != NULL && strlen(cartSetting) > strlen(setting)) // If setting is bigger, then it may be due to a trackDb change
     sortOrder->sortOrder = cloneString(cartSetting);  // cart order
 else
     sortOrder->sortOrder = cloneString(setting);      // old cart value is abandoned!
 
 sortOrder->setting = cloneString(setting);
 sortOrder->count   = chopByWhite(sortOrder->setting,NULL,0);  // Get size
-#ifdef SORT_ON_TRACK_NAME
 if (cart && !stringIn(SORT_ON_TRACK_NAME,setting))
     sortOrder->count += 1;
-#endif///def SORT_ON_TRACK_NAME
-#ifdef SORT_ON_RESTRICTED
 if (cart && !stringIn(SORT_ON_RESTRICTED,setting))
     sortOrder->count += 1;
-#endif///def SORT_ON_RESTRICTED
 sortOrder->column  = needMem(sortOrder->count*sizeof(char*));
 int foundColumns = chopByWhite(sortOrder->setting, sortOrder->column,sortOrder->count);
 sortOrder->title   = needMem(sortOrder->count*sizeof(char*));
 sortOrder->forward = needMem(sortOrder->count*sizeof(boolean));
 sortOrder->order   = needMem(sortOrder->count*sizeof(int));
-#if defined(SORT_ON_TRACK_NAME) || defined(SORT_ON_RESTRICTED)
 if (cart && foundColumns < sortOrder->count)
     {
     int columnCount = foundColumns;
     int size = 0;
     char *moreOrder = NULL;
-    #ifdef SORT_ON_TRACK_NAME
     if (cart && columnCount < sortOrder->count && !stringIn(SORT_ON_TRACK_NAME,setting))
         {
         assert(sortOrder->column[columnCount] == NULL);
         sortOrder->column[columnCount] = cloneString(SORT_ON_TRACK_NAME "=+");
         if (!stringIn(SORT_ON_TRACK_NAME,sortOrder->sortOrder))
             {
             size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5; // little bit more
             moreOrder = needMem(size);
             safef(moreOrder,size,"%s %s",sortOrder->sortOrder, sortOrder->column[columnCount]);
             freeMem(sortOrder->sortOrder);
             sortOrder->sortOrder = moreOrder;
             }
         columnCount++;
         }
-    #endif///def SORT_ON_TRACK_NAME
-    #ifdef SORT_ON_RESTRICTED
     if (cart && columnCount < sortOrder->count && !stringIn(SORT_ON_RESTRICTED,setting))
         {
         assert(sortOrder->column[columnCount] == NULL);
         sortOrder->column[columnCount] = cloneString(SORT_ON_RESTRICTED "=+");
         if (!stringIn(SORT_ON_RESTRICTED,sortOrder->sortOrder))
             {
             size = strlen(sortOrder->sortOrder) + strlen(sortOrder->column[columnCount]) + 5; // little bit more
             moreOrder = needMem(size);
             safef(moreOrder,size,"%s %s",sortOrder->sortOrder, sortOrder->column[columnCount]);
             freeMem(sortOrder->sortOrder);
             sortOrder->sortOrder = moreOrder;
             }
         columnCount++;
         }
-    #endif///def SORT_ON_RESTRICTED
     }
-#endif///def SORT_ON_TRACK_NAME
 for (ix = 0; ix<sortOrder->count; ix++)
     {
     strSwapChar(sortOrder->column[ix],'=',0);  // Don't want 'CEL=+' but 'CEL' and '+'
     char *pos = stringIn(sortOrder->column[ix], sortOrder->sortOrder);// find tdb substr in cart current order string
     //assert(pos != NULL && pos[strlen(sortOrder->column[ix])] == '=');
     if(pos != NULL && pos[strlen(sortOrder->column[ix])] == '=')
         {
         int ord=1;
         char* pos2 = sortOrder->sortOrder;
         for(;*pos2 && pos2 < pos;pos2++)
             {
             if(*pos2 == '=') // Discovering sort order in cart
                 ord++;
             }
         sortOrder->forward[ix] = (pos[strlen(sortOrder->column[ix]) + 1] == '+');
         sortOrder->order[ix] = ord;
         }
     else  // give up on cartSetting
         {
         sortOrder->forward[ix] = TRUE;
         sortOrder->order[ix] = ix+1;
         }
-#ifdef SORT_ON_TRACK_NAME
     if (ix < foundColumns)
-#endif///def SORT_ON_TRACK_NAME
         subgroupFindTitle(parentTdb,sortOrder->column[ix],&(sortOrder->title[ix]));
     }
 return sortOrder;  // NOTE cloneString:words[0]==*sortOrder->column[0] and will be freed when sortOrder is freed
 }
 void sortOrderFree(sortOrder_t **sortOrder)
 /* frees any previously obtained sortOrder settings */
 {
 if(sortOrder && *sortOrder)
     {
     int ix;
     for(ix=0;ix<(*sortOrder)->count;ix++) { subgroupFree(&((*sortOrder)->title[ix])); }
     freeMem((*sortOrder)->sortOrder);
     freeMem((*sortOrder)->htmlId);
     freeMem((*sortOrder)->column);
     freeMem((*sortOrder)->forward);
@@ -3859,30 +3852,31 @@
 
 // Determine whether there is a restricted until date column
 boolean restrictions = FALSE;
 for (subtrackRef = subtrackRefList; subtrackRef != NULL; subtrackRef = subtrackRef->next)
     {
     subtrack = subtrackRef->val;
     (void)metadataForTable(db,subtrack,NULL);
     if (NULL != metadataFindValue(subtrack,"dateUnrestricted"))
         {
         restrictions = TRUE;
         break;
         }
     }
 
 // Table wraps around entire list so that "Top" link can float to the correct place.
+cgiDown(0.7);
 printf("<table><tr><td class='windowSize'>");
 printf("<A NAME='DISPLAY_SUBTRACKS'></A>");
 if (sortOrder != NULL)
     {
     // First table row contains the display "selected/visible" or "all" radio buttons
     // NOTE: list subtrack radio buttons are inside tracklist table header if there are no sort columns
     //       The reason is to ensure spacing of lines column headers when the only column header is "Restricted Until"
     printf("<B>List subtracks:&nbsp;");
     char javascript[JBUFSIZE];
     safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(true);\"");
     cgiMakeOnClickRadioButton("displaySubtracks", "selected", !displayAll,javascript);
     puts("only selected/visible &nbsp;&nbsp;");
     safef(javascript, sizeof(javascript), "onclick=\"showOrHideSelectedSubtracks(false);\"");
     cgiMakeOnClickRadioButton("displaySubtracks", "all", displayAll,javascript);
     printf("all</B>");
@@ -3942,79 +3936,69 @@
     if (slCount(subtrackRefList) > 5)
         printf("&nbsp;&nbsp;&nbsp;&nbsp;(<span class='subCBcount'></span>)");
     puts("</TD>");
     columnCount = colspan;
     }
 
 // Add column headers which are sort button links
 if (sortOrder != NULL)
     {
     printf("<TH>&nbsp;<INPUT TYPE=HIDDEN NAME='%s' class='sortOrder' VALUE='%s'></TH>\n", sortOrder->htmlId, sortOrder->sortOrder); // keeing track of sortOrder
     columnCount++;
     // Columns in tdb order (unchanging), sort in cart order (changed by user action)
     int sIx=0;
     for(sIx=0;sIx<sortOrder->count;sIx++)
         {
-#ifdef SORT_ON_TRACK_NAME
         if (sameString(SORT_ON_TRACK_NAME,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
-#endif///def SORT_ON_TRACK_NAME
-#ifdef SORT_ON_RESTRICTED
         if (sameString(SORT_ON_RESTRICTED,sortOrder->column[sIx]))
             break; // All wrangler requested sort orders have been done.
-#endif///def SORT_ON_RESTRICTED
         printf("<TH id='%s' class='sortable%s sort%d' abbr='use' onclick='tableSortAtButtonPress(this);'>%s",
             sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx],sortOrder->title[sIx]);
         printf("<sup>%s",(sortOrder->forward[sIx]?"&darr;":"&uarr;"));
         if (sortOrder->count > 1)
             printf ("%d",sortOrder->order[sIx]);
         printf("</sup>");
         puts ("</TH>");
         columnCount++;
         }
 
     // longLabel column
-#ifdef SORT_ON_TRACK_NAME
     assert(sameString(SORT_ON_TRACK_NAME,sortOrder->column[sIx]));
     printf("<TH id='%s' class='sortable%s sort%d' onclick='tableSortAtButtonPress(this);' align='left'>&nbsp;&nbsp;Track Name",
            sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx]);
     printf("<sup>%s%d</sup>",(sortOrder->forward[sIx]?"&darr;":"&uarr;"),sortOrder->order[sIx]);
     puts ("</TH>");
-#else///ifndef SORT_ON_TRACK_NAME
-    puts("<TD>&nbsp;</TD>");
-#endif///ndef SORT_ON_TRACK_NAME
     columnCount++;
     }
 puts("<TH>&nbsp;</TH>"); // schema column
 columnCount++;
 
 // Finally there may be a restricted until column
 if (restrictions)
     {
-#ifdef SORT_ON_RESTRICTED
     if (sortOrder != NULL)
         {
         int sIx=sortOrder->count-1;
         assert(sameString(SORT_ON_RESTRICTED,sortOrder->column[sIx]));
         printf("<TH id='%s' class='sortable%s sort%d' onclick='tableSortAtButtonPress(this);' align='left'>&nbsp;Restricted Until",
             sortOrder->column[sIx],(sortOrder->forward[sIx]?"":" sortRev"),sortOrder->order[sIx]);
         printf("<sup>%s%d</sup>",(sortOrder->forward[sIx]?"&darr;":"&uarr;"),sortOrder->order[sIx]);
         //printf("<span class='bgLevel1' style='height:100%%;'><A HREF=\'%s\' TARGET=BLANK>&nbsp;?&nbsp;</A></span>", ENCODE_DATA_RELEASE_POLICY);
         puts ("</TH>");
         }
     else
-#endif///def SORT_ON_RESTRICTED
         {
         printf("<TH align='center'>&nbsp;");
         printf("<A HREF=\'%s\' TARGET=BLANK>Restricted Until</A>", ENCODE_DATA_RELEASE_POLICY);
         puts("&nbsp;</TH>");
         }
     columnCount++;
     }
 puts("</TR></THEAD>"); // The end of the header section.
 
 // The subtracks need to be sorted by priority but only sortable and dragable will have non-default (cart) priorities to sort on
 if (sortOrder != NULL || useDragAndDrop)
     {
     preSorted = tdbRefSortPrioritiesFromCart(cart, &subtrackRefList); // preserves user's prev sort/drags
     printf("<TBODY class='%saltColors'>\n",(sortOrder != NULL ? "sortable " : "") );
     }
@@ -4191,45 +4175,47 @@
             {
             if (dateIsOld(dateDisplay,"%F"))
                 printf("</TD>\n<TD align='center' nowrap style='color: #BBBBBB;'>&nbsp;%s&nbsp;", dateDisplay);
             else
                 printf("</TD>\n<TD align='center'>&nbsp;%s&nbsp;", dateDisplay);
             }
         }
 
     // End of row and free ourselves of this subtrack
     puts("</TD></TR>\n");
     checkBoxIdFree(&id);
     subgroupMembershipFree(&membership);
     }
 
 // End of the table
-puts("</TBODY><TFOOT>");
-printf("<TR valign='top'><TD colspan=%d>&nbsp;&nbsp;&nbsp;&nbsp;",columnCount-1);
+puts("</TBODY>");
+if (slCount(subtrackRefList) > 5 || (restrictions && sortOrder != NULL))
+    {
+    printf("<TFOOT style='background-color:%s;'><TR valign='top'><TD colspan=%d>&nbsp;&nbsp;&nbsp;&nbsp;",
+           COLOR_BG_DEFAULT_DARKER,columnCount-1);
 
 // Count of subtracks is filled in by javascript.
 if (slCount(subtrackRefList) > 5)
     printf("<span class='subCBcount'></span>\n");
 
 // Restruction policy needs a link
-#ifdef SORT_ON_RESTRICTED
 if (restrictions && sortOrder != NULL)
     printf("</TD><TH><A HREF='%s' TARGET=BLANK style='font-size:.9em;'>Restriction Policy</A>", ENCODE_DATA_RELEASE_POLICY);
-#endif///def SORT_ON_RESTRICTED
 
-printf("</TD></TR>\n");
-puts("</TFOOT></TABLE>");
+    printf("</TD></TR></TFOOT>\n");
+    }
+puts("</TABLE>");
 if (sortOrder == NULL)
     printf("</td></tr></table>");
 
 // Tying subtracks with matrix and subtrack cfgs with views requires javascript help
 puts("<script type='text/javascript'>matInitializeMatrix();</script>");
 #ifndef SUBTRACK_CFG_POPUP
 if (dependentCfgsNeedBinding)
     cfgLinkToDependentCfgs(cart,parentTdb,parentTdb->track);
 #endif//ndef SUBTRACK_CFG_POPUP
 
 // Finally we are free of all this
 membersForAllSubGroupsFree(parentTdb,&membersForAll);
 dyStringFree(&dyHtml)
 sortOrderFree(&sortOrder);
 dividersFree(&dividers);
@@ -4520,60 +4506,60 @@
 boolean compositeLevel = isNameAtCompositeLevel(tdb,prefix);
 char *scoreMinStr = trackDbSettingClosestToHome(tdb, GRAY_LEVEL_SCORE_MIN);
 if (scoreMinStr != NULL)
     {
     int scoreMin = atoi(scoreMinStr);
     // maxShade=9 taken from hgTracks/simpleTracks.c.  Ignore the 10 in shadesOfGray[10+1] --
     // maxShade is used to access the array.
     int maxShade = 9;
     int scoreMinGrayLevel = scoreMin * maxShade/scoreMax;
     if (scoreMinGrayLevel <= 0) scoreMinGrayLevel = 1;
     char *setting = trackDbSettingClosestToHome(tdb, MIN_GRAY_LEVEL);
     int minGrayLevel = cartUsualIntClosestToHome(cart, tdb, compositeLevel, MIN_GRAY_LEVEL,
                         setting ? atoi(setting) : scoreMinGrayLevel);
     if (minGrayLevel <= 0) minGrayLevel = 1;
     if (minGrayLevel > maxShade) minGrayLevel = maxShade;
-    puts("\n<P><B>Shade of lowest-scoring items: </B>");
+    puts("\n<B>Shade of lowest-scoring items: </B>");
     // Add javascript to select so that its color is consistent with option colors:
     int level = 255 - (255*minGrayLevel / maxShade);
     printf("<SELECT NAME=\"%s.%s\" STYLE='color: #%02x%02x%02x' class='normalText'",
 	   prefix, MIN_GRAY_LEVEL, level, level, level);
     int i;
 #ifdef OMIT
     // IE works without this code and FF doesn't work with it.
     printf(" onchange=\"switch(this.value) {");
     for (i = 1;  i < maxShade;  i++)
         {
         level = 255 - (255*i / maxShade);
         printf ("case '%d': $(this).css('color','#%02x%02x%02x'); break; ",i, level, level, level);
         }
     level = 255 - (255*i / maxShade);
     printf("default: $(this).css('color','#%02x%02x%02x'); }\"", level, level, level);
 #endif//def OMIT
     puts(">\n");
     // Use class to set color of each option:
     for (i = 1;  i <= maxShade;  i++)
         {
         level = 255 - (255*i / maxShade);
         printf("<OPTION%s STYLE='color: #%02x%02x%02x' VALUE=%d>",
             (minGrayLevel == i ? " SELECTED" : ""), level, level, level, i);
         if (i == maxShade)
             printf("&bull; black</OPTION>\n");
         else
             printf("&bull; gray (%d%%)</OPTION>\n", i * (100/maxShade));
         }
-    printf("</SELECT></P>\n");
+    printf("</SELECT>\n");
     }
 }
 
 static boolean getScoreDefaultsFromTdb(struct trackDb *tdb, char *scoreName,char *defaults,char**min,char**max)
 /* returns TRUE if defaults exist and sets the string pointer (because they may be float or int)
    if min or max are set, then they should be freed */
 {
 if(min)
     *min = NULL; // default these outs!
 if(max)
     *max = NULL;
 char *setting = trackDbSettingClosestToHome(tdb, scoreName);
 if(setting)
     {
     if(strchr(setting,':') != NULL)
@@ -6135,31 +6121,31 @@
             printf("><TD width=10>&nbsp;</TD>");
             int ix2=ix;
             while(0 < ix2--)
                 printf("<TD width=100>&nbsp;</TD>");
             printf("<TD colspan=%d>",membersOfView->count+1);
             safef(varName, sizeof(varName), "%s", view->track);
             if(configurable[ix] != cfgNone)
                 {
                 cfgByCfgType(configurable[ix],db,cart,view->subtracks,varName,
                         membersOfView->titles[ix],TRUE);
                 cfgLinkToDependentCfgs(cart,parentTdb,varName);
                 }
             }
         }
     }
-puts("</TABLE><BR>");
+puts("</TABLE>");
 subgroupMembersFree(&membersOfView);
 freeMem(matchedSubtracks);
 return TRUE;
 }
 
 char *compositeLabelWithVocabLink(char *db,struct trackDb *parentTdb, struct trackDb *childTdb,
 	char *vocabType, char *label)
 /* If the parentTdb has a controlledVocabulary setting and the vocabType is found,
    then label will be wrapped with the link to display it.  Return string is cloned. */
 {
 char *vocab = trackDbSetting(parentTdb, "controlledVocabulary");
 (void)metadataForTable(db,childTdb,NULL);
 if(vocab == NULL)
     return cloneString(label); // No wrapping!
 
@@ -6470,30 +6456,31 @@
 static boolean compositeUiByFilter(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName)
 /* UI for composite tracks: filter subgroups by multiselects to select subtracks. */
 {
 membersForAll_t* membersForAll = membersForAllSubGroupsGet(parentTdb,cart);
 if(membersForAll == NULL || membersForAll->filters == FALSE) // Not Matrix or filters
     return FALSE;
 jsIncludeFile("ui.core.js",NULL);
 jsIncludeFile("ui.dropdownchecklist.js",NULL);
 webIncludeResourceFile("ui.dropdownchecklist.css");
 
 // TODO:
 // 1) Scroll long lists should be configurable through tdb setting
 //    #define FILTER_COMPOSITE_OPEN_SIZE 16
 // 2) columnCount (Number of filterBoxes per row) should be configurable through tdb setting
 
+cgiDown(0.7);
 printf("<B>Filter subtracks %sby:</B> (select multiple %sitems - %s)<BR>\n",
        (membersForAll->members[dimX] != NULL || membersForAll->members[dimY] != NULL ? "further ":""),
        (membersForAll->dimMax == dimA?"":"categories and "),FILTERBY_HELP_LINK);
 printf("<TABLE><TR valign='top'>\n");
 
 // Do All [+][-] buttons
 if(membersForAll->members[dimX] == NULL && membersForAll->members[dimY] == NULL) // No matrix
     {
     #define PM_BUTTON_FILTER_COMP "<input type='button' class='inOutButton' onclick=\"waitOnFunction(filterCompositeSet,this,%s); return false;\" id='btn_%s' value='%c'>"
     printf("<TD align='left' width='50px'><B>All:</B><BR>");
     printf(PM_BUTTON_FILTER_COMP,"true",  "plus_fc",'+');
     printf(PM_BUTTON_FILTER_COMP,"false","minus_fc",'-');
     //#define PM_BUTTON2_FILTER_COMP "<IMG height=18 width=18 onclick=\"filterCompositeSet(%s);\" id='btn_%s' src='../images/%s'>"
     //printf(PM_BUTTON2_FILTER_COMP,"true",  "plus_fc",   "add_sm.gif");
     //printf(PM_BUTTON2_FILTER_COMP,"false","minus_fc","remove_sm.gif");
@@ -6729,53 +6716,52 @@
                     else
                         printf("<TD title='%s'></TD>\n",(ttlX ? ttlX : ttlY));
                     //puts("<TD>&nbsp;</TD>");
                     }
                 }
             }
         if(dimensionX && cntX>MATRIX_RIGHT_BUTTONS_AFTER)
             matrixYheadings(db,parentTdb, membersForAll,ixY,FALSE);
         puts("</TR>\n");
         }
     }
 if(dimensionY && cntY>MATRIX_BOTTOM_BUTTONS_AFTER)
     matrixXheadings(db,parentTdb,membersForAll,FALSE);
 
 puts("</TD></TR></TABLE>");
-puts("<BR>\n");
 
 // If any filter additional filter composites, they can be added at the end.
 compositeUiByFilter(db, cart, parentTdb, formName);
 
 return TRUE;
 }
 
 static boolean compositeUiAllButtons(char *db, struct cart *cart, struct trackDb *parentTdb, char *formName)
 /* UI for composite tracks: all/none buttons only (as opposed to matrix or lots of buttons */
 {
 if (trackDbCountDescendantLeaves(parentTdb) <= 1)
     return FALSE;
 
 if(dimensionsExist(parentTdb))
     return FALSE;
 
 #define PM_BUTTON_GLOBAL "<IMG height=18 width=18 onclick=\"matSubCBsCheck(%s);\" id='btn_%s' src='../images/%s'>"
 #define    BUTTON_PLUS_ALL_GLOBAL()  printf(PM_BUTTON_GLOBAL,"true",  "plus_all",   "add_sm.gif")
 #define    BUTTON_MINUS_ALL_GLOBAL() printf(PM_BUTTON_GLOBAL,"false","minus_all","remove_sm.gif")
 BUTTON_PLUS_ALL_GLOBAL();
 BUTTON_MINUS_ALL_GLOBAL();
-puts("&nbsp;<B>Select all subtracks</B><BR><BR>");
+puts("&nbsp;<B>Select all subtracks</B><BR>");
 return TRUE;
 }
 
 static boolean compositeUiNoMatrix(char *db, struct cart *cart, struct trackDb *parentTdb,
           char *primarySubtrack, char *formName)
 /* UI for composite tracks: subtrack selection.  This is the default UI
 without matrix controls. */
 {
 int i, j, k;
 char *words[SMALLBUF];
 char option[SMALLBUF];
 int wordCnt;
 char javascript[JBUFSIZE];
 char *primaryType = getPrimaryType(primarySubtrack, parentTdb);
 char *name, *value;
@@ -6939,52 +6925,53 @@
         if(trackDbSetting(tdb, "dragAndDrop") != NULL)
             jsIncludeFile("jquery.tablednd.js", NULL);
         jsIncludeFile("ajax.js",NULL);
         #ifdef TABLE_SCROLL
         jsIncludeFile("jquery.fixedtable.js",NULL);
         #endif//def TABLE_SCROLL
         }
     jsIncludeFile("hui.js",NULL);
     }
 
 #ifdef SUBTRACK_CFG_POPUP
 printf("<div id='popit' style='display: none'></div>");
 cgiMakeHiddenVar("db", db);
 printf("<input type=HIDDEN id='track' value='%s';</input>\n",tdb->track);
 #endif
-puts("<BR>");
+cgiDown(0.7);
 if (trackDbCountDescendantLeaves(tdb) < MANY_SUBTRACKS && !hasSubgroups)
     {
     if(primarySubtrack)
         compositeUiSubtracksMatchingPrimary(db, cart, tdb,primarySubtrack);
     else
         compositeUiSubtracks(db, cart, tdb, trackHash);
     return;
     }
 if (fakeSubmit)
     cgiMakeHiddenVar(fakeSubmit, "submit");
 
 if(primarySubtrack == NULL)
     {
     if(subgroupingExists(tdb,"view"))
         {
         hCompositeDisplayViewDropDowns(db, cart,tdb);
         if(subgroupCount(tdb) <= 1)
             viewsOnly = TRUE;
         }
     if(!viewsOnly)
         {
+        cgiDown(0.7);
         if(trackDbSettingOn(tdb, "allButtonPair"))
 	    {
             compositeUiAllButtons(db, cart, tdb, formName);
 	    }
         else if (!hasSubgroups || !isMatrix || primarySubtrack)
 	    {
             compositeUiNoMatrix(db, cart,tdb,primarySubtrack,formName);
 	    }
         else
 	    {
             compositeUiByMatrix(db, cart, tdb, formName);
 	    }
         }
 #ifdef SUBTRACK_CFG_POPUP
     if(primarySubtrack == NULL)
@@ -6993,31 +6980,31 @@
 #endif
     }
 
 cartSaveSession(cart);
 cgiContinueHiddenVar("g");
 
 if(primarySubtrack)
     compositeUiSubtracksMatchingPrimary(db, cart, tdb,primarySubtrack);
 else
     compositeUiSubtracks(db, cart, tdb, trackHash);
 
 if (primarySubtrack == NULL)  // primarySubtrack is set for tableBrowser but not hgTrackUi
     {
     if (trackDbCountDescendantLeaves(tdb) > 5)
         {
-        puts("<div style='height:.7em;'></div>");
+        cgiDown(0.7);
         cgiMakeButton("Submit", "Submit");
         }
     }
 }
 
 boolean superTrackDropDownWithExtra(struct cart *cart, struct trackDb *tdb,
                                 int visibleChild,char *extra)
 /* Displays hide/show dropdown for supertrack.
  * Set visibleChild to indicate whether 'show' should be grayed
  * out to indicate that no supertrack members are visible:
  *    0 to gray out (no visible children)
  *    1 don't gray out (there are visible children)
  *   -1 don't know (this function should determine)
  * If -1,i the subtracks field must be populated with the child trackDbs.
  * Returns false if not a supertrack */