abf281af7771f068acf620c8fe56f01f3b946ab1
larrym
  Thu Sep 8 19:07:57 2011 -0700
refactor blue bar hotLinks code so we build up a list which can be printed or sent to the javascript client code (see redmine #5245)
diff --git src/hg/hgTracks/hgTracks.c src/hg/hgTracks/hgTracks.c
index 90ce5b7..4e647e1 100644
--- src/hg/hgTracks/hgTracks.c
+++ src/hg/hgTracks/hgTracks.c
@@ -2604,32 +2604,43 @@
         insideWidth = tl.picWidth-gfxBorder-insideX;
         }
     #endif//def IMAGEv2_DRAG_SCROLL
     imgBoxFree(&theImgBox);
     }
 else
     {
     char *titleAttr = dragZooming ? "title='click or drag mouse in base position track to zoom in'" : "";
     hPrintf("<IMG SRC='%s' BORDER=1 WIDTH=%d HEIGHT=%d USEMAP=#%s %s id='trackMap'",
         gifTn.forHtml, pixWidth, pixHeight, mapName, titleAttr);
     hPrintf("><BR>\n");
     }
 flatTracksFree(&flatTracks);
 }
 
+static void appendLink(struct hotLink **links, char *url, char *name, char *id)
+{
+// append to list of links for later printing and/or communication with javascript client
+struct hotLink *link;
+AllocVar(link);
+link->name = cloneString(name);
+link->url = cloneString(url);
+link->id = cloneString(id);
+slAddTail(links, link);
+}
+
 static void printEnsemblAnchor(char *database, char* archive,
-    char *chrName, int start, int end)
+                               char *chrName, int start, int end, struct hotLink **links)
 /* Print anchor to Ensembl display on same window. */
 {
 char *scientificName = hScientificName(database);
 char *dir = ensOrgNameFromScientificName(scientificName);
 struct dyString *ensUrl;
 char *name;
 int localStart, localEnd;
 
 name = chrName;
 
 if (sameWord(scientificName, "Takifugu rubripes"))
     {
     /* for Fugu, must give scaffold, not chr coordinates */
     /* Also, must give "chrom" as "scaffold_N", name below. */
     if (differentWord(chromName,"chrM") &&
@@ -2655,31 +2666,31 @@
 	name = fixupName;
 	}
     }
 else if (sameWord(scientificName, "Saccharomyces cerevisiae"))
     {
     if (stringIn("2micron", chrName))
 	{
 	char *fixupName = replaceChars(chrName, "2micron", "2-micron");
 	name = fixupName;
 	}
     }
 
 if (sameWord(chrName, "chrM"))
     name = "chrMt";
 ensUrl = ensContigViewUrl(database, dir, name, seqBaseCount, start+1, end, archive);
-hPrintf("<A HREF=\"%s\" TARGET=_blank class=\"topbar\" id='ensemblLink'>", ensUrl->string);
+appendLink(links, ensUrl->string, "Ensembl", "ensemblLink");
 /* NOTE: you can not freeMem(dir) because sometimes it is a literal
  * constant */
 freeMem(scientificName);
 dyStringFree(&ensUrl);
 }
 
 void makeHgGenomeTrackVisible(struct track *track)
 /* This turns on a track clicked from hgGenome, even if it was previously */
 /* hidden manually and there are cart vars to support that. */
 {
 struct hashEl *hels;
 struct hashEl *hel;
 char prefix[SMALLBUF];
 /* First check if the click was from hgGenome.  If not, leave. */
 /* get the names of the tracks in the cart */
@@ -3466,31 +3477,31 @@
 	    hubSetErrorMessage(NULL, hub->id);
         errCatchFree(&errCatch);
 	}
     }
 hubConnectStatusFreeList(&hubList);
 }
 
 boolean restrictionEnzymesOk()
 /* Check to see if it's OK to do restriction enzymes. */
 {
 return (hTableExists("hgFixed", "cutters") &&
     hTableExists("hgFixed", "rebaseRefs") &&
     hTableExists("hgFixed", "rebaseCompanies"));
 }
 
