108ce8a6eca325ddc6e949e271e262e91b596fd9
tdreszer
  Mon Nov 22 12:02:43 2010 -0800
Made freeText search instead of drop downs for track search advanced when cv.ra reports 'searchable freeText'.  This is useful for labVersion among others.
diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c
index cbca1f8..af5afac 100644
--- src/hg/hgApi/hgApi.c
+++ src/hg/hgApi/hgApi.c
@@ -103,55 +103,122 @@
             fail("Missing var parameter");
         struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, TRUE, FALSE); // Tables not files
         struct slPair *pair;
         dyStringPrintf(output, "[\n");
         for (pair = pairs; pair != NULL; pair = pair->next)
             {
             if(pair != pairs)
                 dyStringPrintf(output, ",\n");
             dyStringPrintf(output, "['%s','%s']", javaScriptLiteralEncode(pair->name), javaScriptLiteralEncode(pair->val));
             }
         dyStringPrintf(output, "\n]\n");
         }
     else
         fail("Assembly does not support metaDb");
     }
+#ifdef CV_SEARCH_SUPPORTS_FREETEXT
+// TODO: move to lib since hgTracks and hgApi share
+#define METADATA_VALUE_PREFIX    "hgt_mdbVal"
+else if(startsWith(METADATA_VALUE_PREFIX, cmd))
+    {
+    // Returns metaDb value control: drop down or free text, with or without help link.
+    // e.g. http://genome.ucsc.edu/hgApi?db=hg18&cmd=hgt_mdbVal3&var=cell
+
+    // TODO: Move guts to lib, so that hgTracks::searchTracks.c and hgApi.c can share
+
+    struct sqlConnection *conn = hAllocConn(database);
+    boolean metaDbExists = sqlTableExists(conn, "metaDb");
+    if(metaDbExists)
+        {
+        char *var = cgiOptionalString("var");
+        if(var)
+            var = sqlEscapeString(var);
+        else
+            fail("Missing var parameter");
+
+        int ix = atoi(cmd+strlen(METADATA_VALUE_PREFIX)); // 1 based index
+        if(ix == 0) //
+            fail("Unsupported 'cmd' parameter");
+
+        enum mdbCvSearchable searchBy = mdbCvSearchMethod(var);
+        if (searchBy == cvsSearchBySingleSelect)
+            {
+            dyStringPrintf(output,"<SELECT NAME=\"%s%i\" class='mdbVal single' style='min-width:200px; font-size:.9em;' onchange='findTracksSearchButtonsEnable(true);'>\n",
+                            METADATA_VALUE_PREFIX, ix);
+
+            // Get options list
+            struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, TRUE, FALSE); // Tables not files
+            struct slPair *pair;
+            if (pairs == NULL)
+                fail("No selectable values for this metadata variable");
+
+            dyStringPrintf(output, "<OPTION VALUE='Any'>Any</OPTION>\n");
+            dyStringPrintf(output, "[\n");
+            for (pair = pairs; pair != NULL; pair = pair->next)
+                {
+                dyStringPrintf(output, "<OPTION VALUE=\"%s\">%s</OPTION>\n", javaScriptLiteralEncode(pair->val), javaScriptLiteralEncode(pair->name));
+                }
+            dyStringPrintf(output,"</SELECT>\n");
+            }
+        else if (searchBy == cvsSearchByFreeText)
+            {
+            dyStringPrintf(output,"<input type='text' name='%s%i' value='' class='mdbVal freeText' onkeyup='findTracksSearchButtonsEnable(true);' style='max-width:310px; width:310px; font-size:.9em;'>",
+                            METADATA_VALUE_PREFIX, ix);
+            }
+        //else if (searchBy == cvsSearchByMultiSelect)
+        //    {
+        //    // TO BE IMPLEMENTED
+        //    }
+        //else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByDateRange)
+        //    {
+        //    // TO BE IMPLEMENTED
+        //    }
+        else
+            fail("Metadata variable not searchable");
+        }
+    else
+        fail("Assembly does not support metaDb");
+    }
+#endif///def CV_SEARCH_SUPPORTS_FREETEXT
 else if(!strcmp(cmd, "tableMetadata"))
     { // returns an html table with metadata for a given track
     char *trackName = cgiOptionalString("track");
     boolean showLonglabel = (NULL != cgiOptionalString("showLonglabel"));
     boolean showShortLabel = (NULL != cgiOptionalString("showShortLabel"));
     if (trackName != NULL)
         {
         struct trackDb *tdb = hTrackDbForTrack(database, trackName);
         if (tdb != NULL)
             {
             char * html = metadataAsHtmlTable(database,tdb,showLonglabel,showShortLabel,NULL);
             if (html)
                 {
                 dyStringAppend(output,html);
                 freeMem(html);
                 }
             else
                 dyStringPrintf(output,"No metadata found for track %s.",trackName);
             }
         else
             dyStringPrintf(output,"Track %s not found",trackName);
         }
         else
             dyStringAppend(output,"No track variable found");
     }
 else
+    {
+    warn("unknwon cmd: %s",cmd);
     fail("Unsupported 'cmd' parameter");
+    }
 
 // It's debatable whether the type should be text/plain, text/javascript or application/javascript; I think
 // any of the types containing "javascript" don't work with IE6, so I'm using text/plain
 
 puts("Content-Type:text/javascript\n");
 //puts("\n");
 if(jsonp)
     printf("%s(%s)", jsonp, dyStringContents(output));
 else
     puts(dyStringContents(output));
 
 return 0;
 }