eb57f721736fe3048c30576ff036a30cae7ce448
tdreszer
  Mon Aug 30 14:41:40 2010 -0700
Metadata link '...' is now populated by ajax
diff --git src/hg/lib/hui.c src/hg/lib/hui.c
index 0c26581..4099c19 100644
--- src/hg/lib/hui.c
+++ src/hg/lib/hui.c
@@ -47,6 +47,12 @@
 #define ENCODE_DCC_DOWNLOADS "encodeDCC"
 
 //#define SUBTRACK_CFG_POPUP
+// TODO: For subtrack cfg and integration with right-click and subtrack level vis:
+/*
+1) Composite/view level settings should be ajaxed over upon change
+2) subtrack popup should only register changed vars.  Like findTracks, this could be done by seen inputs with id and hidden inputs with name.
+3) subtrack cfg of vis should only set this var if changed from current possibly inherited state.
+*/
 
 struct trackDb *wgEncodeDownloadDirKeeper(char *db, struct trackDb *tdb, struct hash *trackHash)
 /* Look up through self and parents, looking for someone responsible for handling
@@ -61,38 +67,34 @@
 return trackDbTopLevelSelfOrParent(tdb);
 }
 
-static boolean makeFileDownloadsLink(char *database, struct trackDb *tdb,char *name,
+static char *htmlStringForDownloadsLink(char *database, struct trackDb *tdb,char *name,boolean nameIsFile,
 	struct hash *trackHash)
-// Make a downloads link (if appropriate and then returns TRUE)
+// Returns an HTML string for a downloads link
 {
 // Downloads directory if this is ENCODE
 if(trackDbSetting(tdb, "wgEncode") != NULL)
     {
     struct trackDb *dirKeeper = wgEncodeDownloadDirKeeper(database, tdb, trackHash);
-    printf("<A HREF=\"http://%s/goldenPath/%s/%s/%s/%s\" title='Download file' TARGET=ucscDownloads>%s</A>",
+    struct dyString *dyLink = dyStringCreate("<A HREF=\"http://%s/goldenPath/%s/%s/%s/%s\" title='Download file' TARGET=ucscDownloads>%s</A>",
             hDownloadsServer(),
             trackDbSettingOrDefault(dirKeeper, "origAssembly",database),
-            ENCODE_DCC_DOWNLOADS, dirKeeper->table, name, name);
-    return TRUE;
+            ENCODE_DCC_DOWNLOADS, dirKeeper->table, (nameIsFile?name:""), name);
+    return dyStringCannibalize(&dyLink);
     }
-return FALSE;
+return NULL;
 }
 
 static boolean makeNamedDownloadsLink(char *database, struct trackDb *tdb,char *name,
 	struct hash *trackHash)
 // Make a downloads link (if appropriate and then returns TRUE)
 {
-// Downloads directory if this is ENCODE
-if(trackDbSetting(tdb, "wgEncode") != NULL)
-    {
-    struct trackDb *dirKeeper = wgEncodeDownloadDirKeeper(database, tdb, trackHash);
-    printf("<A HREF=\"http://%s/goldenPath/%s/%s/%s/\" title='Open downloads directory in a new window' TARGET=ucscDownloads>%s</A>",
-            hDownloadsServer(),
-            trackDbSettingOrDefault(dirKeeper, "origAssembly",database),
-            ENCODE_DCC_DOWNLOADS, dirKeeper->table, name);
-    return TRUE;
-    }
+char *htmlString = htmlStringForDownloadsLink(database,tdb,name,FALSE,trackHash);
+if (htmlString == NULL)
 return FALSE;
+
+printf(htmlString);
+freeMem(htmlString);
+return TRUE;
 }
 
 boolean makeDownloadsLink(char *database, struct trackDb *tdb, struct hash *trackHash)
@@ -132,20 +134,19 @@
 return FALSE;
 }
 
-boolean compositeMetadataToggle(char *db,struct trackDb *tdb,char *title,
-        boolean embeddedInText,boolean showLongLabel, struct hash *trackHash)
-/* If metadata from metaTbl if it exists, create a link that will allow toggling it's display */
+char *metadataAsHtmlTable(char *db,struct trackDb *tdb,boolean showLongLabel,boolean showShortLabel, struct hash *trackHash)
+/* If metadata from metaDb exists, return string of html with table definition */
 {
 const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL);
 if(safeObj == NULL || safeObj->vars == NULL)
