f9ca7382a7ca668aafe1203bce5fb5f3c311db92
Merge parents 5e0bdb4 f592c99
kate
  Thu Feb 16 12:17:26 2017 -0800
Fixing merge conflit

diff --cc src/hg/lib/hui.c
index 2d81000,ec4c0ad..b60de25
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@@ -35,84 -35,93 +35,94 @@@
  #include "snakeUi.h"
  #include "vcfUi.h"
  #include "vcf.h"
  #include "errCatch.h"
  #include "samAlignment.h"
  #include "makeItemsItem.h"
  #include "bedDetail.h"
  #include "pgSnp.h"
  #include "memgfx.h"
  #include "trackHub.h"
  #include "gtexUi.h"
  #include "genbank.h"
  #include "htmlPage.h"
  #include "longRange.h"
  #include "tagRepo.h"
 +#include "barChartUi.h"
  
  #define SMALLBUF 256
  #define MAX_SUBGROUP 9
  #define ADD_BUTTON_LABEL        "add"
  #define CLEAR_BUTTON_LABEL      "clear"
  #define JBUFSIZE 2048
  
- #define PM_BUTTON  "<IMG height=18 width=18 onclick=\"setCheckBoxesThatContain(" \
-                    "'%s',%s,true,'%s','','%s');\" id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
- #define DEF_BUTTON "<IMG onclick=\"setCheckBoxesThatContain('%s',true,false,'%s','','%s'); " \
-                    "setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');\" " \
-                    "id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
+ 
+ #define DEF_BUTTON "<IMG id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
+ #define DEF_BUTTON_JS "setCheckBoxesThatContain('%s',true,false,'%s','','%s');" \
+ 	       "setCheckBoxesThatContain('%s',false,false,'%s','_defOff','%s');" 
  #define DEFAULT_BUTTON(nameOrId,anc,beg,contains) \
-         printf(DEF_BUTTON,(nameOrId),(beg),(contains),(nameOrId),(beg),(contains),(anc), \
-               "defaults_sm.png","default")
+     printf(DEF_BUTTON,(anc),"defaults_sm.png","default"); \
+     safef(id, sizeof id, "btn_%s", (anc)); \
+     safef(javascript, sizeof javascript, DEF_BUTTON_JS,(nameOrId),(beg),(contains),(nameOrId),(beg),(contains)); \
+     jsOnEventById("click", id, javascript);
+ 
+ #define PM_BUTTON  "<IMG height=18 width=18 id=\"btn_%s\" src=\"../images/%s\" alt=\"%s\">\n"
+ #define PM_BUTTON_JS  "setCheckBoxesThatContain('%s',%s,true,'%s','','%s');"
  #define PLUS_BUTTON(nameOrId,anc,beg,contains) \
-         printf(PM_BUTTON, (nameOrId),"true", (beg),(contains),(anc),"add_sm.gif",   "+")
+     printf(PM_BUTTON, (anc), "add_sm.gif",   "+"); \
+     safef(id, sizeof id, "btn_%s", (anc)); \
+     safef(javascript, sizeof javascript, PM_BUTTON_JS, (nameOrId),"true", (beg),(contains)); \
+     jsOnEventById("click", id, javascript);
  #define MINUS_BUTTON(nameOrId,anc,beg,contains) \
