2365a5a3e7ba877904626426b1a851dc8cce2e18
tdreszer
  Sat Jan 14 13:20:09 2012 -0800
tagEncoding needed to be extended to the ABC dimensions default checked logic.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 58d9434..e1b9fc4 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -2205,30 +2205,43 @@
 /* Sets the fourState Checked in the cart and updates cached state */
 {
 int fourState = ( checked ? FOUR_STATE_CHECKED : FOUR_STATE_UNCHECKED );
 if (!enabled)
     FOUR_STATE_DISABLE(fourState);
 
 char objName[SMALLBUF];
 char objVal[5];
 safef(objName, sizeof(objName), "%s_sel", subtrack->track);
 safef(objVal, sizeof(objVal), "%d", fourState);
 cartSetString(cart, objName, objVal);
 tdbExtrasFourStateSet(subtrack,fourState);
 }
 
 
+static char *tagEncode(char *name)
+// Turns out css classes cannot begin with a number.  So prepend 'A'
+// If this were more widely used, could move to cheapcgi.c.
+{
+if (!isdigit(*name))
+     return name;
+
+char *newName = needMem(strlen(name)+1);
+*newName = 'A';
+strcpy(newName+1,name);
+return newName;
+}
+
 typedef struct _dimensions {
     int count;
     char**names;
     char**subgroups;
     char* setting;
 } dimensions_t;
 
 boolean dimensionsExist(struct trackDb *parentTdb)
 /* Does this parent track contain dimensions? */
 {
     return (trackDbSetting(parentTdb, "dimensions") != NULL);
 }
 //static boolean dimensionsSubtrackOf(struct trackDb *childTdb)
 ///* Does this child belong to a parent  with dimensions? */
 //{
@@ -2252,62 +2265,49 @@
 if(cnt <= 0)
     {
     freeMem(dimensions->setting);
     freeMem(dimensions);
     return NULL;
     }
 
 dimensions->names     = needMem(cnt*sizeof(char*));
 dimensions->subgroups = needMem(cnt*sizeof(char*));
 char *name,*value;
 for (ix = 0,dimensions->count=0; ix < cnt; ix++)
     {
     if (parseAssignment(words[ix], &name, &value))
         {
         dimensions->names[dimensions->count]     = name;
-        dimensions->subgroups[dimensions->count] = value;
+        dimensions->subgroups[dimensions->count] = tagEncode(value);
         dimensions->count++;
         }
     }
 return dimensions;
 }
 
 static void dimensionsFree(dimensions_t **dimensions)
 /* frees any previously obtained dividers setting */
 {
 if(dimensions && *dimensions)
     {
     freeMem((*dimensions)->setting);
     freeMem((*dimensions)->names);
     freeMem((*dimensions)->subgroups);
     freez(dimensions);
     }
 }
 
-static char *tagEncode(char *name)
-// Turns out css classes cannot begin with a number.  So prepend 'A'
-// If this were more widely used, could move to cheapcgi.c.
-{
-if (!isdigit(*name))
-     return name;
-
-char *newName = needMem(strlen(name)+1);
-*newName = 'A';
-strcpy(newName+1,name);
-return newName;
-}
-
 #define SUBGROUP_MAX 9
 
 enum filterCompositeType
 // Filter composites are drop-down checkbix-lists for selecting subtracks (eg hg19::HAIB TFBS)
     {
     fctNone=0,      // do not offer filter for this dimension
     fctOne=1,       // filter composite by one or all
     fctOneOnly=2,   // filter composite by only one
     fctMulti=3,     // filter composite by multiselect: all, one or many
     };
 
 typedef struct _members {
     int count;
     char * groupTag;
     char * groupTitle;
@@ -2563,36 +2563,46 @@
         assert(options != NULL);
         }
     struct slName *option;
     for(option=options;option!=NULL;option=option->next)
         {
         mIx = membersSubGroupIx(members, option->name);
         if(mIx >= 0)
             members->selected[mIx] = TRUE;
         }
     return slNameListToString(options,',');
     }
 struct dyString *currentlyCheckedTags = NULL;
 // Need a string of subGroup tags which are currently checked
 safef(settingName,sizeof(settingName),"dimension%cchecked",letter);
 char *dimCheckedDefaults = trackDbSettingOrDefault(parentTdb,settingName,"All");
+char *checkedDefaults[12];
+int defaultCount = 0;
+if (dimCheckedDefaults != NULL
+&& differentWord(dimCheckedDefaults,"All") && differentWord(dimCheckedDefaults,"Any"))
+    {
+    defaultCount = chopCommas(dimCheckedDefaults, checkedDefaults);
+    int dIx = 0;
+    for (;dIx < defaultCount;dIx++)
+        checkedDefaults[dIx] = tagEncode(checkedDefaults[dIx]); // Need to encode these before compare!
+    }                                                           // Will leak, but this is a tiny amount
 for(mIx=0;mIx<members->count;mIx++)
     {
     safef(settingName, sizeof(settingName), "%s.mat_%s_dim%c_cb",parentTdb->track,members->tags[mIx],letter);
     members->selected[mIx] = TRUE;
-    if (differentWord(dimCheckedDefaults,"All") && differentWord(dimCheckedDefaults,"Any"))
-        members->selected[mIx] = (NULL!=findWordByDelimiter(members->tags[mIx],',',dimCheckedDefaults));
+    if (defaultCount > 0)
+        members->selected[mIx] = (-1 != stringArrayIx(members->tags[mIx],checkedDefaults,defaultCount));
     members->selected[mIx] = cartUsualBoolean(cart,settingName,members->selected[mIx]);
     if(members->selected[mIx])
         {
         if(currentlyCheckedTags == NULL)
             currentlyCheckedTags = dyStringCreate(members->tags[mIx]);
         else
             dyStringPrintf(currentlyCheckedTags,",%s",members->tags[mIx]);
         }
     }
 if(currentlyCheckedTags)
     return dyStringCannibalize(&currentlyCheckedTags);
 return NULL;
 }
 
 static membersForAll_t *membersForAllSubGroupsWeedOutEmpties(struct trackDb *parentTdb, membersForAll_t *membersForAll, struct cart *cart)