ee211bfbeedc99ca157c71ba3ba04ae6346b263b
max
  Tue Jul 21 02:11:14 2020 -0700
support the super old chrom:start-end syntax again (found by Jonathan), adding back
possibility to have higlights on two different dbs by removing check for
db-prefix in hgTracks (the db-filtering is done by the javascript code
anyways) and clean up the code a little by introducing a function that
creates the highlight string from the parts instead of copied code.
refs #21384

diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 7fe281e..80dc532 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -2132,62 +2132,68 @@
 }
 
 struct highlightVar
 // store highlight information
 {
 struct highlightVar *next;
 char *db;
 char *chrom;
 long chromStart;
 long chromEnd;
 char *hexColor;
 };
 
 struct highlightVar *parseHighlightInfo()
 // Parse highlight info from cart var to a linked list of highlightVar structs
-// Accepts three input formats for the highlight variable:
+// Accepts four input formats for the highlight variable:
+// 0) chrom:start-end (format in very old carts)
 // 1) db.chrom:start-end (format in very old carts)
 // 2) db.chrom:start-end#hexColor|db.chrom:start-end#hexColor|... (old format)
 // 3) db#chrom#start#end#hexColor|db#chrom#start#end#hexColor|... (current format, to allow . in seq names)
 //
 {
 struct highlightVar *hlList = NULL;
 char *highlightDef = cartOptionalString(cart, "highlight");
 if(highlightDef)
     {
     char *hlArr[256];
     int hlCount = chopByChar(cloneString(highlightDef), '|', hlArr, ArraySize(hlArr));
     int i;
     for (i=0; i<hlCount; i++)
         {
         char *oneHl = hlArr[i];
         struct highlightVar *h;
         char *chromStart, *chromEnd;
         AllocVar(h);
         if (countSeparatedItems(oneHl, '#')==5)
             // the new format: db#chrom#start#end#color
             {
             h->db     = cloneNextWordByDelimiter(&oneHl,'#');
             h->chrom  = cloneNextWordByDelimiter(&oneHl,'#');
             chromStart = cloneNextWordByDelimiter(&oneHl,'#');
             chromEnd = cloneNextWordByDelimiter(&oneHl,'#');
             h->hexColor = cloneString(oneHl);
             }
         else  // the syntax only used in old saved sessions
             // the old format: db.chr:start-end followed optionally by #color
+            // or just chr:start-end
             {
+            if (strchr(oneHl, '.')== NULL)
+                h->db = database;
+             else
                 h->db     = cloneNextWordByDelimiter(&oneHl,'.');
+
             h->chrom  = cloneNextWordByDelimiter(&oneHl,':');
             chromStart = cloneNextWordByDelimiter(&oneHl,'-');
             chromEnd = cloneNextWordByDelimiter(&oneHl,'#');
             if (oneHl && *oneHl != '\0')
                 h->hexColor = cloneString(oneHl);
             }
 
         if (!isEmpty(chromStart) && !isEmpty(chromEnd) &&
                 isNumericString(chromStart) && isNumericString(chromEnd) &&
                 !isEmpty(h->db) && !isEmpty(h->chrom))
             {
             // long to handle virt chrom coordinates
             h->chromStart = atol(chromStart);
             h->chromEnd   = atol(chromEnd);
             h->chromStart--; // Not zero based
@@ -10336,32 +10342,31 @@
 else
     {
     tracksDisplay();
     }
 
 if (cartVarExists(cart, "hgt.convertChromToVirtChrom"))
     {
     cartRemove(cart, "hgt.convertChromToVirtChrom");
     return;
     }
 
 jsonObjectAdd(jsonForClient, "measureTiming", newJsonBoolean(measureTiming));
 // js code needs to know if a highlightRegion is defined for this db
 checkAddHighlight(); // call again in case tracksDisplay's call to resolvePosition changed vars
 char *highlightDef = cartOptionalString(cart, "highlight");
-if (highlightDef && startsWith(database,highlightDef) &&
-       (highlightDef[strlen(database)] == '.' || highlightDef[strlen(database)] == '#'))
+if (highlightDef)
     jsonObjectAdd(jsonForClient, "highlight", newJsonString(highlightDef));
 jsonObjectAdd(jsonForClient, "enableHighlightingDialog",
 	      newJsonBoolean(cartUsualBoolean(cart, "enableHighlightingDialog", TRUE)));
 
 struct dyString *dy = dyStringNew(1024);
 jsonDyStringPrint(dy, (struct jsonElement *) jsonForClient, "hgTracks", 0);
 jsInline(dy->string);
 dyStringFree(&dy);
 
 if (measureTiming)
     measureTime("Time at end of doMiddle, next up cart write");
 
 if (cartOptionalString(cart, "udcTimeout"))
     {
     warn("The Genome Browser cart currently includes the \"udcTimeout\" string. "