" "\n"
" " "\n"
" " "\n"
" " "\n"
" " "\n"
" "
);
htmlTextOut(textOutBuf);
puts(
" | " "\n"
" | " "\n"
" | " "\n"
" " "\n"
);
};
webPushErrHandlers();
/* set the flag */
webHeadAlreadyOutputed = TRUE;
} /* static void webStartWrapperDetailedInternal() */
void webStartWrapperDetailedArgs(struct cart *theCart, char *db,
char *headerText, char *format, va_list args, boolean withHttpHeader,
boolean withLogo, boolean skipSectionHeader, boolean withHtmlHeader)
/* output a CGI and HTML header with the given title in printf format */
{
char textOutBuf[1024];
va_list argscp;
va_copy(argscp,args);
vasafef(textOutBuf, sizeof(textOutBuf), format, argscp);
va_end(argscp);
webStartWrapperDetailedInternal(theCart, db, headerText, textOutBuf,
withHttpHeader, withLogo, skipSectionHeader, withHtmlHeader);
}
void webStartWrapperDetailedNoArgs(struct cart *theCart, char *db,
char *headerText, char *format, boolean withHttpHeader,
boolean withLogo, boolean skipSectionHeader, boolean withHtmlHeader)
/* output a CGI and HTML header with the given title in printf format */
{
char textOutBuf[512];
safecpy(textOutBuf, sizeof(textOutBuf), format);
webStartWrapperDetailedInternal(theCart, db, headerText, textOutBuf,
withHttpHeader, withLogo, skipSectionHeader, withHtmlHeader);
}
void webStartWrapperGatewayHeader(struct cart *theCart, char *db,
char *headerText, char *format, va_list args, boolean withHttpHeader,
boolean withLogo, boolean skipSectionHeader)
{
webStartWrapperDetailedArgs(theCart, db, headerText, format, args, withHttpHeader,
withLogo, skipSectionHeader, TRUE);
}
void webStartWrapperGateway(struct cart *theCart, char *db, char *format, va_list args, boolean withHttpHeader, boolean withLogo, boolean skipSectionHeader)
/* output a CGI and HTML header with the given title in printf format */
{
webStartWrapperGatewayHeader(theCart, db, "", format, args, withHttpHeader,
withLogo, skipSectionHeader);
}
void webStartWrapper(struct cart *theCart, char *db, char *format, va_list args, boolean withHttpHeader, boolean withLogo)
/* allows backward compatibility with old webStartWrapper that doesn't contain the "skipHeader" arg */
/* output a CGI and HTML header with the given title in printf format */
{
webStartWrapperGatewayHeader(theCart, db, "", format, args, withHttpHeader,
withLogo, FALSE);
}
void webStart(struct cart *theCart, char *db, char *format, ...)
/* Print out pretty wrapper around things when not
* from cart. */
{
va_list args;
va_start(args, format);
webStartWrapper(theCart, db, format, args, TRUE, TRUE);
va_end(args);
}
void webStartHeader(struct cart *theCart, char *db, char *headerText, char *format, ...)
/* Print out pretty wrapper around things when not from cart.
* Include headerText in the html header. */
{
va_list args;
va_start(args, format);
webStartWrapperGatewayHeader(theCart, db, headerText, format, args, TRUE, TRUE,
FALSE);
va_end(args);
}
static void webEndSection()
/* Close down a section */
{
puts(
"" "\n"
" | | " "\n"
// " "
" | " "\n"
" | " "\n"
" " );
}
void webNewSection(char* format, ...)
/* create a new section on the web page */
{
va_list args;
va_start(args, format);
webEndSection();
puts("");
puts(
" " "\n"
"" "\n"
" " "\n"
" " "\n"
" " "\n"
" " "\n"
" "
);
vprintf(format, args);
puts(
" | " "\n"
" | " "\n"
" | " "\n"
"" "\n"
);
va_end(args);
}
void webEndSectionTables()
/* Finish with section tables (but don't do /BODY /HTML lik
* webEnd does. */
{
webEndSection();
puts(" | \n");
}
void webEnd()
/* output the footer of the HTML page */
{
if(!webInTextMode)
{
webEndSectionTables();
#ifndef GBROWSE
googleAnalytics();
#endif /* GBROWSE */
puts( "");
webPopErrHandlers();
}
}
void webVaWarn(char *format, va_list args)
/* Warning handler that closes out page and stuff in
* the fancy form. */
{
boolean needStart = !webHeadAlreadyOutputed;
if (needStart)
webStart(errCart, NULL, "Error");
htmlVaWarn(format, args);
printf("\n\n");
printf("\n\n");
if (needStart)
webEnd();
}
void webAbort(char* title, char* format, ...)
/* an abort function that outputs a error page */
{
va_list args;
va_start(args, format);
/* output the header */
if(!webHeadAlreadyOutputed)
webStart(errCart, NULL, title);
/* in text mode, have a different error */
if(webInTextMode)
printf("\n\n\n %s\n\n", title);
vprintf(format, args);
printf("\n");
printf("\n\n");
webEnd();
va_end(args);
exit(0);
}
void printCladeListHtml(char *genome, char *onChangeText)
/* Make an HTML select input listing the clades. */
{
struct sqlConnection *conn = hConnectCentral();
struct sqlResult *sr = NULL;
char **row = NULL;
char *clades[128];
char *labels[128];
char *defaultClade = hClade(genome);
char *defaultLabel = NULL;
int numClades = 0;
sr = sqlGetResult(conn, "select name, label from clade order by priority");
while ((row = sqlNextRow(sr)) != NULL)
{
clades[numClades] = cloneString(row[0]);
labels[numClades] = cloneString(row[1]);
if (sameWord(defaultClade, clades[numClades]))
defaultLabel = clades[numClades];
numClades++;
if (numClades >= ArraySize(clades))
internalErr();
}
cgiMakeDropListFull(cladeCgiName, labels, clades, numClades,
defaultLabel, onChangeText);
}
static void printSomeGenomeListHtmlNamedMaybeCheck(char *customOrgCgiName,
char *db, struct dbDb *dbList, char *onChangeText, boolean doCheck)
/* Prints to stdout the HTML to render a dropdown list
* containing a list of the possible genomes to choose from.
* param db - a database whose genome will be the default genome.
* If NULL, no default selection.
* param onChangeText - Optional (can be NULL) text to pass in
* any onChange javascript. */
{
char *orgList[1024];
int numGenomes = 0;
struct dbDb *cur = NULL;
struct hash *hash = hashNew(10); // 2^^10 entries = 1024
char *selGenome = hGenomeOrArchive(db);
char *values [1024];
char *cgiName;
for (cur = dbList; cur != NULL; cur = cur->next)
{
if (!hashFindVal(hash, cur->genome) &&
(!doCheck || sqlDatabaseExists(cur->name)))
{
hashAdd(hash, cur->genome, cur);
orgList[numGenomes] = cur->genome;
values[numGenomes] = cur->genome;
numGenomes++;
if (numGenomes >= ArraySize(orgList))
internalErr();
}
}
cgiName = (customOrgCgiName != NULL) ? customOrgCgiName : orgCgiName;
cgiMakeDropListFull(cgiName, orgList, values, numGenomes,
selGenome, onChangeText);
hashFree(&hash);
}
void printSomeGenomeListHtmlNamed(char *customOrgCgiName, char *db, struct dbDb *dbList, char *onChangeText)
/* Prints to stdout the HTML to render a dropdown list
* containing a list of the possible genomes to choose from.
* param db - a database whose genome will be the default genome.
* If NULL, no default selection.
* param onChangeText - Optional (can be NULL) text to pass in
* any onChange javascript. */
{
return printSomeGenomeListHtmlNamedMaybeCheck(customOrgCgiName, db, dbList,
onChangeText, TRUE);
}
void printLiftOverGenomeList(char *customOrgCgiName, char *db,
struct dbDb *dbList, char *onChangeText)
/* Prints to stdout the HTML to render a dropdown list
* containing a list of the possible genomes to choose from.
* Databases in dbList do not have to exist.
* param db - a database whose genome will be the default genome.
* If NULL, no default selection.
* param onChangeText - Optional (can be NULL) text to pass in
* any onChange javascript. */
{
return printSomeGenomeListHtmlNamedMaybeCheck(customOrgCgiName, db, dbList,
onChangeText, FALSE);
}
void printSomeGenomeListHtml(char *db, struct dbDb *dbList, char *onChangeText)
/* Prints the dropdown list using the orgCgiName */
{
printSomeGenomeListHtmlNamed(NULL, db, dbList, onChangeText);
}
void printGenomeListHtml(char *db, char *onChangeText)
/* Prints to stdout the HTML to render a dropdown list
* containing a list of the possible genomes to choose from.
* param db - a database whose genome will be the default genome.
* If NULL, no default selection.
* param onChangeText - Optional (can be NULL) text to pass in
* any onChange javascript. */
{
printSomeGenomeListHtml(db, hGetIndexedDatabases(), onChangeText);
}
void printBlatGenomeListHtml(char *db, char *onChangeText)
/* Prints to stdout the HTML to render a dropdown list
* containing a list of the possible genomes to choose from.
* param db - a database whose genome will be the default genome.
* If NULL, no default selection.
* param onChangeText - Optional (can be NULL) text to pass in
* any onChange javascript. */
{
printSomeGenomeListHtml(db, hGetBlatIndexedDatabases(), onChangeText);
}
void printGenomeListForCladeHtml(char *db, char *onChangeText)
/* Prints to stdout the HTML to render a dropdown list containing
* a list of the possible genomes from selOrganism's clade to choose from.
* selOrganism is the default for the select.
*/
{
printSomeGenomeListHtml(db, hGetIndexedDatabasesForClade(db), onChangeText);
}
void printAllAssemblyListHtmlParm(char *db, struct dbDb *dbList,
char *dbCgi, bool allowInactive, char *javascript)
/* Prints to stdout the HTML to render a dropdown list containing the list
* of assemblies for the current genome to choose from. By default,
* this includes only active assemblies with a database (with the
* exception of the default assembly, which will be included even
* if it isn't active).
* param db - The default assembly (the database name) to choose as selected.
* If NULL, no default selection.
* param allowInactive - if set, print all assemblies for this genome,
* even if they're inactive or have no database
*/
{
char *assemblyList[128];
char *values[128];
int numAssemblies = 0;
struct dbDb *cur = NULL;
char *genome = hGenomeOrArchive(db);
char *selAssembly = NULL;
if (genome == NULL)
#ifdef LOWELAB
genome = "Pyrococcus furiosus";
#else
genome = "Human";
#endif
for (cur = dbList; cur != NULL; cur = cur->next)
{
/* Only for this genome */
if (!sameWord(genome, cur->genome))
continue;
/* Save a pointer to the current assembly */
if (sameWord(db, cur->name))
selAssembly = cur->name;
if (allowInactive ||
((cur->active || sameWord(cur->name, db))
&& sqlDatabaseExists(cur->name)))
{
assemblyList[numAssemblies] = cur->description;
values[numAssemblies] = cur->name;
numAssemblies++;
if (numAssemblies >= ArraySize(assemblyList))
internalErr();
}
}
cgiMakeDropListFull(dbCgi, assemblyList, values, numAssemblies,
selAssembly, javascript);
}
void printSomeAssemblyListHtmlParm(char *db, struct dbDb *dbList,
char *dbCgi, char *javascript)
/* Find all the assemblies from the list that are active.
* Prints to stdout the HTML to render a dropdown list containing the list
* of the possible assemblies to choose from.
* param db - The default assembly (the database name) to choose as selected.
* If NULL, no default selection. */
{
printAllAssemblyListHtmlParm(db, dbList, dbCgi, TRUE, javascript);
}
void printSomeAssemblyListHtml(char *db, struct dbDb *dbList, char *javascript)
/* Find all assemblies from the list that are active, and print
* HTML to render dropdown list
* param db - default assembly. If NULL, no default selection */
{
printSomeAssemblyListHtmlParm(db, dbList, dbCgiName, javascript);
}
void printAssemblyListHtml(char *db, char *javascript)
/* Find all the assemblies that pertain to the selected genome
* Prints to stdout the HTML to render a dropdown list containing
* a list of the possible assemblies to choose from.
* Param db - The assembly (the database name) to choose as selected.
* If NULL, no default selection. */
{
struct dbDb *dbList = hGetIndexedDatabases();
printSomeAssemblyListHtml(db, dbList, javascript);
}
void printAssemblyListHtmlExtra(char *db, char *javascript)
{
/* Find all the assemblies that pertain to the selected genome
Prints to stdout the HTML to render a dropdown list containing a list of the possible
assemblies to choose from.
param curDb - The assembly (the database name) to choose as selected.
If NULL, no default selection.
*/
struct dbDb *dbList = hGetIndexedDatabases();
printSomeAssemblyListHtmlParm(db, dbList, dbCgiName, javascript);
}
void printBlatAssemblyListHtml(char *db)
{
/* Find all the assemblies that pertain to the selected genome
Prints to stdout the HTML to render a dropdown list containing a list of the possible
assemblies to choose from.
param curDb - The assembly (the database name) to choose as selected.
If NULL, no default selection.
*/
struct dbDb *dbList = hGetBlatIndexedDatabases();
printSomeAssemblyListHtml(db, dbList, NULL);
}
void printOrgAssemblyListAxtInfo(char *dbCgi, char *javascript)
/* Find all the organisms/assemblies that are referenced in axtInfo,
* and print the dropdown list. */
{
struct dbDb *dbList = hGetAxtInfoDbs(dbCgi);
char *assemblyList[128];
char *values[128];
int numAssemblies = 0;
struct dbDb *cur = NULL;
char *assembly = cgiOptionalString(dbCgi);
char orgAssembly[256];
for (cur = dbList; ((cur != NULL) && (numAssemblies < 128)); cur = cur->next)
{
safef(orgAssembly, sizeof(orgAssembly), "%s %s",
cur->organism, cur->description);
assemblyList[numAssemblies] = cloneString(orgAssembly);
values[numAssemblies] = cur->name;
numAssemblies++;
}
#ifdef OLD
// Have to use the "menu" name, not the value, to mark selected:
if (assembly != NULL)
{
char *selOrg = hOrganism(assembly);
char *selFreeze = hFreezeFromDb(assembly);
safef(orgAssembly, sizeof(orgAssembly), "%s %s", selOrg, selFreeze);
assembly = cloneString(orgAssembly);
}
#endif /* OLD */
cgiMakeDropListFull(dbCgi, assemblyList, values, numAssemblies, assembly,
javascript);
}
static char *getDbForGenome(char *genome, struct cart *cart)
/*
Function to find the default database for the given Genome.
It looks in the cart first and then, if that database's Genome matches the
passed-in Genome, returns it. If the Genome does not match, it returns the default
database that does match that Genome.
param Genome - The Genome for which to find a database
param cart - The cart to use to first search for a suitable database name
return - The database matching this Genome type
*/
{
char *retDb = cartUsualString(cart, dbCgiName, NULL);
if ((retDb == NULL) || !hDbExists(retDb))
{
retDb = hDefaultDb();
}
/* If genomes don't match, then get the default db for that genome */
if (differentWord(genome, hGenome(retDb)))
{
retDb = hDefaultDbForGenome(genome);
}
return retDb;
}
void getDbGenomeClade(struct cart *cart, char **retDb, char **retGenome,
char **retClade, struct hash *oldVars)
/* Examine CGI and cart variables to determine which db, genome, or clade
* has been selected, and then adjust as necessary so that all three are
* consistent. Detect changes and reset db-specific cart variables.
* Save db, genome and clade in the cart so it will be consistent hereafter.
* The order of preference here is as follows:
* If we got a request that explicitly names the db, that takes
* highest priority, and we synch the organism to that db.
* If we get a cgi request for a specific organism then we use that
* organism to choose the DB. If just clade, go from there.
* In the cart only, we use the same order of preference.
* If someone requests an Genome we try to give them the same db as
* was in their cart, unless the Genome doesn't match.
*/
{
boolean gotClade = hGotClade();
*retDb = cgiOptionalString(dbCgiName);
*retGenome = cgiOptionalString(orgCgiName);
*retClade = cgiOptionalString(cladeCgiName);
/* Was the database passed in as a cgi param?
* If so, it takes precedence and determines the genome. */
if (*retDb && hDbExists(*retDb))
{
*retGenome = hGenome(*retDb);
}
/* If no db was passed in as a cgi param then was the organism (a.k.a. genome)
* passed in as a cgi param?
* If so, the we use the proper database for that genome. */
else if (*retGenome && !sameWord(*retGenome, "0"))
{
*retDb = getDbForGenome(*retGenome, cart);
*retGenome = hGenome(*retDb);
}
else if (*retClade && gotClade)
{
*retGenome = hDefaultGenomeForClade(*retClade);
*retDb = getDbForGenome(*retGenome, cart);
}
/* If no cgi params passed in then we need to inspect the session */
else
{
*retDb = cartOptionalString(cart, dbCgiName);
*retGenome = cartOptionalString(cart, orgCgiName);
*retClade = cartOptionalString(cart, cladeCgiName);
/* If there was a db found in the session that determines everything. */
if (*retDb && hDbExists(*retDb))
{
*retGenome = hGenome(*retDb);
}
else if (*retGenome && !sameWord(*retGenome, "0"))
{
*retDb = hDefaultDbForGenome(*retGenome);
}
else if (*retClade && gotClade)
{
*retGenome = hDefaultGenomeForClade(*retClade);
*retDb = getDbForGenome(*retGenome, cart);
}
/* If no organism in the session then get the default db and organism. */
else
{
*retDb = hDefaultDb();
*retGenome = hGenome(*retDb);
}
}
*retDb = cloneString(*retDb);
*retGenome = cloneString(*retGenome);
*retClade = hClade(*retGenome);
/* Detect change of database and reset db-specific cart variables: */
if (oldVars)
{
char *oldDb = hashFindVal(oldVars, "db");
char *oldOrg = hashFindVal(oldVars, "org");
char *oldClade = hashFindVal(oldVars, "clade");
if ((oldDb && differentWord(oldDb, *retDb)) ||
(oldOrg && differentWord(oldOrg, *retGenome)) ||
(oldClade && differentWord(oldClade, *retClade)))
{
/* Change position to default -- unless it was passed in via CGI: */
if (cgiOptionalString("position") == NULL)
cartSetString(cart, "position", hDefaultPos(*retDb));
/* hgNear search term -- unless it was passed in via CGI: */
if (cgiOptionalString("near_search") == NULL)
cartRemove(cart, "near_search");
/* hgBlat results (hgUserPsl track): */
cartRemove(cart, "ss");
/* hgTables correlate: */
cartRemove(cart, "hgta_correlateTrack");
cartRemove(cart, "hgta_correlateTable");
cartRemove(cart, "hgta_correlateGroup");
cartRemove(cart, "hgta_correlateOp");
cartRemove(cart, "hgta_nextCorrelateTrack");
cartRemove(cart, "hgta_nextCorrelateTable");
cartRemove(cart, "hgta_nextCorrelateGroup");
cartRemove(cart, "hgta_nextCorrelateOp");
cartRemove(cart, "hgta_corrWinSize");
cartRemove(cart, "hgta_corrMaxLimitCount");
}
}
/* Save db, genome (as org) and clade in cart. */
cartSetString(cart, "db", *retDb);
cartSetString(cart, "org", *retGenome);
if (gotClade)
cartSetString(cart, "clade", *retClade);
}
void getDbAndGenome(struct cart *cart, char **retDb, char **retGenome,
struct hash *oldVars)
/* Get just the db and genome. */
{
char *garbage = NULL;
getDbGenomeClade(cart, retDb, retGenome, &garbage, oldVars);
freeMem(garbage);
}
void webIncludeFile(char *file)
/* Include an HTML file in a CGI.
* The file path may begin with hDocumentRoot(); if it doesn't, it is
* assumed to be relative and hDocumentRoot() will be prepended. */
{
char *str = hFileContentsOrWarning(file);
puts(str);
freeMem(str);
}
void webIncludeHelpFile(char *fileRoot, boolean addHorizLine)
/* Given a help file root name (e.g. "hgPcrResult" or "cutters"),
* print out the contents of the file. If addHorizLine, print out an
* first. */
{
if (addHorizLine)
htmlHorizontalLine();
webIncludeFile(hHelpFile(fileRoot));
}
void webPrintLinkTableStart()
/* Print link table start in our colors. */
{
printf("\n");
printf("\n");
}
void webPrintLinkTableEnd()
/* Print link table end in our colors. */
{
printf(" \n");
printf(" | \n");
}
void webPrintLinkOutCellStart()
/* Print link cell that goes out of our site. End with
* webPrintLinkTableEnd. */
{
printf(" | ");
}
void webPrintWideCellStart(int colSpan, char *bgColorRgb)
/* Print link multi-column cell start in our colors. */
{
printf(" | 1)
printf(" COLSPAN=%d", colSpan);
printf(">");
}
void webPrintLinkCellStart()
/* Print link cell start in our colors. */
{
webPrintWideCellStart(1, HG_COL_TABLE);
}
void webPrintLinkCellRightStart()
/* Print right-justified cell start in our colors. */
{
printf(" | ");
}
void webPrintLinkCellEnd()
/* Print link cell end in our colors. */
{
printf(" | ");
}
void webPrintLinkCell(char *link)
/* Print link cell in our colors, if links is null, print empty cell */
{
webPrintLinkCellStart();
if (link != NULL)
puts(link);
webPrintLinkCellEnd();
}
void webPrintIntCell(int val)
/* Print right-justified int cell in our colors. */
{
webPrintLinkCellRightStart();
printf("%d", val);
webPrintLinkCellEnd();
}
void webPrintDoubleCell(double val)
/* Print right-justified cell in our colors with two digits to right of decimal. */
{
webPrintLinkCellRightStart();
printf("%4.2f", val);
webPrintLinkCellEnd();
}
void webPrintWideLabelCell(char *label, int colSpan)
/* Print label cell over multiple columns in our colors. */
{
printf(" 1)
printf(" COLSPAN=%d", colSpan);
printf(">%s | ", label);
}
void webPrintWideCenteredLabelCell(char *label, int colSpan)
/* Print label cell over multiple columns in our colors and centered. */
{
printf(" 1)
printf(" COLSPAN=%d", colSpan);
printf(">%s | ", label);
}
void webPrintLabelCell(char *label)
/* Print label cell in our colors. */
{
webPrintWideLabelCell(label, 1);
}
void webPrintLinkTableNewRow()
/* start a new row */
{
printf(" \n");
}
void finishPartialTable(int rowIx, int itemPos, int maxPerRow,
void (*cellStart)())
/* Fill out partially empty last row. */
{
if (rowIx != 0 && itemPos < maxPerRow)
{
int i;
for (i=itemPos; i
|
|