58a3bf5fbc986db7c8b17589c9720b4bc6708133
tdreszer
  Tue Mar 8 16:44:22 2011 -0800
Moved a few functions common to track search and file search into library code.  Redesigned a few things to standardize on slPair lists of vals and labels.
diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c
index a53df8a..a220ec6 100644
--- src/hg/hgApi/hgApi.c
+++ src/hg/hgApi/hgApi.c
@@ -1,24 +1,25 @@
 /* hgApi - provide a JSON based API to the browser. */
 
 #include "common.h"
 #include "hdb.h"
 #include "mdb.h"
 #include "cheapcgi.h"
 #include "hPrint.h"
 #include "dystring.h"
 #include "hui.h"
+#include "searchTracks.h"
 
 static char const rcsid[] = "$Id: hgApi.c,v 1.3 2010/05/30 21:11:47 larrym Exp $";
 
 static void fail(char *msg)
 {
 puts("Status: 400\n\n");
 puts(msg);
 exit(-1);
 }
 
 void makeIndent(char *buf, int bufLen, int indent)
 {
 indent = min(indent, bufLen - 2);
 memset(buf, '\t', indent);
 buf[indent] = 0;
@@ -94,87 +95,82 @@
     boolean metaDbExists = sqlTableExists(conn, "metaDb");
     if(metaDbExists)
         {
         char *var = cgiOptionalString("var");
         if(var)
             var = sqlEscapeString(var);
         else
             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, "['%s','%s']", javaScriptLiteralEncode(mdbPairLabel(pair)), javaScriptLiteralEncode(mdbPairVal(pair)));
             }
         dyStringPrintf(output, "\n]\n");
         }
     else
         fail("Assembly does not support metaDb");
     }
 // 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);
+        char name[128];
+        safef(name,sizeof name,"%s%i",METADATA_VALUE_PREFIX,ix);
         if (searchBy == cvsSearchBySingleSelect || searchBy == cvsSearchByMultiSelect)
             {
-            dyStringPrintf(output,"<SELECT NAME='%s%i' onchange='findTracksMdbValChanged(this); style='min-width:200px; font-size:.9em;",METADATA_VALUE_PREFIX,ix);
-            if (searchBy == cvsSearchBySingleSelect)
-                dyStringPrintf(output,"' class='mdbVal'>\n");
-            else
-                dyStringPrintf(output," display:none;' class='mdbVal filterBy' multiple>\n");
-
-            // Get options list
             struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, TRUE, FALSE); // Tables not files
-            if (pairs == NULL)
-                fail("No selectable values for this metadata variable");
-
-            #define ANYLABEL "Any"
-            slPairAdd(&pairs, ANYLABEL, ANYLABEL); // Need to add Any to the list
-            struct slPair *pair;
-            // All options
-            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");
+            if (slCount(pairs) > 0)
+                {
+                char *dropDownHtml = cgiMakeSelectDropList((searchBy == cvsSearchByMultiSelect),
+                        name, pairs,NULL, ANYLABEL,"mdbVal", "style='min-width: 200px; font-size: .9em;' onchange='findTracksMdbValChanged(this);'");
+                if (dropDownHtml)
+                    {
+                    dyStringAppend(output,dropDownHtml);
+                    freeMem(dropDownHtml);
+                    }
             slPairFreeList(&pairs);
             }
+            }
         else if (searchBy == cvsSearchByFreeText)
             {
-            dyStringPrintf(output,"<input type='text' name='%s%i' value='' class='mdbVal freeText' onchange='findTracksMdbValChanged(this);' style='max-width:310px; width:310px; font-size:.9em;'>",
-                            METADATA_VALUE_PREFIX, ix);
+            dyStringPrintf(output,"<input type='text' name='%s' value='' class='mdbVal freeText' onchange='findTracksMdbValChanged(this);' style='max-width:310px; width:310px; font-size:.9em;'>",
+                            name);
             }
         //else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByDateRange)
         //    {
         //    // TO BE IMPLEMENTED
         //    }
         else
             fail("Metadata variable not searchable");
 
         dyStringPrintf(output,"<span id='helpLink%i'>&nbsp;</span>",ix);
         }
     else
         fail("Assembly does not support metaDb");
     }
 else if(!strcmp(cmd, "tableMetadata"))
     { // returns an html table with metadata for a given track