src/hg/near/hgNear/hgNear.h 1.100

1.100 2010/05/07 03:37:41 galt
using htmlEncode via new function hPrintEncodeNonBreak to protect against problems with <>;" in output, problem was recently uncovered by hgNearTest
Index: src/hg/near/hgNear/hgNear.h
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/near/hgNear/hgNear.h,v
retrieving revision 1.99
retrieving revision 1.100
diff -b -B -U 1000000 -r1.99 -r1.100
--- src/hg/near/hgNear/hgNear.h	20 Nov 2009 19:17:35 -0000	1.99
+++ src/hg/near/hgNear/hgNear.h	7 May 2010 03:37:41 -0000	1.100
@@ -1,817 +1,820 @@
 /* hgNear.h - interfaces to plug columns into hgNear.  The must important
  * thing here is the column structure. */
 
 #ifndef HGNEAR_H
 #define HGNEAR_H
 
 #include "cart.h"
 
 #include "jksql.h"
 
 struct genePos
 /* A gene and optionally a position. */
     {
     struct genePos *next;
     char *name;		/* Gene (transcript) ID. */
     char *chrom;	/* Optional chromosome location. NULL ok. */
     int start;		/* Chromosome start. Disregarded if chrom == NULL. */
     int end;		/* End in chromosome. Disregarded if chrom == NULL. */
     char *protein;	/* Protein ID. */
     float distance;	/* Something to help sort on. */
     int count;		/* Something to count with. Not always set. */
     };
 #define genePosTooFar 1000000000	/* Definitely not in neighborhood. */
 
 #define KG_UNKNOWN 0
 #define KG_I       1
 #define KG_II      2
 #define KG_III     3
 extern int kgVersion;           /* KG version */
 
 int genePosCmpName(const void *va, const void *vb);
 /* Sort function to compare two genePos by name. */
 
 int genePosCmpPos(const void *va, const void *vb);
 /* Sort function to compare two genePos by chrom,start. */
 
 void genePosFillFrom5(struct genePos *gp, char **row);
 /* Fill in genePos from row containing ascii version of
  * name/chrom/start/end/protein. */
 
 struct searchResult
 /* A result from simple search - includes short and long names as well
  * as genePos. */
     {
     struct searchResult *next;
     char *shortLabel;		/* Short name (gene name) */
     char *longLabel;		/* Long name (gene description) */
     char *matchingId;		/* Matching id (may be NULL). */
     struct genePos gp;		/* Gene id. */
     };
 
 int searchResultCmpShortLabel(const void *va, const void *vb);
 /* Compare to sort based on short label. */
 
 struct column
 /* A column in the big table. The central data structure for
  * hgNear. */
    {
    /* Data set during initialization that is guaranteed to be in each column.  */
    struct column *next;		/* Next column. */
    char *name;			/* Column name, not allocated here. */
    char *shortLabel;		/* Column label. */
    char *longLabel;		/* Column description. */
    boolean on;			/* True if turned on. */
    boolean defaultOn;		/* On by default? */
    float priority;		/* Order displayed. */
    char *type;			/* Type - encodes which methods to used etc. */
    char *itemUrl;		/* printf formatted URL string for linking.
                                  * May be NULL.  Should contain one %s, which
 				 * get's filled in with whatever cellVal
 				 * returns. */
    char *itemUrlQuery;		/* SQL query. Does lookup from cellVal
     				 * to the desired value to use in itemUrl in
 				 * place of cellVal */
    boolean useHgsid;		/* Add hgsid= to itemUrl? */
    char *urlChromVar;		/* Chromosome var for URL. */
    char *urlStartVar;		/* Start var for URL. */
    char *urlEndVar;		/* End var for URL. */
    char *urlDbVar;		/* Database var for URL. */
    char *urlOtherGeneVar;	/* Variable for other (selected) gene. */
    struct hash *settings;	/* Settings from ra file. */
 
    /* -- Methods -- */
    boolean (*exists)(struct column *col, struct sqlConnection *conn);
    /* Return TRUE if column exists in database. */
 
    char *(*cellVal)(struct column *col, struct genePos *gp, 
    	struct sqlConnection *conn);
    /* Get value of one cell as string.  FreeMem this when done.  Note that
     * gp->chrom may be NULL legitimately. */
 
    void (*cellPrint)(struct column *col, struct genePos *gp, 
    	struct sqlConnection *conn);
    /* Print one cell of this column in HTML.  Note that gp->chrom may be 
     * NULL legitimately. */
 
    void (*labelPrint)(struct column *col);
    /* Print the label in the label row. */
 
    int (*tableColumns)(struct column *col);
    /* How many html columns this uses. */
 
    void (*configControls)(struct column *col);
    /* Print out configuration controls. */
 
    struct searchResult *(*simpleSearch)(struct column *col, 
    	struct sqlConnection *conn, char *search);
    /* Return list of genes with descriptions that match search. */
 
    void (*filterControls)(struct column *col, struct sqlConnection *conn);
    /* Print out controls for advanced filter. */
 
    struct genePos *(*advFilter)(struct column *col, struct sqlConnection *conn,
    	struct genePos *inputList);
    /* Return list of positions for advanced filter. */
 
    /* -- Data that may be column-specific. -- */
       /* Most columns that need any extra data at all use the next few fields. */
    char *table;			/* Name of associated table. */
    char *keyField;		/* GeneId field in associated table. */
    char *valField;		/* Value field in associated table. */
    boolean selfLink;		/* Put in link to self. */
 
       /* The distance type columns like homology need this field too. */
    char *curGeneField;		/* curGeneId field in associated table.  Used by distance columns*/
 
       /* The expression ratio type columns use the next bunch of fields as well as
        * the table/key/val fields above. */
    char *experimentTable;	/* Experiment table in hgFixed if any. */
    char *posTable;		/* Positional (bed12) for expression experiments. */
    double brightness;		/* What to scale by to get expression val from -1 to 1. */
    int representativeCount;	/* Count of representative experiments. */
    int *representatives;	/* Array (may be null) of representatives. */
    boolean expRatioUseBlue;	/* Use blue rather than red in expRatio. */
    boolean forceGrayscale;      /* Use grayscale no matter what and don't provide coloring option. */
 
        /* The expMulti (absolute and ratio) columns use these fields. */
    struct expMultiData *emdList;	/* List of all experiment display types. */
    struct expMultiData *emd;		/* Currently selected display type. */
    double expRatioScale;		/* 1/Maximum non-clipped expression ratio. */
    double expAbsScale;			/* 1/Maximum non-clipped absolute expression. */
    boolean expShowAbs;			/* Show absolute rather than ratio. */
 
       /* The GO column uses this. */
    struct sqlConnection *goConn;  /* Connection to go database. */
    char *goaIdColumn;		  /* Column to use in go.goaPart. */
 
    /* Association tables use this. */
    char *tablesUsed;	/* Space delimited list of tables. */
    char *queryFull;	/* Query that returns 2 columns key/value. */
    char *queryOne;	/* Query that returns value given key. */
    char *invQueryOne;	/* Query that returns key given value. */
    boolean protKey;	/* Use protein rather than geneId for key. */
    boolean weedDupes;	/* Weed out duplicates in display. */
 
    /* Pfam uses this. */
    char *protDb; /* Which protein database pfam tables are in. */
 
    /* intronSize uses this */
    char *whichIntron;	/* max/min/first ? */
 
    /* xzy users this. */
    boolean xyzItalics;	/* Draw template table italics. */
 
    /* Custom columns use this. */
    struct hash *customIdHash;	/* Hash filled with custom data, keyed by gene ID. */
    };
 
 struct expMultiData 
 /* Info on how to display expression data that can come in many forms. */
     {
     struct expMultiData *next;
     char *name;		/* Symbolic name. */
     char *shortLabel;	/* UI short label. */
     char *experimentTable;	/* Table of sample descriptions. */
     char *ratioTable;	/* Table of ratios. */
     char *absoluteTable;	/* Table of absolute expression values. */
     int representativeCount;	/* Count of representative experiments. */
     int *representatives;	/* Array of representatives. */
     };
 
 struct order
 /* A row order of the big table. */
     {
     struct order *next;	/* Next in list. */
     char *name;			/* Symbolic name, not allocated here. */
     char *shortLabel;		/* Short readable label. */
     char *longLabel;		/* Longer description. */
     char *type;			/* Type - encodes which methods to used etc. */
     float priority;		/* Order to display in. */
     struct hash *settings;	/* Settings from ra file. */
 
     boolean (*exists)(struct order *ord, struct sqlConnection *conn);
     /* Return TRUE if this ordering can be computed from available data. */
 
     void (*calcDistances)(struct order *ord, struct sqlConnection *conn, 
     	struct genePos **pGeneList, struct hash *geneHash, int maxCount);
     /* Fill in distance fields of first maxCount members of *pGeneList.
      * GeneHash and *pGeneList contain the same genes.  GeneHash is
      * keyed by gene->name. This function may reorder *pGeneList, 
      * though it will ultimately be sorted by distance. */
 
     /* -- Data that may be order-specific. -- */
     char *table;			/* Name of associated table. */
     char *keyField;		/* GeneId field in associated table. */
     char *valField;		/* Value field in associated table. */
     char *curGeneField;		/* curGeneId field in associated table. */
     float distanceMultiplier;	/* What to multiply valField by for distance. */
 
     /* Association tables. */
     char *tables;		/* List of all tables. */
     char *queryOne;		/* SQL to query on one gene. */
     char *queryAll;		/* SQL to query on all genes. */
     boolean protKey;		/* Use protein rather than mRNA ids. */
 
     /* Group tables. */
     char *groupField;		/* Group field in group table. */
     };
 
 struct order *orderGetAll(struct sqlConnection *conn);
 /* Return list of row orders available. */
 
 
 /* ---- global variables ---- */
 
 extern struct cart *cart; /* This holds variables between clicks. */
 extern char *database;	  /* Name of genome database - hg15, or the like. */
 extern char *genome;	  /* Name of organism - mouse, human, etc. */
 extern char *groupOn;	  /* Current grouping strategy. */
 extern int displayCount;  /* Number of items to display. */
 
 extern struct genePos *curGeneId;	  /* Identity of current gene. */
 extern struct hash *columnHash;		  /* Hash of active columns keyed by name. */
 
 /* ---- Cart Variables ---- */
 
 #define dbVarName "db"      /* Which assembly to use. */
 #define orgVarName "org"      /* Which organism to use. */
 #define confVarName "near.do.configure"	/* Configuration button */
 #define detailsVarName "near.do.details" /* Do details page. */
 #define orderInfoDoName "near.do.orderInfo" /* Put up order info page */
 #define countVarName "near.count"	/* How many items to display. */
 #define colInfoVarName "near.do.colInfo"	/* Display column info. */
 #define searchVarName "near_search"	
 	/* Search term - underbar for Javascript.  Hardcoded in Javascript. 
 	 * and in columnDb.ra. */
 #define idVarName "near.do.id"         	
 	/* Overrides searchVarName if it exists */
 #define idPosVarName "near.idPos"      	
 	/* chrN:X-Y position of id, may be empty. */
 #define groupVarName "near.group"	/* Grouping scheme. */
 
 #define orderVarName "near_order"	/* Ordering scheme. */
 	/* Search term - underbar for Javascript.  Hardcoded in Javascript. 
 	 * and in columnDb.ra. */
 
 #define getSeqVarName "near.do.getSeq"	/* Button to get sequence. */
 #define getGenomicSeqVarName "near.do.getGenomicSeq"	
 	/* Button to fetch genomic sequence. */
 #define getSeqHowVarName "near.getSeqHow" /* How to get sequence. */
 #define getSeqPageVarName "near.do.getSeqPage" /* Button go to getSequence page. */
 #define proUpSizeVarName "near.proUpSize" /* Promoter upstream size. */
 #define proDownSizeVarName "near.proDownSize" /* Promoter downstream size. */
 #define proIncludeFiveOnly "near.proIncludeFiveOnly" 
 	/* Include without 5' UTR? */
 #define getTextVarName "near.do.getText"	/* Button to get as text. */
 #define affineAliVarName "near.do.affineAli"  
 	/* Show alignment, in columnDb.ra as well. */
 
 #define advFilterPrefix "near.as."      
 	/* Prefix for advanced filter variables. */
 #define advFilterPrefixI "near.asi."    
 	/* Prefix for advanced filter variables not forcing search. */
 #define advFilterVarName "near.do.advFilter"      /* Advanced filter */
 #define advFilterClearVarName "near.do.advFilterClear" 
 	/* Advanced filter clear all button. */
 #define advFilterListVarName "near.do.advFilterList" 
 	/* Advanced filter submit list. */
 
 #define filSaveSettingsPrefix "near_filUserSet_" /* Prefix for filter sets. */
     /* Underbars on this one for sake of javascript. */
 #define filSaveCurrentVarName "near.do.filUserSet.save"   /* Save filter set. */
 #define filSavedCurrentVarName "near.do.filUserSet.saved" /* Saved filter set. */
 #define filUseSavedVarName "near.do.filUserSet.used"      /* Use filter set. */
 
 #define colConfigPrefix "near.col."     
 	/* Prefix for stuff set in configuration pages. */
 #define colOrderVar "near.colOrder"     /* Order of columns. */
 #define defaultConfName "near.do.colDefault"  /* Restore to default settings. */
 #define hideAllConfName "near.do.colHideAll"  /* Hide all columns. */
 #define showAllConfName "near.do.colShowAll"  /* Show all columns. */
 
 #define colSaveSettingsPrefix "near_colUserSet_"  /* Prefix for column sets. */
     /* Underbars on this one for sake of javascript. */
 #define saveCurrentConfName "near.do.colUserSet.save"   /* Save column set. */
 #define savedCurrentConfName "near.do.colUserSet.saved" /* Saved column set. */
 #define useSavedConfName "near.do.colUserSet.used"      /* Use column set. */
 
 #define showAllSpliceVarName "near.showAllSplice" 
 	/* Show all splice varients. */
 #define expRatioColorVarName "near.expRatioColors" 
 	/* Color scheme for expression ratios. */
 #define keyWordUploadPrefix "near.do.keyUp." /* Prefix for keyword uploads. */
 #define keyWordPastePrefix "near.do.keyPaste." /* Prefix for keyword paste-ins. */
 #define keyWordPastedPrefix "near.do.keyPasted." 
 	/* Prefix for keyword paste-ins. */
 #define keyWordClearPrefix "near.do.keyClear." /* Prefix for keyword paste-ins. */
 
 #define customFileVarName "near.customFile"  /* Temp file for custom columns. */
 #define customPageDoName "near.do.custom"   /* Put up custom column page. */
 #define customUploadDoName "near.do.customUpload" /* Custom upload file. */
 #define customUploadVarName "near.customUpload"
 #define customPasteDoName "near.do.customPaste"   /* Custom paste file. */
 #define customPasteVarName "near.customPaste"
 #define customFromUrlDoName "near.do.customFromUrl"   /* Custom from URL. */
 #define customFromUrlVarName "near.customFromUrl"
 #define customSubmitDoName "near.do.customSubmit" /* Custom submit data. */
 #define customClearDoName "near.do.customClear"   /* Custom clear data. */
 
 
 /* ---- General purpose helper routines. ---- */
 
 int genePosCmpName(const void *va, const void *vb);
 /* Sort function to compare two genePos by name. */
 
 boolean wildMatchAny(char *word, struct slName *wildList);
 /* Return TRUE if word matches any thing in wildList. */
 
 boolean wildMatchAll(char *word, struct slName *wildList);
 /* Return TRUE if word matches all things in wildList. */
 
 boolean wildMatchList(char *word, struct slName *wildList, boolean orLogic);
 /* Return TRUE if word matches things in wildList. */
 
 boolean anyRealInCart(struct cart *cart, char *wild);
 /* Return TRUE if variables are set matching wildcard. */
 
 void fixSafariSpaceInQuotes(char *s);
 /* Safari on the Mac changes a space (ascii 32) to a
  * ascii 160 if it's inside of a single-quote in a
  * text input box!?  This tuns it back to a 32. */
 
 char *mustFindInRaHash(char *fileName, struct hash *raHash, char *name);
 /* Look up in ra hash or die trying. */
 
 struct hash *readRa(char *rootName);
 /* Read in ra in root, root/org, and root/org/database. */
 
 char *genomeSetting(char *name);
 /* Return genome setting value.   Aborts if setting not found. */
 
 char *genomeOptionalSetting(char *name);
 /* Return genome setting value.  Returns NULL if not found. */
 
 char *protToGeneId(struct sqlConnection *conn, char *protId);
 /* Convert from protein to gene ID. */
 
 /* ---- Some html helper routines. ---- */
 
 void hvPrintf(char *format, va_list args);
 /* Print out some html. */
 
 void hPrintf(char *format, ...);
 /* Print out some html. */
 
 void hPrintNonBreak(char *s);
 /* Print out string but replace spaces with &nbsp; */
 