-void fr2ScaffoldEnsemblLink(char *archive)
+static void fr2ScaffoldEnsemblLink(char *archive, struct hotLink **links)
 /* print out Ensembl link to appropriate scaffold there */
 {
 struct sqlConnection *conn = hAllocConn(database);
 struct sqlResult *sr = NULL;
 char **row = NULL;
 char query[256];
 safef(query, sizeof(query),
 "select * from chrUn_gold where chrom = '%s' and chromStart<%u and chromEnd>%u",
 chromName, winEnd, winStart);
 sr = sqlGetResult(conn, query);
 
 int itemCount = 0;
 struct agpFrag *agpItem = NULL;
 while ((row = sqlNextRow(sr)) != NULL)
     {
@@ -3499,44 +3510,45 @@
     ++itemCount;
     if (itemCount > 1)
 	break;
     }
 sqlFreeResult(&sr);
 hFreeConn(&conn);
 if (1 == itemCount)
     {   // verify *entirely* within single contig
     if ((winEnd <= agpItem->chromEnd) &&
 	(winStart >= agpItem->chromStart))
 	{
 	int agpStart = winStart - agpItem->chromStart;
 	int agpEnd = agpStart + winEnd - winStart;
 	hPuts("<TD ALIGN=CENTER>");
 	printEnsemblAnchor(database, archive, agpItem->frag,
-	agpStart, agpEnd);
+                           agpStart, agpEnd, links);
 	hPrintf("%s</A></TD>", "Ensembl");
 	}
     }
 agpFragFree(&agpItem);  // the one we maybe used
 }
 
 void hotLinks()
 /* Put up the hot links bar. */
 {
 boolean gotBlat = hIsBlatIndexedDatabase(database);
 struct dyString *uiVars = uiStateUrlPart(NULL);
 char *orgEnc = cgiEncode(organism);
 boolean psOutput = cgiVarExists("hgt.psOutput");
+struct hotLink *link, *links = NULL;
 
 hPrintf("<TABLE WIDTH=\"100%%\" BGCOLOR=\"#000000\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"1\"><TR><TD>\n");
 hPrintf("<TABLE WIDTH=\"100%%\" BGCOLOR=\"#2636D1\" BORDER=\"0\" CELLSPACING=\"0\" CELLPADDING=\"0\"><TR>\n");
 hPrintf("<TD><TABLE BORDER=\"0\"><TR>\n");
 hPrintf("<TD ALIGN=CENTER><A HREF=\"../index.html?org=%s&db=%s&%s=%u\" class=\"topbar\">Home</A>&nbsp;&nbsp;</TD>",
     orgEnc, database, cartSessionVarName(), cartSessionId(cart));
 
 if (hIsGisaidServer())
     {
     /* disable hgGateway for gisaid for now */
     //hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"../cgi-bin/hgGateway?org=%s&db=%s\" class=\"topbar\">Sequence View Gateway</A>&nbsp;&nbsp;</TD>", orgEnc, database);
     hPrintf(
     "<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"../cgi-bin/gisaidTable?gisaidTable.do.advFilter=filter+%c28now+on%c29&fromProg=hgTracks&%s=%u\" class=\"topbar\">%s</A>&nbsp;&nbsp;</TD>",
     '%', '%',
     cartSessionVarName(),
@@ -3634,59 +3646,53 @@
 
 
 char ensVersionString[256];
 char ensDateReference[256];
 ensGeneTrackVersion(database, ensVersionString, ensDateReference,
     sizeof(ensVersionString));
 
 if (!psOutput)
     {
     if (differentWord(database,"susScr2"))
         {
         /* Print Ensembl anchor for latest assembly of organisms we have
         * supported by Ensembl == if versionString from trackVersion exists */
         if (sameWord(database,"hg19"))
             {
-            hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;");
-            printEnsemblAnchor(database, NULL, chromName, winStart, winEnd);
-            hPrintf("%s</A>&nbsp;&nbsp;</TD>", "Ensembl");
+            printEnsemblAnchor(database, NULL, chromName, winStart, winEnd, &links);
             }
         else if (sameWord(database,"hg18"))
             {
-            hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;");
-            printEnsemblAnchor(database, "ncbi36", chromName, winStart, winEnd);
-            hPrintf("%s</A>&nbsp;&nbsp;</TD>", "Ensembl");
+            printEnsemblAnchor(database, "ncbi36", chromName, winStart, winEnd, &links);
             }
         else if (sameWord(database,"oryCun2") || sameWord(database,"anoCar2") || sameWord(database,"calJac3"))
             {
-            hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;");
-            printEnsemblAnchor(database, NULL, chromName, winStart, winEnd);
-            hPrintf("%s</A>&nbsp;&nbsp;</TD>", "Ensembl");
+            printEnsemblAnchor(database, NULL, chromName, winStart, winEnd, &links);
             }
         else if (ensVersionString[0])
             {
             char *archive = NULL;
             if (ensDateReference[0] && differentWord("current", ensDateReference))
                 archive = cloneString(ensDateReference);
             /*  Can we perhaps map from a UCSC random chrom to an Ensembl contig ? */
             if (isUnknownChrom(database, chromName))
                 {
                 //	which table to check
                 char *ctgPos = "ctgPos";
 
                 if (sameWord(database,"fr2"))
-                    fr2ScaffoldEnsemblLink(archive);
+                    fr2ScaffoldEnsemblLink(archive, &links);
                 else if (hTableExists(database, ctgPos))
                     /* see if we are entirely within a single contig */
                     {
                     struct sqlConnection *conn = hAllocConn(database);
                     struct sqlResult *sr = NULL;
                     char **row = NULL;
                     char query[256];
                     safef(query, sizeof(query),
             "select * from %s where chrom = '%s' and chromStart<%u and chromEnd>%u",
                     ctgPos, chromName, winEnd, winStart);
                     sr = sqlGetResult(conn, query);
 
                     int itemCount = 0;
                     struct ctgPos *ctgItem = NULL;
                     while ((row = sqlNextRow(sr)) != NULL)
@@ -3694,152 +3700,150 @@
                         ctgPosFree(&ctgItem);   // if there is a second one
                         ctgItem = ctgPosLoad(row);
                         ++itemCount;
                         if (itemCount > 1)
                             break;
                         }
                     sqlFreeResult(&sr);
                     hFreeConn(&conn);
                     if (1 == itemCount)
                         {   // verify *entirely* within single contig
                         if ((winEnd <= ctgItem->chromEnd) &&
                             (winStart >= ctgItem->chromStart))
                             {
                             int ctgStart = winStart - ctgItem->chromStart;
                             int ctgEnd = ctgStart + winEnd - winStart;
-                            hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;");
                             printEnsemblAnchor(database, archive, ctgItem->contig,
-                            ctgStart, ctgEnd);
-                            hPrintf("%s</A>&nbsp;&nbsp;</TD>", "Ensembl");
+                                               ctgStart, ctgEnd, &links);
                             }
                         }
                     ctgPosFree(&ctgItem);   // the one we maybe used
                     }
                 }
             else
                 {
-                hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;");
-                printEnsemblAnchor(database, archive, chromName, winStart, winEnd);
-                hPrintf("%s</A>&nbsp;&nbsp;</TD>", "Ensembl");
+                printEnsemblAnchor(database, archive, chromName, winStart, winEnd, &links);
                 }
             }
         }
     }
 
 if (!psOutput)
     {
+    char buf[2056];
     /* Print NCBI MapView anchor */
     if (sameString(database, "hg18"))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9606&CHR=%s&BEG=%d&END=%d&build=previous\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9606&build=previous&CHR=%s&BEG=%d&END=%d", 
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "hg19"))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9606&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9606&CHR=%s&BEG=%d&END=%d", 
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "mm8"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=10090&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=10090&CHR=%s&BEG=%d&END=%d", 
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "danRer2"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=7955&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=7955&CHR=%s&BEG=%d&END=%d", 
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "galGal3"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9031&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9031&CHR=%s&BEG=%d&END=%d",
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "canFam2"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9615&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9615&CHR=%s&BEG=%d&END=%d",
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "rheMac2"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9544&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9544&CHR=%s&BEG=%d&END=%d",
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "panTro2"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9598&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9598&CHR=%s&BEG=%d&END=%d",
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "anoGam1"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=7165&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=7165&CHR=%s&BEG=%d&END=%d",
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (sameString(database, "bosTau6"))
         {
-        hPrintf("<TD ALIGN=CENTER>");
-        hPrintf("<A HREF=\"http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9913&CHR=%s&BEG=%d&END=%d\" TARGET=_blank class=\"topbar\" id='ncbiLink'>",
+        safef(buf, sizeof(buf), "http://www.ncbi.nlm.nih.gov/mapview/maps.cgi?taxid=9913&CHR=%s&BEG=%d&END=%d",
             skipChr(chromName), winStart+1, winEnd);
-        hPrintf("%s</A>&nbsp;&nbsp;</TD>", "NCBI");
+        appendLink(&links, buf, "NCBI", "ncbiLink");
         }
     if (startsWith("oryLat", database))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://medaka.utgenome.org/browser_ens_jump.php?revision=version1.0&chr=chromosome%s&start=%d&end=%d\" TARGET=_blank class=\"topbar\" id='medakaLink'>%s</A>&nbsp;&nbsp;</TD>",
-            skipChr(chromName), winStart+1, winEnd, "UTGB");
+        safef(buf, sizeof(buf), "http://medaka.utgenome.org/browser_ens_jump.php?revision=version1.0&chr=chromosome%s&start=%d&end=%d",
+            skipChr(chromName), winStart+1, winEnd);
+        appendLink(&links, buf, "UTGB", "medakaLink");
         }
     if (sameString(database, "cb3"))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://www.wormbase.org/db/seq/gbrowse/briggsae?name=%s:%d-%d\" TARGET=_blank class=\"topbar\" id='wormbaseLink'>%s</A>&nbsp;&nbsp;</TD>",