-         printf(PM_BUTTON, (nameOrId),"false",(beg),(contains),(anc),"remove_sm.gif","-")
+     printf(PM_BUTTON, (anc), "remove_sm.gif", "-"); \
+     safef(id, sizeof id, "btn_%s", (anc)); \
+     safef(javascript, sizeof javascript, PM_BUTTON_JS, (nameOrId),"false", (beg),(contains)); \
+     jsOnEventById("click", id, javascript);
  
  boolean isEncode2(char *database)
  // Return true for ENCODE2 assemblies
  {
  return (sameString(database, "hg18") || sameString(database, "hg19") || sameString(database, "mm9"));
  }
  
  static char *htmlStringForDownloadsLink(char *database, struct trackDb *tdb,
-                                         char *name,boolean nameIsFile)
+ 				    char *name,boolean nameIsFile)
  // Returns an HTML string for a downloads link
  {
  // If has fileSortOrder, then link to new hgFileUi
  if (!nameIsFile && trackDbSetting(tdb, FILE_SORT_ORDER) != NULL)
      {
      char * link = needMem(PATH_LEN); // 512 should be enough
      safef(link,PATH_LEN,"<A HREF='%s?db=%s&g=%s' title='Downloadable Files...' TARGET='ucscDownloads'>%s</A>",
-           hgFileUiName(),database, /*cartSessionVarName(),cartSessionId(cart),*/ tdb->track, name);
-           // Note the hgsid would be needed if downloads page ever saved fileSortOrder to cart.
+ 	  hgFileUiName(),database, /*cartSessionVarName(),cartSessionId(cart),*/ tdb->track, name);
+ 	  // Note the hgsid would be needed if downloads page ever saved fileSortOrder to cart.
      return link;
      }
  else if (trackDbSetting(tdb, "wgEncode") != NULL && isEncode2(database))  // Downloads directory if this is ENCODE
      {
      const char *compositeDir = metadataFindValue(tdb, MDB_OBJ_TYPE_COMPOSITE);
      if (compositeDir == NULL && tdbIsComposite(tdb))
-         compositeDir = tdb->track;
+ 	compositeDir = tdb->track;
      if (compositeDir != NULL)
-         {
-         struct dyString *dyLink =
-                 dyStringCreate("<A HREF=\"http://%s/goldenPath/%s/%s/%s/%s\" title='Download %s' "
-                                "class='file' TARGET=ucscDownloads>%s</A>",
-                                hDownloadsServer(), database, ENCODE_DCC_DOWNLOADS, compositeDir,
-                                (nameIsFile?name:""), nameIsFile?"file":"files",name);
-         return dyStringCannibalize(&dyLink);
-         }
+ 	{
+ 	struct dyString *dyLink =
+ 		dyStringCreate("<A HREF=\"http://%s/goldenPath/%s/%s/%s/%s\" title='Download %s' "
+ 			       "class='file' TARGET=ucscDownloads>%s</A>",
+ 			       hDownloadsServer(), database, ENCODE_DCC_DOWNLOADS, compositeDir,
+ 			       (nameIsFile?name:""), nameIsFile?"file":"files",name);
+ 	return dyStringCannibalize(&dyLink);
+ 	}
      }
  return NULL;
  }
  
  static boolean makeNamedDownloadsLink(char *database, struct trackDb *tdb,char *name)
  // Make a downloads link (if appropriate and then returns TRUE)
  {
  char *htmlString = htmlStringForDownloadsLink(database,trackDbTopLevelSelfOrParent(tdb),name,FALSE);
  if (htmlString == NULL)
      return FALSE;
  
  printf("%s", htmlString);
  freeMem(htmlString);
  return TRUE;
  }
@@@ -3968,102 -4014,103 +4015,105 @@@
      {
      struct trackDb *tdb = tdbRef->val;
      safef(htmlIdentifier, sizeof(htmlIdentifier), "%s.priority", tdb->track);
      char *cartHas = cartOptionalString(cart,htmlIdentifier);
      if (cartHas != NULL)
  	{
  	tdb->priority = atof(cartHas);
  	cartPriorities = TRUE;
  	}
      }
  slSort(tdbRefList, trackDbRefCmp);
  return cartPriorities;
  }
  
  void cfgByCfgType(eCfgType cType,char *db, struct cart *cart, struct trackDb *tdb,char *prefix,
-                   char *title, boolean boxed)
+ 	      char *title, boolean boxed)
  // Methods for putting up type specific cfgs used by composites/subtracks in hui.c
  {
  // When only one subtrack, then show it's cfg settings instead of composite/view level settings
  // This simplifies the UI where hgTrackUi won't have 2 levels of cfg,
  // while hgTracks still supports rightClick cfg of the subtrack.
  
  if (configurableByAjax(tdb,cType) > 0) // Only if subtrack's configurable by ajax do we
      {                                  // consider this option
      if (tdbIsComposite(tdb)                       // called for the composite
      && !tdbIsCompositeView(tdb->subtracks)        // and there is no view level
      && slCount(tdb->subtracks) == 1)              // and there is only one subtrack
-         {
-         tdb = tdb->subtracks; // show subtrack cfg instead
-         prefix = tdb->track;
-         }
+ 	{
+ 	tdb = tdb->subtracks; // show subtrack cfg instead
+ 	prefix = tdb->track;
+ 	}
      else if (tdbIsSubtrack(tdb)                   // called with subtrack
-          && tdbIsCompositeView(tdb->parent)       // subtrack has view
-          && differentString(prefix,tdb->track)    // and this has been called FOR the view
-          && slCount(tdb->parent->subtracks) == 1) // and view has only one subtrack
-         prefix = tdb->track; // removes reference to view level
+ 	 && tdbIsCompositeView(tdb->parent)       // subtrack has view
+ 	 && differentString(prefix,tdb->track)    // and this has been called FOR the view
+ 	 && slCount(tdb->parent->subtracks) == 1) // and view has only one subtrack
+ 	prefix = tdb->track; // removes reference to view level
      }
  
  // Cfg could be explicitly blocked, but if tdb is example subtrack
  // then blocking should have occurred before we got here.
  if (!tdbIsSubtrack(tdb) && trackDbSettingBlocksConfiguration(tdb,FALSE))
      return;
  
  // composite/view must pass in example subtrack
  // NOTE: if subtrack types vary then there shouldn't be cfg at composite/view level!
  while (tdb->subtracks)
