34b01f059a90f1ce39ee7d4dc97115bc7aa980a3
tdreszer
  Fri Dec 16 15:21:55 2011 -0800
Fixed bug where view starts with digit.
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 1cc52e7..8bab64b 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -2276,33 +2276,33 @@
 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 *firstCharNoDigit(char *name)
+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 common.
+// 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
 
 #define FILTER_COMPOSITE_ONLYONE
 #ifdef FILTER_COMPOSITE_ONLYONE
 // FIXME: do we even support anything but multi???  If not, this is a boolean
@@ -2397,31 +2397,31 @@
 if(count <= 1)
     {
     freeMem(members->setting);
     freeMem(members);
     return NULL;
     }
 members->groupTag   = words[0];
 members->groupTitle = strSwapChar(words[1],'_',' '); // Titles replace '_' with space
 members->tags       = needMem(count*sizeof(char*));
 members->titles     = needMem(count*sizeof(char*));
 for (ix = 2,members->count=0; ix < count; ix++)
     {
     char *name,*value;
     if (parseAssignment(words[ix], &name, &value))
         {
-        members->tags[members->count]  = firstCharNoDigit(name);
+        members->tags[members->count]  = tagEncode(name);
         members->titles[members->count] = strSwapChar(value,'_',' ');
         members->count++;
         }
     }
 return members;
 }
 
 // No longer used, but it could come back!
 //static members_t *subgroupMembersGetByDimension(struct trackDb *parentTdb, char dimension)
 ///* Finds the dimension requested and return its associated
 // * subgroupMembership, returning the count of members or 0 */
 //{
 //int ix;
 //dimensions_t *dimensions = dimensionSettingsGet(parentTdb);
 //if(dimensions!=NULL)
@@ -2849,31 +2849,31 @@
 if(cnt <= 0)
     {
     freeMem(membership->setting);
     freeMem(membership);
     return NULL;
     }
 membership->subgroups  = needMem(cnt*sizeof(char*));
 membership->membership = needMem(cnt*sizeof(char*));
 membership->titles     = needMem(cnt*sizeof(char*));
 for (ix = 0,membership->count=0; ix < cnt; ix++)
     {
     char *name,*value;
     if (parseAssignment(words[ix], &name, &value))
         {
         membership->subgroups[membership->count]  = name;
-        membership->membership[membership->count] = firstCharNoDigit(value); // tags will be used as classes by js
+        membership->membership[membership->count] = tagEncode(value); // tags will be used as classes by js
         members_t* members = subgroupMembersGet(childTdb->parent, name);
         membership->titles[membership->count] = NULL; // default
         if(members != NULL)
             {
             int ix2 = stringArrayIx(membership->membership[membership->count],members->tags,members->count);
             if(ix2 != -1)
                 membership->titles[membership->count] = strSwapChar(cloneString(members->titles[ix2]),'_',' ');
             subgroupMembersFree(&members);
             }
         membership->count++;
         }
     }
 tdbExtrasMembershipSet(childTdb,membership);
 return membership;
 }
@@ -6192,31 +6192,31 @@
 if (!boxed && fileExists(hHelpFile("hgBamTrackHelp")))
     printf("<P><A HREF=\"../goldenPath/help/hgBamTrackHelp.html\" TARGET=_BLANK>BAM "
 	   "configuration help</A></P>");
 
 cfgEndBox(boxed);
 }
 #endif//def USE_BAM
 
 struct trackDb *rFindView(struct trackDb *forest, char *view)
 // Return the trackDb on the list that matches the view tag. Prefers ancestors before decendents
 {
 struct trackDb *tdb;
 for (tdb = forest; tdb != NULL; tdb = tdb->next)
     {
     char *viewSetting = trackDbSetting(tdb, "view");
-    if (sameOk(viewSetting, view))
+    if (sameOk(viewSetting, view) || sameOk(tagEncode(viewSetting), view))
         return tdb;
     }
 for (tdb = forest; tdb != NULL; tdb = tdb->next)
     {
     struct trackDb *viewTdb = rFindView(tdb->subtracks, view);
     if (viewTdb != NULL)
         return viewTdb;
     }
 return NULL;
 }
 
 static boolean compositeViewCfgExpandedByDefault(struct trackDb *parentTdb,char *view,
 	char **retVisibility)
 /* returns true if the view cfg is expanded by default.  Optionally allocates string of view
  * setting (eg 'dense') */