97b43803a09f9085190a3af6bb2b7c63d07016bb
tdreszer
  Mon Aug 22 17:12:52 2011 -0700
Added support for cv terms that are searchable='wildList'.  This type of searching allows comma dilimied lists and '%' wild card.
diff --git src/hg/lib/search.c src/hg/lib/search.c
index 95c4e45..18e3b7b 100644
--- src/hg/lib/search.c
+++ src/hg/lib/search.c
@@ -127,31 +127,33 @@
             var = "cell";
         else
             {
             safef(buf, sizeof(buf), "%s%d", METADATA_VALUE_PREFIX, ix + offset);
             enum cvSearchable searchBy = cvSearchMethod(var);
             if (searchBy == cvSearchByMultiSelect)
                 {
                 // Multi-selects as comma delimited list of values
                 struct slName *vals = cartOptionalSlNameList(cart,buf);
                 if (vals)
                     {
                     val = slNameListToString(vals,','); // A comma delimited list of values
                     slNameFreeList(&vals);
                     }
                 }
-            else if (searchBy == cvSearchBySingleSelect || searchBy == cvSearchByFreeText)
+            else if (searchBy == cvSearchBySingleSelect
+                 ||  searchBy == cvSearchByFreeText
+                 ||  searchBy == cvSearchByWildList)
                 val = cloneString(cartUsualString(cart, buf,ANYLABEL));
             //else if (searchBy == cvSearchByDateRange || searchBy == cvSearchByIntegerRange)
             //    {
             //    // TO BE IMPLEMENTED
             //    }
 
             if (val != NULL && sameString(val, ANYLABEL))
                 val = NULL;
             }
         slPairAdd(&mdbSelectPairs,var,val); // val already cloned
         }
     if(delSearchSelect > 0)
         {
         safef(buf, sizeof(buf), "%s%d", METADATA_NAME_PREFIX, numMetadataSelects + 1);
         cartRemove(cart, buf);
@@ -217,34 +219,42 @@
         struct slPair *pairs = mdbValLabelSearch(conn, mdbSelect->name, MDB_VAL_STD_TRUNCATION, FALSE, !fileSearch, fileSearch); // not tags, either a file or table search
         if (slCount(pairs) > 0)
             {
             char *dropDownHtml = cgiMakeSelectDropList((searchBy == cvSearchByMultiSelect),
                     buf, pairs,mdbSelect->val, ANYLABEL,"mdbVal","style='min-width:200px; font-size:.9em;' onchange='findTracksMdbValChanged(this);'");
             if (dropDownHtml)
                 {
                 dyStringAppend(output,dropDownHtml);
                 freeMem(dropDownHtml);
                 }
             slPairFreeList(&pairs);
             }
         }
     else if (searchBy == cvSearchByFreeText)
         {
-        dyStringPrintf(output,"</td><td align='right' id='isLike%i' style='width:10px; white-space:nowrap;'>contains</td>\n<td nowrap id='%s' style='max-width:600px;'>\n",row,buf);
+        dyStringPrintf(output,"</td><td align='right' id='isLike%i' style='width:10px; white-space:nowrap;'>contains</td>\n<td nowrap id='%s' style='max-width:600px;'>\n",
+                       row,buf);
         dyStringPrintf(output,"<input type='text' name='%s' value='%s' class='mdbVal freeText' style='max-width:310px; width:310px; font-size:.9em;' onchange='findTracksMdbVarChanged(true);'>\n",
                 buf,(mdbSelect->val ? (char *)mdbSelect->val: ""));
         }
+    else if (searchBy == cvSearchByWildList)
+        {
+        dyStringPrintf(output,"</td><td align='right' id='isLike%i' style='width:10px; white-space:nowrap;'>is among</td>\n<td nowrap id='%s' style='max-width:600px;'>\n",
+                       row,buf);
+        dyStringPrintf(output,"<input type='text' name='%s' value='%s' class='mdbVal wildList' title='enter comma separated list of values' style='max-width:310px; width:310px; font-size:.9em;' onchange='findTracksMdbVarChanged(true);'>\n",
+                buf,(mdbSelect->val ? (char *)mdbSelect->val: ""));
+        }
     //else if (searchBy == cvSearchByDateRange || searchBy == cvSearchByIntegerRange)
     //    {
     //    // TO BE IMPLEMENTED
     //    }
     dyStringPrintf(output,"<span id='helpLink%i'>&nbsp;</span></td>\n", row);
     dyStringPrintf(output,"</tr>\n");
     }
 
     dyStringPrintf(output,"<tr><td colspan='%d' align='right' style='height:10px; max-height:10px;'>&nbsp;</td></tr>", cols);
 
 return dyStringCannibalize(&output);
 }
 
 
 static boolean searchMatchToken(char *string, char *token)