-            skipChr(chromName), winStart+1, winEnd, "WormBase");
+        safef(buf, sizeof(buf), "http://www.wormbase.org/db/seq/gbrowse/briggsae?name=%s:%d-%d",
+            skipChr(chromName), winStart+1, winEnd);
+        appendLink(&links, buf, "WormBase", "wormbaseLink");
         }
     if (sameString(database, "cb4"))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://www.wormbase.org/db/gb2/gbrowse/c_briggsae?name=%s:%d-%d\" TARGET=_blank class=\"topbar\" id='wormbaseLink'>%s</A>&nbsp;&nbsp;</TD>",
-            chromName, winStart+1, winEnd, "WormBase");
+        safef(buf, sizeof(buf), "http://www.wormbase.org/db/gb2/gbrowse/c_briggsae?name=%s:%d-%d",
+            chromName, winStart+1, winEnd);
+        appendLink(&links, buf, "WormBase", "wormbaseLink");
         }
     if (sameString(database, "ce10"))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://www.wormbase.org/db/gb2/gbrowse/c_elegans?name=%s:%d-%d\" TARGET=_blank class=\"topbar\" id='wormbaseLink'>%s</A>&nbsp;&nbsp;</TD>",
-            skipChr(chromName), winStart+1, winEnd, "WormBase");
+        safef(buf, sizeof(buf), "http://www.wormbase.org/db/gb2/gbrowse/c_elegans?name=%s:%d-%d",
+            skipChr(chromName), winStart+1, winEnd);
+        appendLink(&links, buf, "WormBase", "wormbaseLink");
         }
     if (sameString(database, "ce4"))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://ws170.wormbase.org/db/seq/gbrowse/wormbase?name=%s:%d-%d\" TARGET=_blank class=\"topbar\" id='wormbaseLink'>%s</A>&nbsp;&nbsp;</TD>",
