f1739937876c7272e5ceea0b6c8a421598e94e00
max
  Mon Mar 13 06:42:49 2023 -0700
bringing back the default tracks and default order buttons, refs #30809

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 8c35fb7..c276684 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -8233,30 +8233,36 @@
 char *cfgName = catTwoStrings(cfgPrefix,"_html");
 char *html = cfgOption(cfgName);
 if (html)
     puts(html);
 }
 
 void printShortcutButtons(struct cart *cart, bool hasCustomTracks, bool revCmplDisp, bool multiRegionButtonTop)
 /* Display bottom control panel. */
 {
 if (isSearchTracksSupported(database,cart))
     {
     cgiMakeButtonWithMsg(TRACK_SEARCH, TRACK_SEARCH_BUTTON,TRACK_SEARCH_HINT);
     }
 
 hPrintf(" ");
+hButtonWithMsg("hgt.reset", "default tracks","Display only default tracks");
+hPrintf(" ");
+hButtonWithMsg("hgt.defaultImgOrder", "default order",
+   "Display current tracks in their default order");
+
+hPrintf(" ");
 hButtonWithMsg("hgt.hideAll", "hide all","Hide all currently visible tracks");
 
 hPrintf(" ");
 hPrintf("<INPUT TYPE='button' id='ct_add' VALUE='%s' title='%s'>",
         hasCustomTracks ? CT_MANAGE_BUTTON_LABEL : CT_ADD_BUTTON_LABEL,
         hasCustomTracks ? "Manage your custom tracks" : "Add your own custom tracks");
 jsOnEventById("click", "ct_add", "document.customTrackForm.submit(); return false;");
 
 hPrintf(" ");
 hButtonWithMsg("hgTracksConfigPage", "configure","Configure image and track selection");
 hPrintf(" ");
 
 if (!multiRegionButtonTop)
     {
     printMultiRegionButton();
@@ -9766,30 +9772,44 @@
 	{
 	// save new highlight position to cart var
 	char cartVar[1024];
 	safef(cartVar, sizeof cartVar, "%s.%s:%ld-%ld#%s", h->db, MULTI_REGION_VIRTUAL_CHROM_NAME, 
                 virtStart, virtEnd, h->hexColor);
 	cartSetString(cart, "highlight", cartVar);
 	}
     else
 	{
 	// erase the highlight cartvar if it has no overlap with the new virt chrom
 	cartRemove(cart, "highlight");
 	}
     }
 }
 
+static void setupTimeWarning()
+/* add javascript that outputs a warning message if page takes too long to load */
+{
+char *maxTimeStr = cfgOption("warnSeconds");
+if (!maxTimeStr)
+    return;
+
+int maxTime = atoi(maxTimeStr);
+struct dyString *dy = dyStringNew(150);
+dyStringPrintf(dy, "$(document).ready( function() { hgtWarnTiming(%d)});\n", maxTime);
+jsInline(dy->string);
+dyStringFree(&dy);
+}
+
 
 void tracksDisplay()
 /* Put up main tracks display. This routine handles zooming and
  * scrolling. */
 {
 char titleVar[256];
 char *oldPosition = cartUsualString(cart, "oldPosition", "");
 boolean findNearest = cartUsualBoolean(cart, "findNearest", FALSE);
 cartRemove(cart, "findNearest");
 
 boolean positionIsVirt = FALSE;
 position = getPositionFromCustomTracks();
 if (NULL == position)
     {
     position = cartGetPosition(cart, database, &lastDbPosCart);
@@ -10261,30 +10281,31 @@
 lastDbPosSaveCartSetting("lastVirtModeExtraState");
 
 cartSetDbPosition(cart, database, lastDbPosCart);
 
 if (cartUsualBoolean(cart, "hgt.psOutput", FALSE))
     handlePostscript();
 else
     doTrackForm(NULL, NULL);
 
 boolean gotExtTools = extToolsEnabled();
 setupHotkeys(gotExtTools);
 if (gotExtTools)
     printExtMenuData(chromName);
 if (recTrackSetsEnabled())
     printRecTrackSets();
+setupTimeWarning();
 }
 
 static void chromInfoTotalRow(int count, long long total, boolean hasAlias)
 /* Make table row with total number of sequences and size from chromInfo. */
 {
 cgiSimpleTableRowStart();
 cgiSimpleTableFieldStart();
 printf("Total: %d", count);
 cgiTableFieldEnd();
 cgiTableFieldStartAlignRight();
 printLongWithCommas(stdout, total);
 puts("&nbsp;&nbsp;");
 cgiTableFieldEnd();
 if (hasAlias)
     {