5b97c90762187cf1993742fe8c422308e08d082c tdreszer Wed Jul 11 17:08:55 2012 -0700 Next batch of many checkins as dictated by Jim. Formatting if and limiting lines to 100 chars. Changes limited to lines last touched by tdreszer (git blame) so as not to ruin history. None of these changes should affect executables in any way. diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c index 3e9a4f7..308f837 100644 --- src/hg/hgTrackUi/hgTrackUi.c +++ src/hg/hgTrackUi/hgTrackUi.c @@ -444,56 +444,60 @@ cgiScriptName(), jsSetVerticalPosition(MAIN_FORM)); cgiMakeOnClickSubmitButton(javascript, defaultButtonVar, JS_DEFAULTS_BUTTON_LABEL); printf("<BR><BR>\n" "The selected "Feature for Color Specification" above has the\n" "selection of colors below for each attribute. Only the color\n" "options for the feature selected above will be used to color items;\n" "color options for other features will not be shown.\n"); if (version > 127 && colorSourceCart == snp125ColorSourceLocType) colorSourceCart = SNP125_DEFAULT_COLOR_SOURCE; switch (colorSourceCart) { int funcArraySize; case snp125ColorSourceLocType: snp125PrintColorSpec(tdb->track, "locType", snp125LocTypeOldColorVars, TRUE, - snp125LocTypeLabels, snp125LocTypeDefault, snp125LocTypeArraySize); + snp125LocTypeLabels, snp125LocTypeDefault, + snp125LocTypeArraySize); break; case snp125ColorSourceClass: snp125PrintColorSpec(tdb->track, "class", snp125ClassOldColorVars, TRUE, snp125ClassLabels, snp125ClassDefault, snp125ClassArraySize); break; case snp125ColorSourceValid: snp125PrintColorSpec(tdb->track, "valid", snp125ValidOldColorVars, TRUE, snp125ValidLabels, snp125ValidDefault, snp125ValidArraySize); break; case snp125ColorSourceFunc: funcArraySize = (version < 130) ? snp125FuncArraySize : (snp125FuncArraySize - 1); snp125PrintColorSpec(tdb->track, "func", snp125FuncOldColorVars, TRUE, snp125FuncLabels, snp125FuncDefault, funcArraySize); break; case snp125ColorSourceMolType: snp125PrintColorSpec(tdb->track, "molType", snp125MolTypeOldColorVars, TRUE, - snp125MolTypeLabels, snp125MolTypeDefault, snp125MolTypeArraySize); + snp125MolTypeLabels, snp125MolTypeDefault, + snp125MolTypeArraySize); break; case snp125ColorSourceExceptions: snp125PrintColorSpec(tdb->track, "exceptions", snp132ExceptionVarName, FALSE, - snp132ExceptionLabels, snp132ExceptionDefault, snp132ExceptionArraySize); + snp132ExceptionLabels, snp132ExceptionDefault, + snp132ExceptionArraySize); break; case snp125ColorSourceBitfields: snp125PrintColorSpec(tdb->track, "bitfields", snp132BitfieldVarName, FALSE, - snp132BitfieldLabels, snp132BitfieldDefault, snp132BitfieldArraySize); + snp132BitfieldLabels, snp132BitfieldDefault, + snp132BitfieldArraySize); break; case snp125ColorSourceAlleleFreq: printf("<P>Items are be colored by allele frequency on a red-blue spectrum, " "with red representing rare alleles and blue representing common alleles. " "Items with no allele frequency data are colored black.</P>"); break; default: errAbort("Unrecognized value of enum snp125ColorSource (%d)", colorSourceCart); } jsEndCollapsibleSection(); } void snp125Ui(struct trackDb *tdb) /* UI for dbSNP version 125 and later. */ { @@ -2003,32 +2007,34 @@ printf("<p><b>Maximum Interval to Interpolate Across</b>: "); cgiMakeIntVar(&options[6][0], thisLineGap, 10 ); printf(" bases"); } } void affyTxnPhase2Ui(struct trackDb *tdb) /* Ui for affymetrix transcriptome phase 2 data. */ { enum trackVisibility tnfgVis = tvHide; char *visString = cartUsualString(cart, "hgt.affyPhase2.tnfg", "hide"); tnfgVis = hTvFromString(visString); printf("<b>Transfrags Display Mode: </b>"); hTvDropDown("hgt.affyPhase2.tnfg", tnfgVis, TRUE); -wigCfgUi(cart,tdb,tdb->track,"<span style='text-decoration:underline;'>Graph Plotting options:</span>",FALSE); -printf("<p><b><span style='text-decoration:underline;'>View/Hide individual cell lines:</span></b>"); +wigCfgUi(cart,tdb,tdb->track, + "<span style='text-decoration:underline;'>Graph Plotting options:</span>",FALSE); +printf("<p><b><span style='text-decoration:underline;'>" + "View/Hide individual cell lines:</span></b>"); } void humMusUi(struct trackDb *tdb, int optionNum ) /* put up UI for human/mouse conservation sample tracks (humMusL and musHumL)*/ { char options[7][256]; int thisHeightPer, thisLineGap; float thisMinYRange, thisMaxYRange; char *interpolate, *fill; snprintf( &options[0][0], 256, "%s.heightPer", tdb->track ); snprintf( &options[1][0], 256, "%s.linear.interp", tdb->track ); snprintf( &options[3][0], 256, "%s.fill", tdb->track ); snprintf( &options[4][0], 256, "%s.min.cutoff", tdb->track ); @@ -2375,95 +2381,97 @@ return TRUE; return FALSE; } #endif /* UNUSED */ void superTrackUi(struct trackDb *superTdb, struct trackDb *tdbList) /* List tracks in this collection, with visibility controls and UI links */ { #define SUPERS_WITH_CHECKBOXES #ifdef SUPERS_WITH_CHECKBOXES #ifdef BUTTONS_BY_CSS #define BUTTON_SUPER "<span class='pmButton' onclick='superT.plusMinus(%s)'>%c</span>" #define BUTTON_PLUS_SUPER() printf(BUTTON_SUPER,"true", '+') #define BUTTON_MINUS_SUPER() printf(BUTTON_SUPER,"false",'-') #else///ifndef BUTTONS_BY_CSS - #define PM_BUTTON_GLOBAL "<IMG height=18 width=18 onclick=\"superT.plusMinus(%s);\" id='btn_%s' src='../images/%s'>" + #define PM_BUTTON_GLOBAL "<IMG height=18 width=18 onclick=\"superT.plusMinus(%s);\" " \ + "id='btn_%s' src='../images/%s'>" #define BUTTON_PLUS_SUPER() printf(PM_BUTTON_GLOBAL,"true", "plus_all", "add_sm.gif") #define BUTTON_MINUS_SUPER() printf(PM_BUTTON_GLOBAL,"false","minus_all","remove_sm.gif") #endif///ndef BUTTONS_BY_CSS jsIncludeFile("hui.js",NULL); #endif///def SUPERS_WITH_CHECKBOXES printf("\n<P><TABLE CELLPADDING=2>"); tdbRefSortPrioritiesFromCart(cart, &superTdb->children); struct slRef *childRef; for (childRef = superTdb->children; childRef != NULL; childRef = childRef->next) { struct trackDb *tdb = childRef->val; #ifdef SUPERS_WITH_CHECKBOXES if (childRef == superTdb->children) // first time through { printf("\n<TR><TD NOWRAP colspan=2>"); BUTTON_PLUS_SUPER(); BUTTON_MINUS_SUPER(); printf(" <B>All</B><BR>"); printf("</TD></TR>\n"); } printf("<TR><TD NOWRAP>"); if (!tdbIsDownloadsOnly(tdb)) { - enum trackVisibility tv = hTvFromString(cartUsualString(cart, tdb->track,hStringFromTv(tdb->visibility))); + enum trackVisibility tv = + hTvFromString(cartUsualString(cart, tdb->track,hStringFromTv(tdb->visibility))); // Don't use cheapCgi code... no name and no boolshad... just js - printf("<INPUT TYPE=CHECKBOX id='%s' onchange='superT.childChecked(this);'%s>",tdb->track,(tv != tvHide?" CHECKED":"")); + printf("<INPUT TYPE=CHECKBOX id='%s' onchange='superT.childChecked(this);'%s>", + tdb->track,(tv != tvHide?" CHECKED":"")); hTvDropDownClassVisOnlyAndExtra(tdb->track, tv, tdb->canPack, (tv == tvHide ? "hiddenText":"normalText"), trackDbSetting(tdb, "onlyVisibility"), "onchange='superT.selChanged(this);'"); printf("</TD>\n<TD>"); - printf("<A HREF='%s?%s=%u&c=%s&g=%s' onclick='return superT.submitAndLink(this);'>%s</A> ", - (tdbIsDownloadsOnly(tdb)? hgFileUiName(): hgTrackUiName()), + printf("<A HREF='%s?%s=%u&c=%s&g=%s' onclick='return superT.submitAndLink(this);'>" + "%s</A> ", (tdbIsDownloadsOnly(tdb)? hgFileUiName(): hgTrackUiName()), cartSessionVarName(), cartSessionId(cart), chromosome, cgiEncode(tdb->track), tdb->shortLabel); } else { printf("<A HREF='%s?%s=%u&g=%s'>Downloads</A>", hgFileUiName(),cartSessionVarName(), cartSessionId(cart), cgiEncode(tdb->track)); printf("</TD>\n<TD>"); printf("%s ",tdb->shortLabel); } printf("</TD>\n"); #else///ifndef SUPERS_WITH_CHECKBOXES printf("<TR><TD NOWRAP>"); if (tdbIsDownloadsOnly(tdb)) printf("%s ",tdb->shortLabel); else printf("<A HREF='%s?%s=%u&c=%s&g=%s'>%s</A> ", (tdbIsDownloadsOnly(tdb)? hgFileUiName(): hgTrackUiName()), cartSessionVarName(), cartSessionId(cart), chromosome, cgiEncode(tdb->track), tdb->shortLabel); printf("</TD><TD>"); if (tdbIsDownloadsOnly(tdb)) { printf("<A HREF='%s?%s=%u&g=%s'>Downloads</A>", hgFileUiName(),cartSessionVarName(), cartSessionId(cart), cgiEncode(tdb->track)); } else { enum trackVisibility tv = - hTvFromString(cartUsualString(cart, tdb->track, - hStringFromTv(tdb->visibility))); + hTvFromString(cartUsualString(cart, tdb->track, hStringFromTv(tdb->visibility))); hTvDropDownClassVisOnly(tdb->track, tv, tdb->canPack, tv == tvHide ? "hiddenText" : "normalText", trackDbSetting(tdb, "onlyVisibility")); } #endif///ndef SUPERS_WITH_CHECKBOXES printf("<TD>%s", tdb->longLabel); char *dataVersion = trackDbSetting(tdb, "dataVersion"); if (dataVersion) printf("  <EM style='color:#666666; font-size:smaller;'>%s</EM>", dataVersion); printf("</TD></TR>"); } printf("</TABLE>"); } void previewLinks(char *db, struct trackDb *tdb) @@ -2641,39 +2649,40 @@ else if (tdb->type != NULL) { // NOTE for developers: please avoid special cases and use cfgTypeFromTdb//cfgByCfgType() // When you do, then multi-view cfg and subtrack cfg will work. eCfgType cType = cfgTypeFromTdb(tdb,FALSE); if (cType != cfgNone) { cfgByCfgType(cType,database, cart, tdb,tdb->track, NULL, boxed); } // NOTE: these cases that fall through the cracks should probably get folded into cfgByCfgType() else if (startsWithWord("expRatio", tdb->type)) expRatioUi(tdb); else if (startsWith("chromGraph", tdb->type)) chromGraphUi(tdb); else if (startsWith("sample", tdb->type)) genericWiggleUi(tdb,7); - else if (startsWithWord("array",tdb->type)) /* not quite the same as an "expRatio" type (custom tracks) */ + else if (startsWithWord("array",tdb->type)) // not quite the same as "expRatio" (custom tracks) expRatioCtUi(tdb); else if (startsWithWord("factorSource",tdb->type)) factorSourceUi(database,tdb); } if (!ajax) // ajax asks for a simple cfg dialog for right-click popup or hgTrackUi subtrack cfg { - // Composites *might* have had their top level controls just printed, but almost certainly have additional controls + // Composites *might* have had their top level controls just printed, + // but almost certainly have additional controls if (tdbIsComposite(tdb)) // for the moment generalizing this to include other containers... hCompositeUi(database, cart, tdb, NULL, NULL, MAIN_FORM); // Additional special case navigation links may be added previewLinks(database, tdb); extraUiLinks(database,tdb); } } #ifdef UNUSED static void findSuperChildrenAndSettings(struct trackDb *tdbList, struct trackDb *super) /* Find the tracks that have super as a parent and stuff references to them on * super's children list. Also do some visibility and parentName futzing. */ { struct trackDb *tdb; @@ -2708,35 +2717,37 @@ // {track}.{varName}... ( One exception supported: {track}_sel ). if (trackDbLocalSetting(tdb, "container")) { /* For the moment, be a composite... */ tdbMarkAsComposite(tdb); } if (ajax && cartOptionalString(cart, "descriptionOnly")) { //struct trackDb *tdbParent = tdbFillInAncestry(cartString(cart, "db"),tdb); if (tdb->html != NULL && tdb->html[0] != 0) puts(tdb->html); else { struct trackDb *tdbParent = tdb->parent; - for (;tdbParent && (tdbParent->html == NULL || tdbParent->html[0] == 0); tdbParent = tdbParent->parent ) + for (;tdbParent && (tdbParent->html == NULL || tdbParent->html[0] == 0); + tdbParent = tdbParent->parent ) ; // Get the first parent that has html if (tdbParent != NULL && tdbParent->html != NULL && tdbParent->html[0]) { - printf("<h2 style='color:%s'>Retrieved from %s Track...</h2>\n",COLOR_DARKGREEN,tdbParent->shortLabel); + printf("<h2 style='color:%s'>Retrieved from %s Track...</h2>\n", + COLOR_DARKGREEN,tdbParent->shortLabel); puts(tdbParent->html); } else printf("<h2>No description found for: %s.</h2>",tdbParent?tdbParent->track:tdb->track); } cartRemove(cart,"descriptionOnly"); // This is a once only request and should be deleted return; } if(tdbIsContainer(tdb)) { safef(setting,sizeof(setting),"%s.%s",tdb->track,RESET_TO_DEFAULTS); // NOTE: if you want track vis to not be reset, move to after vis dropdown if (1 == cartUsualInt(cart, setting, 0)) cartRemoveAllForTdbAndChildren(cart,tdb); else if (!ajax) // Overkill on !ajax, because ajax shouldn't be called for a composite @@ -2756,54 +2767,62 @@ if (ensVersionString[0]) { if (ensDateReference[0] && differentWord("current", ensDateReference)) safef(longLabel, sizeof(longLabel), "Ensembl Gene Predictions - archive %s - %s", ensVersionString, ensDateReference); else safef(longLabel, sizeof(longLabel), "Ensembl Gene Predictions - %s", ensVersionString); } else safef(longLabel, sizeof(longLabel), "%s", tdb->longLabel); printf("<B style='font-family:serif; font-size:200%%;'>%s%s</B>\n", longLabel, tdbIsSuper(tdb) ? " Tracks" : ""); } else { if (trackDbSetting(tdb, "wgEncode")) - printf("<A HREF='/ENCODE/index.html'><IMG style='vertical-align:middle;' width=100 src='/images/ENCODE_scaleup_logo.png'><A>"); + printf("<A HREF='/ENCODE/index.html'><IMG style='vertical-align:middle;' " + "width=100 src='/images/ENCODE_scaleup_logo.png'><A>"); printf("<B style='font-family:serif; font-size:200%%;'>%s%s</B>\n", tdb->longLabel, tdbIsSuper(tdb) ? " Tracks" : ""); } /* Print link for parent track */ if (!ajax) { if (tdb->parent) { char *encodedMapName = cgiEncode(tdb->parent->track); - printf(" <B style='font-family:serif; font-size:100%%;'>(<A HREF=\"%s?%s=%u&c=%s&g=%s\" title='Link to parent track'><IMG height=12 src='../images/ab_up.gif'>%s</A>)</B>", + printf(" <B style='font-family:serif; font-size:100%%;'>" + "(<A HREF=\"%s?%s=%u&c=%s&g=%s\" title='Link to parent track'>" + "<IMG height=12 src='../images/ab_up.gif'>%s</A>)</B>", hgTrackUiName(), cartSessionVarName(), cartSessionId(cart), chromosome, encodedMapName, tdb->parent->shortLabel); freeMem(encodedMapName); } else { struct grp *grp, *grps = hLoadGrps(database); for (grp = grps; grp != NULL; grp = grp->next) { if (sameString(grp->name,tdb->grp)) { - printf(" <B style='font-family:serif; font-size:100%%;'>(<A HREF=\"%s?%s=%u&c=%s&hgTracksConfigPage=configure&hgtgroup_%s_close=0#%sGroup\" title='%s tracks in track configuration page'><IMG height=12 src='../images/ab_up.gif'>All %s%s</A>)</B>", - hgTracksName(), cartSessionVarName(), cartSessionId(cart),chromosome,tdb->grp,tdb->grp,grp->label,grp->label,endsWith(grp->label," Tracks")?"":" tracks"); + printf(" <B style='font-family:serif; font-size:100%%;'>" + "(<A HREF=\"%s?%s=%u&c=%s&hgTracksConfigPage=configure" + "&hgtgroup_%s_close=0#%sGroup\" title='%s tracks in track configuration " + "page'><IMG height=12 src='../images/ab_up.gif'>All %s%s</A>)</B>", + hgTracksName(), cartSessionVarName(), cartSessionId(cart),chromosome, + tdb->grp,tdb->grp,grp->label,grp->label, + endsWith(grp->label," Tracks")?"":" tracks"); break; } } grpFreeList(&grps); } } puts("<BR><BR>"); if (ct && sameString(tdb->type, "maf")) tdb->canPack = TRUE; else if (sameString(tdb->track, WIKI_TRACK_TABLE)) // special case wikiTrack (there's no trackDb entry); fixes redmine 2395 tdb->canPack = TRUE; // Don't bother with vis controls for downloadsOnly @@ -2813,141 +2832,152 @@ if (tdbIsComposite(tdb) && multViewCount(tdb) > 0) printf("<B>Maximum display mode: </B>"); else printf("<B>Display mode: </B>"); if (tdbIsSuper(tdb)) { superTrackDropDown(cart, tdb, 1); } else { /* normal visibility control dropdown */ enum trackVisibility vis = tdb->visibility; boolean canPack = rTdbTreeCanPack(tdb); if (ajax) { - vis = tdbVisLimitedByAncestry(cart, tdb, TRUE); // ajax popups should show currently inherited visability + // ajax popups should show currently inherited visability + vis = tdbVisLimitedByAncestry(cart, tdb, TRUE); // composite children may inherit squish/pack vis so allow it. if (canPack == FALSE && tdbIsCompositeChild(tdb)) canPack = rTdbTreeCanPack(tdbGetComposite(tdb)); } - else - vis = hTvFromString(cartUsualString(cart,tdb->track, hStringFromTv(vis))); // But hgTrackUi page should show local vis + else // But hgTrackUi page should show local vis + vis = hTvFromString(cartUsualString(cart,tdb->track, hStringFromTv(vis))); if (tdbIsSuperTrackChild(tdb)) { hTvDropDownClassVisOnlyAndExtra(tdb->track,vis,canPack, "normalText superChild visDD", trackDbSetting(tdb, "onlyVisibility"), "onchange='visTriggersHiddenSelect(this);'"); } else hTvDropDownClassVisOnlyAndExtra(tdb->track,vis,canPack, "normalText visDD", trackDbSetting(tdb, "onlyVisibility"),NULL); } + if (!ajax) { printf(" "); cgiMakeButton("Submit", "Submit"); // Offer cancel button always? // composites and multiTracks (not standAlones or supers) if (tdbIsContainer(tdb)) { printf(" "); cgiMakeOnClickButton("window.history.back();","Cancel"); } if(tdbIsComposite(tdb)) - printf("\n <a href='#' onclick='setVarAndPostForm(\"%s\",\"1\",\"mainForm\"); return false;'>Reset to defaults</a>\n",setting); + printf("\n <a href='#' " + "onclick='setVarAndPostForm(\"%s\",\"1\",\"mainForm\"); " + "return false;'>Reset to defaults</a>\n",setting); } if (ct) { puts(" "); cgiMakeButton(CT_DO_REMOVE_VAR, "Remove custom track"); cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track); puts(" "); if (differentString(tdb->type, "chromGraph")) { char buf[256]; if(ajax) - // reference to a separate form doesn't work in modal dialog, so change window.location directly. - safef(buf, sizeof(buf), "window.location='%s?hgsid=%d&%s=%s';return false;", hgCustomName(), cartSessionId(cart), CT_SELECTED_TABLE_VAR, tdb->track); + // reference to a separate form doesn't work in modal dialog, + // so change window.location directly. + safef(buf, sizeof(buf), "window.location='%s?hgsid=%d&%s=%s';return false;", + hgCustomName(), cartSessionId(cart), CT_SELECTED_TABLE_VAR, tdb->track); else safef(buf, sizeof(buf), "document.customTrackForm.submit();return false;"); cgiMakeOnClickButton(buf, "Update custom track"); } } } if (!tdbIsSuper(tdb) && !tdbIsDownloadsOnly(tdb) && !ajax) { // NAVLINKS - For pages w/ matrix, add Description, Subtracks and Downloads links - if (trackDbSetting(tdb, "dimensions") || (trackDbSetting(tdb, "wgEncode") && tdbIsComposite(tdb))) + if (trackDbSetting(tdb, "dimensions") + || (trackDbSetting(tdb, "wgEncode") && tdbIsComposite(tdb))) { printf("\n <span id='navDown' style='float:right; display:none;'>"); if (trackDbSetting(tdb, "wgEncode")) { if (!hIsPreviewHost()) { // TODO: get from hui.c - printf("<A TARGET=_BLANK HREF='http://%s/cgi-bin/hgTrackUi?db=%s&g=%s' TITLE='Early access to unreviewed new data on the Preview Browser...'>Preview</A>", - "genome-preview.ucsc.edu", database, tdb->track); + printf("<A TARGET=_BLANK HREF='http://%s/cgi-bin/hgTrackUi?db=%s&g=%s' " + "TITLE='Early access to unreviewed new data on the Preview Browser...'>" + "Preview</A>", "genome-preview.ucsc.edu", database, tdb->track); } printf(" "); makeDownloadsLink(database, tdb); } char *downArrow = "⇓"; enum browserType browser = cgiBrowser(); if (browser == btIE || browser == btFF) downArrow = "↓"; - printf(" <A HREF='#DISPLAY_SUBTRACKS' TITLE='Jump to subtracks section of page'>Subtracks%s</A>",downArrow); - printf(" <A HREF='#TRACK_HTML' TITLE='Jump to description section of page'>Description%s</A>",downArrow); + printf(" <A HREF='#DISPLAY_SUBTRACKS' TITLE='Jump to subtracks section of " + "page'>Subtracks%s</A>",downArrow); + printf(" <A HREF='#TRACK_HTML' TITLE='Jump to description section of page'>" + "Description%s</A>",downArrow); printf(" </span>"); } } if (!tdbIsSuperTrack(tdb) && !tdbIsComposite(tdb)) puts("<BR>"); -if (tdbIsDownloadsOnly(tdb)) - filesDownloadUi(database,cart,tdb); // Composites without tracks but with files to download are tdb->type: downloadsOnly +if (tdbIsDownloadsOnly(tdb)) // Composites without tracks but with files to download + filesDownloadUi(database,cart,tdb); // are tdb->type: downloadsOnly else specificUi(tdb, tdbList, ct, ajax); puts("</FORM>"); if (ajax) return; if (ct) { /* hidden form for custom tracks CGI */ printf("<FORM ACTION='%s' NAME='customTrackForm'>", hgCustomName()); cartSaveSession(cart); cgiMakeHiddenVar(CT_SELECTED_TABLE_VAR, tdb->track); puts("</FORM>\n"); if (ct->bbiFile) { time_t timep = bbiUpdateTime(ct->bbiFile); printBbiUpdateTime(&timep); } else printUpdateTime(CUSTOM_TRASH, ct->tdb, ct); } if (!ct) { /* Print data version trackDB setting, if any */ struct trackVersion *trackVersion = getTrackVersion(database, tdb->track); - char *version = trackVersion == NULL ? trackDbSetting(tdb, "dataVersion") : trackVersion->version; + char *version = trackVersion == NULL ? trackDbSetting(tdb, "dataVersion") + : trackVersion->version; if (version) { cgiDown(0.7); printf("<B>Data version:</B> %s <BR>\n", version); } /* Print lift information from trackDb, if any */ trackDbPrintOrigAssembly(tdb, database); printUpdateTime(database, tdb, NULL); } if (tdb->html != NULL && tdb->html[0] != 0) { char *browserVersion;