-            skipChr(chromName), winStart+1, winEnd, "WormBase");
+        safef(buf, sizeof(buf), "http://ws170.wormbase.org/db/seq/gbrowse/wormbase?name=%s:%d-%d",
+            skipChr(chromName), winStart+1, winEnd);
+        appendLink(&links, buf, "WormBase", "wormbaseLink");
         }
     if (sameString(database, "ce2"))
         {
-        hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"http://ws120.wormbase.org/db/seq/gbrowse/wormbase?name=%s:%d-%d\" TARGET=_blank class=\"topbar\" id='wormbaseLink'>%s</A>&nbsp;&nbsp;</TD>",
-            skipChr(chromName), winStart+1, winEnd, "WormBase");
+        safef(buf, sizeof(buf), "http://ws120.wormbase.org/db/seq/gbrowse/wormbase?name=%s:%d-%d",
+            skipChr(chromName), winStart+1, winEnd);
+        appendLink(&links, buf, "WormBase", "wormbaseLink");
         }
     }
 
+for(link = links; link != NULL; link = link->next)
+    hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"%s\" TARGET=\"_blank\" class=\"topbar\" id=\"%s\">%s</A>&nbsp;&nbsp;</TD>\n", link->url, link->id, link->name);
+
 if (hIsGisaidServer())
     {
     //hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"/goldenPath/help/gisaidTutorial.html#SequenceView\" TARGET=_blank class=\"topbar\">%s</A>&nbsp;&nbsp;</TD>\n", "Help");
     hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"../cgi-bin/hgNotYet\" TARGET=_blank class=\"topbar\">%s</A>&nbsp;&nbsp;</TD>\n", "Help");
     }
 else
 if (hIsGsidServer())
     {
     hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"/goldenPath/help/gsidTutorial.html#SequenceView\" TARGET=_blank class=\"topbar\">%s</A>&nbsp;&nbsp;</TD>\n", "Help");
     }
 else
     {
     hPrintf("<TD ALIGN=CENTER>&nbsp;&nbsp;<A HREF=\"../goldenPath/help/hgTracksHelp.html\" TARGET=_blank class=\"topbar\">%s</A>&nbsp;&nbsp;</TD>\n", "Help");
     }