-return FALSE;
+return NULL;
 
-printf("%s<A HREF='#a_meta_%s' onclick='return metadataShowHide(\"%s\");' title='Show metadata details...'>%s</A>",
-        (embeddedInText?"&nbsp;":"<P>"),tdb->table,tdb->table, title);
-printf("<DIV id='div_%s_meta' style='display:none;'><!--<table>",tdb->table);
+//struct dyString *dyTable = dyStringCreate("<table id='mdb_%s'>",tdb->table);
+struct dyString *dyTable = dyStringCreate("<table>");
 if(showLongLabel)
-    printf("<tr onmouseover=\"this.style.cursor='text';\"><td colspan=2>%s</td></tr>",tdb->longLabel);
-printf("<tr onmouseover=\"this.style.cursor='text';\"><td align=right><i>shortLabel:</i></td><td nowrap>%s</td></tr>",tdb->shortLabel);
+    dyStringPrintf(dyTable,"<tr onmouseover=\"this.style.cursor='text';\"><td colspan=2>%s</td></tr>",tdb->longLabel);
+if(showShortLabel)
+    dyStringPrintf(dyTable,"<tr onmouseover=\"this.style.cursor='text';\"><td align=right><i>shortLabel:</i></td><td nowrap>%s</td></tr>",tdb->shortLabel);
 
 struct mdbObj *mdbObj = mdbObjClone(safeObj); // Important if we are going to remove vars!
 mdbObjRemoveVars(mdbObj,"composite project objType"); // Don't bother showing these (suggest: "composite project dataType view tableName")
@@ -157,10 +158,10 @@
     if ((sameString(mdbVar->var,"fileName") || sameString(mdbVar->var,"fileIndex") )
     && trackDbSettingClosestToHome(tdb,"wgEncode") != NULL)
         {
-        printf("<tr onmouseover=\"this.style.cursor='text';\"><td align=right><i>%s:</i></td><td nowrap>",mdbVar->var);
+        dyStringPrintf(dyTable,"<tr onmouseover=\"this.style.cursor='text';\"><td align=right><i>%s:</i></td><td nowrap>",mdbVar->var);
 
-        makeFileDownloadsLink(db, tdb, mdbVar->val, trackHash);
-        printf("</td></tr>");
+        dyStringAppend(dyTable,htmlStringForDownloadsLink(db, tdb, mdbVar->val, TRUE, trackHash));
+        dyStringAppend(dyTable,"</td></tr>");
         }
     else
         {
@@ -168,11 +169,31 @@
         if(sameString(mdbVar->var,"antibody") && mdbObjContains(mdbObj,"input",mdbVar->val))
             continue;
 
-        printf("<tr onmouseover=\"this.style.cursor='text';\"><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val);
+        dyStringPrintf(dyTable,"<tr onmouseover=\"this.style.cursor='text';\"><td align=right><i>%s:</i></td><td nowrap>%s</td></tr>",mdbVar->var,mdbVar->val);
         }
     }
-printf("</table>--></div>");
+dyStringAppend(dyTable,"</table>");
 //mdbObjsFree(&mdbObj); // spill some memory
+return dyStringCannibalize(&dyTable);
+}
+
+boolean compositeMetadataToggle(char *db,struct trackDb *tdb,char *title,
+        boolean embeddedInText,boolean showLongLabel, struct hash *trackHash)
+/* If metadata from metaTbl exists, create a link that will allow toggling it's display */
+{
+const struct mdbObj *safeObj = metadataForTable(db,tdb,NULL);
+if(safeObj == NULL || safeObj->vars == NULL)
+return FALSE;
+
+printf("%s<A HREF='#a_meta_%s' onclick='return metadataShowHide(\"%s\",%s,true);' title='Show metadata details...'>%s</A>",
+        (embeddedInText?"&nbsp;":"<P>"),tdb->table,tdb->table, showLongLabel?"true":"false", title);
+if (!sameString(tdb->table, tdb->track) && trackHash != NULL) // If trackHash is needed, then can't fill this in with ajax
+    {
+    printf("<DIV id='div_%s_meta' style='display:none;'>%s</div>",tdb->table,
+        metadataAsHtmlTable(db,tdb,showLongLabel,TRUE,trackHash) );
+    }
+else
+    printf("<DIV id='div_%s_meta' style='display:none;'></div>",tdb->table);
 return TRUE;
 }