+void hPrintEncodedNonBreak(char *s);
+/* Print with htmlEncode and non-break */
+
 void makeTitle(char *title, char *helpName);
 /* Make title bar. */
 
 void controlPanelStart();
 /* Put up start of tables around a control panel. */
 
 void controlPanelEnd();
 /* Put up end of tables around a control panel. */
 
 void selfAnchorId(struct genePos *gp);
 /* Print self anchor to given id. */
 
 char *colInfoUrl(struct column *col);
 /* Return URL to get column info.  freeMem this when done. */
 
 void colInfoAnchor(struct column *col);
 /* Print anchor tag that leads to column info page. */
 
 void cellSelfLinkPrint(struct column *col, struct genePos *gp,
 	struct sqlConnection *conn);
 /* Print self and hyperlink to make this the search term. */
 
 void selfAnchorSearch(struct genePos *gp);
 /* Print self anchor to given search term. */
 
 /* -- Other helper routines. -- */
 
 int columnCmpPriority(const void *va, const void *vb);
 /* Compare to sort columns based on priority. */
 
 void columnVarsFromSettings(struct column *col, char *fileName);
 /* Grab a bunch of variables from col->settings and
  * move them into col proper. */
 
 void refinePriorities(struct hash *colHash);
 /* Consult colOrderVar if it exists to reorder priorities. */
 
 struct column *findNamedColumn(char *name);
 /* Return column of given name from list or NULL if none. */
 
 /* ---- Some helper routines for order methods. ---- */
 char *orderSetting(struct order *ord, char *name, char *defaultVal);
 /* Return value of named setting in order, or default if it doesn't exist. */
 
 char *orderRequiredSetting(struct order *ord, char *name);
 /* Return value of named setting.  Abort if it doesn't exist. */
 
 int orderIntSetting(struct order *ord, char *name, int defaultVal);
 /* Return value of named integer setting or default if it doesn't exist. */
 
 boolean orderSettingExists(struct order *ord, char *name);
 /* Return TRUE if setting exists in column. */
 
 /* ---- Some helper routines for column methods. ---- */
 
 char *columnSetting(struct column *col, char *name, char *defaultVal);
 /* Return value of named setting in column, or default if it doesn't exist. */
 
 char *columnRequiredSetting(struct column *col, char *name);
 /* Return value of named setting.  Abort if it doesn't exist. */
 
 int columnIntSetting(struct column *col, char *name, int defaultVal);
 /* Return value of named integer setting or default if it doesn't exist. */
 
 boolean columnSettingExists(struct column *col, char *name);
 /* Return TRUE if setting exists in column. */
 
 char *colVarName(struct column *col, char *prefix);
 /* Return variable name prefix.col->name. This is just a static
  * variable, so don't nest these calls. */
 
 void colButton(struct column *col, char *prefix, char *label);
 /* Make a button named prefix.col->name with given label. */
 
 struct column *colButtonPressed(struct column *colList, char *prefix);
 /* See if a button named prefix.column is pressed for some
  * column, and if so return the column, else NULL. */
 
 char *cellLookupVal(struct column *col, struct genePos *gp, struct sqlConnection *conn);
 /* Get a field in a table defined by col->table, col->keyField, col->valField. */
 
 void cellSimplePrint(struct column *col, struct genePos *gp, struct sqlConnection *conn);
 /* This just prints cellSimpleVal. */
 
 void labelSimplePrint(struct column *col);
 /* This just prints cell->shortLabel. */
 
 boolean simpleTableExists(struct column *col, struct sqlConnection *conn);
 /* This returns true if col->table exists. */
 
 void lookupAdvFilterControls(struct column *col, struct sqlConnection *conn);
 /* Print out controls for advanced filter on lookup column. */
 
 void minMaxAdvFilterControls(struct column *col, struct sqlConnection *conn);
 /* Print out controls for min/max advanced filter. */
 
 struct searchResult *lookupTypeSimpleSearch(struct column *col, 
     struct sqlConnection *conn, char *search);
 /* Search lookup type column. */
 
 struct searchResult *knownGeneSearchResult(struct sqlConnection *conn, 
 	char *kgID, char *alias);
 /* Return a searchResult for a known gene. */
 
 struct genePos *knownPosAll(struct sqlConnection *conn);
 /* Get all positions in knownGene table. */
 
 struct genePos *knownPosOne(struct sqlConnection *conn, char *name);
 /* Get all positions of named gene. */
 
 struct genePos *knownPosFirst(struct sqlConnection *conn);
 /* Get first gene in known gene table. */
 
 void fillInKnownPos(struct genePos *gp, struct sqlConnection *conn);
 /* If gp->chrom is not filled in go look it up. */
 
 struct hash *keyFileHash(struct column *col);
 /* Make up a hash from key file for this column. 
  * Return NULL if no key file. */
 
 struct slName *keyFileList(struct column *col);
 /* Make up list from key file for this column.
  * return NULL if no key file. */
 
 char *configVarName(struct column *col, char *varName);
 /* Return variable name for configuration. */
 
 char *configVarVal(struct column *col, char *varName);
 /* Return value for configuration variable.  Return NULL if it
  * doesn't exist or if it is "" */
 
 struct genePos *advFilterResults(struct column *colList, 
 	struct sqlConnection *conn);
 /* Get list of genes that pass all advanced filter filters.  
  * If no filters are on this returns all genes. */
 
 char *advFilterName(struct column *col, char *varName);
 /* Return variable name for advanced filter. */
 
 char *advFilterVal(struct column *col, char *varName);
 /* Return value for advanced filter variable.  Return NULL if it
  * doesn't exist or if it is "" */
 
 char *advFilterNameI(struct column *col, char *varName);
 /* Return name for advanced filter that doesn't force search. */
 
 void advFilterRemakeTextVar(struct column *col, char *varName, int size);
 /* Make a text field of given name and size filling it in with
  * the existing value if any. */
 
 void advFilterAnyAllMenu(struct column *col, char *varName, 
 	boolean defaultAny);
 /* Make a drop-down menu with value all/any. */
 
 boolean advFilterOrLogic(struct column *col, char *varName, 
 	boolean defaultOr);
 /* Return TRUE if user has selected 'all' from any/all menu */
 
 boolean gotAdvFilter();
 /* Return TRUE if advanced filter variables are set. */
 
 void advFilterKeyUploadButton(struct column *col);
 /* Make a button for uploading keywords. */
 
 struct column *advFilterKeyUploadPressed(struct column *colList);
 /* Return column where an key upload button was pressed, or
  * NULL if none. */
 
 void doAdvFilterKeyUpload(struct sqlConnection *conn, struct column *colList, 
     struct column *col);
 /* Handle upload keyword list button press in advanced filter form. */
 
 void advFilterKeyPasteButton(struct column *col);
 /* Make a button for uploading keywords. */
 
 struct column *advFilterKeyPastePressed(struct column *colList);
 /* Return column where an key upload button was pressed, or
  * NULL if none. */
 
 void doAdvFilterKeyPaste(struct sqlConnection *conn, struct column *colList, 
     struct column *col);
 /* Handle search keyword list button press in advanced filter form. */
 
 struct column *advFilterKeyPastedPressed(struct column *colList);
 /* Return column where an key upload button was pressed, or
  * NULL if none. */
 
 void doAdvFilterKeyPasted(struct sqlConnection *conn, struct column *colList, 
     struct column *col);
 /* Handle search keyword list button press in advanced filter form. */
 
 void advFilterKeyClearButton(struct column *col);
 /* Make a button for uploading keywords. */
 
 struct column *advFilterKeyClearPressed(struct column *colList);
 /* Return column where an key upload button was pressed, or
  * NULL if none. */
 
 void doAdvFilterKeyClear(struct sqlConnection *conn, struct column *colList, 
     struct column *col);
 /* Handle clear keyword list button press in advanced filter form. */
 
 void doNameCurrentFilters();
 /* Put up page to save current filter settings. */
 
 void doSaveCurrentFilters(struct sqlConnection *conn, struct column *colList);
 /* Handle save current filters form result. */
 
 void doUseSavedFilters(struct sqlConnection *conn, struct column *colList);
 /* Use indicated filter settings. */
 
 struct genePos *weedUnlessInHash(struct genePos *inList, struct hash *hash);
 /* Return input list with stuff not in hash removed. */
 
 void gifLabelVerticalText(char *fileName, char **labels, int labelCount,
 	int height);
 /* Make a gif file with given labels. */
 
 
 int gifLabelMaxWidth(char **labels, int labelCount);
 /* Return maximum pixel width of labels.  It's ok to have
  * NULLs in labels array. */
 
 struct sqlConnection *hgFixedConn();
 /* Return connection to hgFixed database. 
  * This is effectively a global, but not
  * opened until needed. */
 
 /* ---- Column method setters. ---- */
 
 void columnDefaultMethods(struct column *col);
 /* Set up default methods. */
 
 void setupColumnNum(struct column *col, char *parameters);
 /* Set up column that displays index in displayed list. */
 
 void setupColumnLookup(struct column *col, char *parameters);
 /* Set up column that just looks up one field in a table
  * keyed by the geneId. */
 
 void setupColumnAssociation(struct column *col, char *parameters);
 /* Set up a column that looks for an association table 
  * keyed by the geneId. */
 
 void setupColumnAcc(struct column *col, char *parameters);
 /* Set up a column that displays the geneId (accession) */
 
 void setupColumnDistance(struct column *col, char *parameters);
 /* Set up a column that looks up a field in a distance matrix
  * type table such as the expression or homology tables. */
 
 void setupColumnKnownPos(struct column *col, char *parameters);
 /* Set up column that links to genome browser based on known gene
  * position. */
 
 void setupColumnKnownDetails(struct column *col, char *parameters);
 /* Set up a column that links to details page for known genes. */
 
 void setupColumnKnownName(struct column *col, char *parameters);
 /* Set up a column that looks up name to display, and selects on a click. */
 
 void setupColumnSwissProt(struct column *col, char *parameters);
 /* Set up a column that protein name and links to SwissProt. */
 
 void setupColumnExpRatio(struct column *col, char *parameters);
 /* Set up expression ratio type column. */
 
 void setupColumnExpMulti(struct column *col, char *parameters);
 /* Set up expression type column that can be ratio or absolute,
  * short or long. */
 
 void setupColumnExpMax(struct column *col, char *parameters);
 /* Set up maximum expression value column. */
 
 void setupColumnGo(struct column *col, char *parameters);
 /* Set up gene ontology column. */
 
 void setupColumnPfam(struct column *col, char *parameters);
 /* Setup Pfam column. */
 
 void setupColumnFlyBdgp(struct column *col, char *parameters);
 /* Set up Bdgp gene column. */
 
 void setupColumnIntronSize(struct column *col, char *parameters);
 /* Set up a intronSize type column. */
 
 void setupColumnXyz(struct column *col, char *parameters);
 /* Set up a xyz type column. */
 
 void associationSimilarityMethods(struct order *ord, char *parameters);
 /* Fill in associationSimilarity methods. */
 
 /* ---- Custom column stuff ---- */
 
 void setupColumnCustom(struct column *col, char *parameters);
 /* Set up custom column. */
 
 void doCustomPage(struct sqlConnection *conn, struct column *colList);
 /* Put up initial page to input custom columns. */
 
 void doCustomUpload(struct sqlConnection *conn, struct column *colList);
 /* Put up page to upload custom columns. */
 
 void doCustomPaste(struct sqlConnection *conn, struct column *colList);
 /* Put up page to paste custom columns. */
 
 void doCustomFromUrl(struct sqlConnection *conn, struct column *colList);
 /* Put up page to paste in URLS with custom columns. */
 
 void doCustomSubmit(struct sqlConnection *conn, struct column *colList);
 /* Put up page to submit custom columns. */
 
 void doCustomClear(struct sqlConnection *conn, struct column *colList);
 /* Put up page to clear custom columns. */
 
 struct column *customColumnsRead(struct sqlConnection *conn, char *org, char *db);
 /* Read in data for custom columns. */
 
 /* ---- Get config options ---- */
 boolean showOnlyCanonical();
 /* Return TRUE if we only show canonical splicing varients. */
 
 struct hash *canonicalHash();
 /* Get canonicalHash if necessary, otherwise return NULL. */
 
 
 /* ---- Create high level pages. ---- */
 void displayData(struct sqlConnection *conn, struct column *colList, struct genePos *gp);
 /* Display data in neighborhood of gene. */
 
 void doSearch(struct sqlConnection *conn, struct column *colList);
 /* Search.  If result is unambiguous call doMain, otherwise
  * put up a page of choices. */
 
 void doAdvFilter(struct sqlConnection *conn, struct column *colList);
 /* Put up advanced filter page. */
 
 void doAdvFilterClear(struct sqlConnection *conn, struct column *colList);
 /* Clear variables in advanced filter page. */
 
 void doAdvFilterList(struct sqlConnection *conn, struct column *colList);
 /* List gene names matching advanced filter. */
 
 void doConfigure(struct sqlConnection *conn, struct column *colList, 
 	char *bumpVar);
 /* Configuration page. */
 
 void doDefaultConfigure(struct sqlConnection *conn, struct column *colList );
 /* Do configuration starting with defaults. */
 
 void doConfigHideAll(struct sqlConnection *conn, struct column *colList);
 /* Respond to hide all button in configuration page. */
 
 void doConfigShowAll(struct sqlConnection *conn, struct column *colList);
 /* Respond to show all button in configuration page. */
 
 void doNameCurrentColumns();
 /* Put up page to save current column configuration. */
 
 void doSaveCurrentColumns(struct sqlConnection *conn, struct column *colList);
 /* Save the current columns, and then go on. */
 
 void doConfigUseSaved(struct sqlConnection *conn, struct column *colList);
 /* Respond to Use Saved Settings buttin in configuration page. */
 
 void doGetSeqPage(struct sqlConnection *conn, struct column *colList);
 /* Put up the get sequence page. */
 
 void doGetSeq(struct sqlConnection *conn, struct column *colList, 
 	struct genePos *geneList, char *how);
 /* Show sequence. */
 
 void doGetGenomicSeq(struct sqlConnection *conn, struct column *colList,
 	struct genePos *geneList);
 /* Retrieve genomic sequence sequence according to options. */
 
 void doExamples(struct sqlConnection *conn, struct column *colList);
 /* Put up controls and then some helpful text and examples.
  * Called when search box is empty. */
 
 void doOrderInfo(struct sqlConnection *conn);
 /* Put up page with ordering info. */
 
 void doAffineAlignment(struct sqlConnection *conn);
 /* Put up page that shows affine alignment. */
 
 /* ---- User settings stuff - soon to be moved to library I hope. */
 
 struct userSettings 
 /* This helps us the user a set of cart variables, defined
  * by settingsPrefix.  It allows the user to save different
  * sets of settings under different names. */
      {
      struct userSettings *next;	/* Next in list. */
      struct cart *cart;		/* Associated cart. */
      char *formTitle;		/* Heading of settings save form. */
      char *nameVar;		/* Variable for name on give-it-a-name page. */
      char *savePrefix;		/* Prefix for where we store settings.
                                  * We store at savePrefix.name where name
 				 * is taken from listVar above. */
      char *formVar;		/* Submit button on give-it-a-name page. */
      char *listDisplayVar;	/* Variable name for list display control. */
      struct slName *saveList;	/* List of variables to save. */
      };
 
 struct userSettings *userSettingsNew(
 	struct cart *cart,	/* Persistent variable cart. */
 	char *formTitle,	/* Heading of settings save form. */
 	char *formVar,		/* Name of button variable on save form. */
 	char *localVarPrefix);  /* Prefix to use for internal cart variables. 
 		                 * No periods allowed because of javascript. */
 /* Make new object to help manage sets of user settings. */
 
 void userSettingsCaptureVar(struct userSettings *us, char *varName);
 /* Add a single variable to list of variables to capture. */
 
 void userSettingsCapturePrefix(struct userSettings *us, char *prefix);
 /* Capture all variables that start with prefix. */
 
 boolean userSettingsAnySaved(struct userSettings *us);
 /* Return TRUE if any user settings are saved. */
 
 void userSettingsUseNamed(struct userSettings *us, char *setName);
 /* Use named collection of settings. */
 
 void userSettingsUseSelected(struct userSettings *us);
 /* Use currently selected user settings. */
 
 void userSettingsSaveForm(struct userSettings *us);
 /* Put up controls that let user name and save the current
  * set. */
 
 void userSettingsLoadForm(struct userSettings *us);
 /* Put up controls that let user name and save the current
  * set. */
 
 boolean userSettingsProcessForm(struct userSettings *us);
 /* Handle button press in userSettings form. 
  * If this returns TRUE then form is finished processing
  * and you can call something to make the next page. */
 
 void userSettingsDropDown(struct userSettings *us);
 /* Display list of available saved settings . */
 
 extern char *lookupProtein(struct sqlConnection *conn, char *mrnaName);
 /* Given mrna name look up protein.  FreeMem result when done. */
 
 #endif /* HGNEAR_H */