4288d963377a85706ba950b7cfb68689c25d8b7b
max
  Tue Jul 9 10:11:03 2013 -0700
adding iframeUrl and iframeOptions trackDb options to hgc. They allow to show an external webpage directly on the hgc page
diff --git src/hg/hgc/hgc.c src/hg/hgc/hgc.c
index 88d6cf4..77dae99 100644
--- src/hg/hgc/hgc.c
+++ src/hg/hgc/hgc.c
@@ -920,31 +920,31 @@
         printf("<br>\n%s\n", html->html);
     itemDetailsHtmlFreeList(&htmls);
     hFreeConn(&conn);
     }
 }
 
 char *getIdInUrl(struct trackDb *tdb, char *itemName)
 /* If we have an idInUrlSql tag, look up itemName in that, else just
  * return itemName. */
 {
 char *sql = trackDbSetting(tdb, "idInUrlSql");
 char *id = itemName;
 if (sql != NULL)
     {
     char buf[256];
-    safef(buf, sizeof(buf), sql, itemName);
+    sqlSafef(buf, sizeof(buf), sql, itemName);
     struct sqlConnection *conn = hAllocConn(database);
     id = sqlQuickString(conn, buf);
     hFreeConn(&conn);
     }
 return id;
 }
 
 char* replaceInUrl(struct trackDb *tdb, char *url, char *idInUrl, boolean encode) 
 /* replace $$ in url with idInUrl. Supports many other wildchards */
 {
 struct dyString *uUrl = NULL;
 struct dyString *eUrl = NULL;
 char startString[64], endString[64];
 char *ins[9], *outs[9];
 char *eItem = (encode ? cgiEncode(idInUrl) : cloneString(idInUrl));
@@ -998,59 +998,90 @@
 
 // check the url setting prefix and get the correct url setting from trackDb 
 char *url;
 if (sameWord(urlSetting, "url"))
     url = tdb->url;
 else
     url = trackDbSetting(tdb, urlSetting);
 
 if (url == NULL || url[0] == 0)
     return NULL;
 
 char* eUrl = replaceInUrl(tdb, url, idInUrl, encode);
 return eUrl;
 }
 
+void printIframe(struct trackDb *tdb, char *itemName)
+/* print an iframe with the URL specified in trackDb (iframeUrl), can have 
+ * the standard codes in it (like $$ for itemName, etc)
+ */
+{
+char* eUrl = constructUrl(tdb, "iframeUrl", itemName, FALSE);
+if (eUrl==NULL)
+    return;
+
+char *iframeOptions = trackDbSettingOrDefault(tdb, "iframeOptions", "width='100%%' height='1024'");
+// Resizing requires the hgcDetails pages to include a bit of javascript.
+//
+// Explanation how this works and why the javascript is needed:
+// http://stackoverflow.com/questions/153152/resizing-an-iframe-based-on-content
+// In short:
+// - iframes have a fixed size in html, resizing can only be done in javascript
+// - the iframed page cannot call the resize() function in the hgc html directly, as they have
+//   been loaded from different webservers
+// - one way around it is that the iframed page includes a helper page on our server and 
+//   send their size to the helper page (pages can call functions of included pages)
+// - the helper page then sends the size back to hgc (pages on the same server can
+//   call each others' functions)
+//   width='%s' height='%s' src='%s' seamless scrolling='%s' frameborder='%s'
+
+printf(" \
+<script> \
+function resizeIframe(height) \
+{ \
+     document.getElementById('hgcIframe').height = parseInt(height)+10; \
+} \
+</script> \
+ \
+<iframe id='hgcIframe' src='%s' %s></iframe> \
+<p>", eUrl, iframeOptions);
+}
+
 void printCustomUrlWithLabel(struct trackDb *tdb, char *itemName, char *itemLabel, char *urlSetting, boolean encode)
 /* Print custom URL specified in trackDb settings. */
 {
 char urlLabelSetting[32];
 
-// first try to resolve itemName via an optional sql statement to something else
-char *idInUrl = getIdInUrl(tdb, itemName);
-if (idInUrl == NULL)
-    return;
-
 // replace the $$ and other wildchards with the url given in tdb 
-char* eUrl = constructUrl(tdb, urlSetting, idInUrl, encode);
+char* eUrl = constructUrl(tdb, urlSetting, itemName, encode);
 if (eUrl==NULL)
     return;
 
 /* create the url label setting for trackDb from the url
    setting prefix */
 safef(urlLabelSetting, sizeof(urlLabelSetting), "%sLabel", urlSetting);
 printf("<B>%s </B>",
        trackDbSettingOrDefault(tdb, urlLabelSetting, "Outside Link:"));
 printf("<A HREF=\"%s\" target=_blank>", eUrl);
 
 if (sameWord(tdb->table, "npredGene"))
     {
-    printf("%s (%s)</A><BR>\n", idInUrl, "NCBI MapView");
+    printf("%s (%s)</A><BR>\n", itemName, "NCBI MapView");
     }
 else
     {
-    char *label = idInUrl;
+    char *label = itemName;
     if (isNotEmpty(itemLabel) && !sameString(itemName, itemLabel))
         label = itemLabel;
     printf("%s</A><BR>\n", label);
     }
 //freeMem(&eUrl); small memory leak
 }
 
 void printCustomUrl(struct trackDb *tdb, char *itemName, boolean encode)
 /* Wrapper to call printCustomUrlWithLabel using the url setting in trackDb */
 {
 char urlSetting[10];
 safef(urlSetting, sizeof(urlSetting), "url");
 
 printCustomUrlWithLabel(tdb, itemName, itemName, urlSetting, encode);
 }
@@ -3834,31 +3865,35 @@
     {
     type = words[0];
     if (sameString(type, "maf") || sameString(type, "wigMaf") || sameString(type, "netAlign")
         || sameString(type, "encodePeak"))
         headerItem = NULL;
     else if ((  sameString(type, "narrowPeak")
              || sameString(type, "broadPeak")
              || sameString(type, "gappedPeak") )
          &&  headerItem
          &&  sameString(headerItem, ".") )
         headerItem = NULL;
     }
 
 /* Print header. */
 genericHeader(tdb, headerItem);
+
+itemForUrl = getIdInUrl(tdb, item);
 printCustomUrl(tdb, itemForUrl, item == itemForUrl);
+printIframe(tdb, itemForUrl);
+
 if (plus != NULL)
     {
     fputs(plus, stdout);
     }
 
 if (container != NULL)
     {
     genericContainerClick(conn, container, tdb, item, itemForUrl);
     }
 else if (wordCount > 0)
     {
     type = words[0];
     if (sameString(type, "bed"))
 	{
 	int num = 0;