f31ae6fdae48d29026bf9167de2558d5900a6323
tdreszer
  Fri Feb 25 11:56:39 2011 -0800
Another step towards supporting multi-selects in track search and file search
diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c
index 8672362..a53df8a 100644
--- src/hg/hgApi/hgApi.c
+++ src/hg/hgApi/hgApi.c
@@ -124,70 +124,66 @@
 
     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");
 
-        char *onChange="findTracksMdbValChanged(this);";
-    #define PLUS_MINUS_BUTTON_BY_JS
-    #ifndef PLUS_MINUS_BUTTON_BY_JS
-        onChange="findTracksSearchButtonsEnable(this);";
-    #endif///ndef PLUS_MINUS_BUTTON_BY_JS
         enum mdbCvSearchable searchBy = mdbCvSearchMethod(var);
-        if (searchBy == cvsSearchBySingleSelect)
+        if (searchBy == cvsSearchBySingleSelect || searchBy == cvsSearchByMultiSelect)
             {
-            dyStringPrintf(output,"<SELECT NAME=\"%s%i\" class='mdbVal single' style='min-width:200px; font-size:.9em;' onchange='%s'>\n",
-                            METADATA_VALUE_PREFIX, ix, onChange);
+            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
-            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");
+            #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");
+            slPairFreeList(&pairs);
             }
         else if (searchBy == cvsSearchByFreeText)
             {
-            dyStringPrintf(output,"<input type='text' name='%s%i' value='' class='mdbVal freeText' onkeyup='%s' style='max-width:310px; width:310px; font-size:.9em;'>",
-                            METADATA_VALUE_PREFIX, ix, onChange);
+            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);
             }
-        //else if (searchBy == cvsSearchByMultiSelect)
-        //    {
-        //    // TO BE IMPLEMENTED
-        //    }
         //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
     char *trackName = cgiOptionalString("track");
     boolean showLonglabel = (NULL != cgiOptionalString("showLonglabel"));
     boolean showShortLabel = (NULL != cgiOptionalString("showShortLabel"));
     if (trackName != NULL)
         {
         struct trackDb *tdb = hTrackDbForTrackAndAncestors(database, trackName); // Doesn't get whole track list
         if (tdb != NULL)
             {
             char * html = metadataAsHtmlTable(database,tdb,showLonglabel,showShortLabel,NULL);