-     tdb = tdb->subtracks;
+ tdb = tdb->subtracks;
  
  switch(cType)
      {
      case cfgBedScore:
-                         {
-                         char *scoreMax = trackDbSettingClosestToHome(tdb, SCORE_FILTER _MAX);
-                         int maxScore = (scoreMax ? sqlUnsigned(scoreMax):1000);
-                         scoreCfgUi(db, cart,tdb,prefix,title,maxScore,boxed);
-                         }
-                         break;
+ 			{
+ 			char *scoreMax = trackDbSettingClosestToHome(tdb, SCORE_FILTER _MAX);
+ 			int maxScore = (scoreMax ? sqlUnsigned(scoreMax):1000);
+ 			scoreCfgUi(db, cart,tdb,prefix,title,maxScore,boxed);
+ 
+ 			if(startsWith("bigBed", tdb->type))
+ 			    labelCfgUi(db, cart, tdb);
+ 			}
+ 			break;
      case cfgPeak:
-                         encodePeakCfgUi(cart,tdb,prefix,title,boxed);
-                         break;
+ 			encodePeakCfgUi(cart,tdb,prefix,title,boxed);
+ 			break;
      case cfgWig:        wigCfgUi(cart,tdb,prefix,title,boxed);
-                         break;
+ 			break;
      case cfgWigMaf:     wigMafCfgUi(cart,tdb,prefix,title,boxed, db);
-                         break;
-     case cfgGenePred:   genePredCfgUi(cart,tdb,prefix,title,boxed);
-                         break;
+ 			break;
+     case cfgGenePred:   genePredCfgUi(db, cart,tdb,prefix,title,boxed);
+ 			break;
      case cfgChain:      chainCfgUi(db,cart,tdb,prefix,title,boxed, NULL);
-                         break;
+ 			break;
      case cfgNetAlign:   netAlignCfgUi(db,cart,tdb,prefix,title,boxed);
-                         break;
+ 			break;
      case cfgBedFilt:    bedFiltCfgUi(cart,tdb,prefix,title, boxed);
-                         break;
+ 			break;
      case cfgBam:        bamCfgUi(cart, tdb, prefix, title, boxed);
-                         break;
+ 			break;
      case cfgVcf:        vcfCfgUi(cart, tdb, prefix, title, boxed);
-                         break;
+ 			break;
      case cfgLong:       longRangeCfgUi(cart, tdb, prefix, title, boxed);
-                         break;
+ 			break;
      case cfgSnake:      snakeCfgUi(cart, tdb, prefix, title, boxed);
-                         break;
+ 			break;
      case cfgPsl:        pslCfgUi(db,cart,tdb,prefix,title,boxed);
 -			break;
 +                        break;
 +    case cfgBarChart:   barChartCfgUi(db,cart,tdb,prefix,title,boxed);
 +                        break;
      default:            warn("Track type is not known to multi-view composites. type is: %d ",
-                              cType);
-                         break;
+ 			     cType);
+ 			break;
      }
  }
  
  char *encodeRestrictionDate(char *db,struct trackDb *trackDb,boolean excludePast)
  // Create a string for ENCODE restriction date of this track
  // if return is not null, then free it after use
  {
  if (!trackDb)
      return NULL;
  
  char *date = NULL;
  
  if (metadataForTable(db,trackDb,NULL) != NULL)
      {
      date = cloneString((char *)metadataFindValue(trackDb,"dateUnrestricted"));