a857c28d322f6bec282372ca7c1d84d4eccdf6a4
tdreszer
  Mon Jan 31 13:35:54 2011 -0800
Reworked searchTracks +/- buttons to use javascript and fixed some bugs seen when files search is enabled as a tab in track search.
diff --git src/hg/hgTracks/searchTracks.c src/hg/hgTracks/searchTracks.c
index 5281d15..9a0187e 100644
--- src/hg/hgTracks/searchTracks.c
+++ src/hg/hgTracks/searchTracks.c
@@ -417,58 +417,74 @@
     mdbVar = needMem(sizeof(char *) * numMetadataSelects);
     mdbVal = needMem(sizeof(char *) * numMetadataSelects);
     mdbVar[0] = "cell";
     mdbVar[1] = "antibody";
     mdbVal[0] = ANYLABEL;
     mdbVal[1] = ANYLABEL;
     }
 
     hPrintf("<tr><td colspan='%d' align='right' class='lineOnTop' style='height:20px; max-height:20px;'><em style='color:%s; width:200px;'>ENCODE terms</em></td></tr>", cols,COLOR_DARKGREY);
     for(i = 0; i < numMetadataSelects; i++)
         {
         char **terms = NULL, **labels = NULL;
         char buf[256];
         int len;
 
-    #define PRINT_BUTTON(name,value,msg,js) printf("<input type='submit' name='%s' value='%s' style='font-size:.7em;' title='%s' onclick='%s'>", (name), (value), (msg), (js));
-        hPrintf("<tr><td>\n");
+    #define PLUS_MINUS_BUTTON "<input type='button' id='%sButton%d' value='%c' style='font-size:.7em;' title='%s' onclick='findTracksMdbSelectPlusMinus(this,%d)'>"
+    #define PRINT_PM_BUTTON(type,num,value) printf(PLUS_MINUS_BUTTON, (type), (num), (value), ((value) == '+' ? "add another row after":"delete"), (num));
+    #ifndef PLUS_MINUS_BUTTON
+        #define PRINT_BUTTON(name,value,msg,js) printf("<input type='submit' name='%s' value='%s' style='font-size:.7em;' title='%s this row' onclick='%s'>", (name), (value), (msg), (js));
+    #endif//ndef PLUS_MINUS_BUTTON
+        hPrintf("<tr class='mdbSelect'><td nowrap>\n");
         if(numMetadataSelects > 2 || i >= 2)
             {
+        #ifdef PLUS_MINUS_BUTTON
+            PRINT_PM_BUTTON("minus", i + 1, '-');
+        #else///ifndef PLUS_MINUS_BUTTON
             safef(buf, sizeof(buf), "return delSearchSelect(this, %d);", i + 1);
             PRINT_BUTTON(TRACK_SEARCH, "-", "delete this row", buf);
+        #endif//ndef PLUS_MINUS_BUTTON
             }
         else
             hPrintf("&nbsp;");
+    #ifdef PLUS_MINUS_BUTTON
+        PRINT_PM_BUTTON("plus", i + 1, '+');
+    #else///ifndef PLUS_MINUS_BUTTON
         hPrintf("</td><td>\n");
         safef(buf, sizeof(buf), "return addSearchSelect(this, %d);", i + 1);
         PRINT_BUTTON(TRACK_SEARCH, "+", "add another row after this row", buf);
+    #endif//ndef PLUS_MINUS_BUTTON
 
         hPrintf("</td><td>and&nbsp;</td><td colspan=3 nowrap>\n");
         safef(buf, sizeof(buf), "%s%i", METADATA_NAME_PREFIX, i + 1);
-        cgiDropDownWithTextValsAndExtra(buf, mdbVarLabels, mdbVars,count,mdbVar[i],"class='mdbVar' style='font-size:.9em;' onchange='findTracksMdbVarChanged2(this);'");
+        cgiDropDownWithTextValsAndExtra(buf, mdbVarLabels, mdbVars,count,mdbVar[i],"class='mdbVar' style='font-size:.9em;' onchange='findTracksMdbVarChanged(this);'");
         // TODO: move to lib since hgTracks and hgApi share
         enum mdbCvSearchable searchBy = mdbCvSearchMethod(mdbVar[i]);
         if (searchBy == cvsSearchByMultiSelect)
             {
             // TO BE IMPLEMENTED
             }
         else if (searchBy == cvsSearchBySingleSelect)
             {
             safef(buf, sizeof(buf), "%s%i", METADATA_VALUE_PREFIX, i + 1);
             hPrintf("</td><td align='right' id='isLike%d' style='width:10px;'>is</td><td nowrap id='%s' style='max-width:600px;'>\n",i + 1,buf);
             len = getTermArray(conn, &labels, &terms, mdbVar[i]);
+        #ifdef PLUS_MINUS_BUTTON
+            cgiMakeDropListFull(buf, labels, terms, len, mdbVal[i], "class='mdbVal single' style='min-width:200px; font-size:.9em;' onchange='findTracksMdbValChanged(this);'");
+        #else///ifndef PLUS_MINUS_BUTTON
             cgiMakeDropListFull(buf, labels, terms, len, mdbVal[i], "class='mdbVal single' style='min-width:200px; font-size:.9em;' onchange='findTracksSearchButtonsEnable(true);'");
+        #endif//ndef PLUS_MINUS_BUTTON
             }
         else if (searchBy == cvsSearchByFreeText)
             {
             safef(buf, sizeof(buf), "%s%i", METADATA_VALUE_PREFIX, i + 1);
             hPrintf("</td><td align='right' id='isLike%d' style='width:10px;'>contains</td><td nowrap id='%s' style='max-width:600px;'>\n",i + 1,buf);
             hPrintf("<input type='text' name='%s' value='%s' class='mdbVal freeText' onkeyup='findTracksSearchButtonsEnable(true);' style='max-width:310px; width:310px; font-size:.9em;'>",
                     buf,(mdbVal[i] ? mdbVal[i]: ""));
             }
         else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByIntegerRange)
             {
             // TO BE IMPLEMENTED
             }
         hPrintf("<span id='helpLink%d'>help</span></td>\n", i + 1);
         hPrintf("</tr>\n");
         }
@@ -913,46 +929,46 @@
 hPrintf("<input type='hidden' name='%s' id='currentTab' value='%s'>\n", TRACK_SEARCH_CURRENT_TAB, currentTab);
 hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_DEL_ROW);
 hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_ADD_ROW);
 hPrintf("<input type='hidden' name='%s' value=''>\n",TRACK_SEARCH_PAGER);
 
 hPrintf("<div id='tabs' style='display:none; %s'>\n"
         "<ul>\n"
         "<li><a href='#simpleTab'><B style='font-size:.9em;font-family: arial, Geneva, Helvetica, san-serif;'>Search</B></a></li>\n"
         "<li><a href='#advancedTab'><B style='font-size:.9em;font-family: arial, Geneva, Helvetica, san-serif;'>Advanced</B></a></li>\n"
 #ifdef FILES_SEARCH
         "<li><a href='#filesTab'><B style='font-size:.9em;font-family: arial, Geneva, Helvetica, san-serif;'>Files</B></a></li>\n"
 #endif///def FILES_SEARCH
         "</ul>\n"
         "<div id='simpleTab' style='max-width:inherit;'>\n",cgiBrowser()==btIE?"width:1060px;":"max-width:inherit;");
 
-hPrintf("<table style='width:100%%; font-size:.9em;'><tr><td colspan='2'>");
+hPrintf("<table id='simpleTable' style='width:100%%; font-size:.9em;'><tr><td colspan='2'>");
 hPrintf("<input type='text' name='%s' id='simpleSearch' class='submitOnEnter' value='%s' style='max-width:1000px; width:100%%;' onkeyup='findTracksSearchButtonsEnable(true);'>\n",
         TRACK_SEARCH_SIMPLE,descSearch == NULL ? "" : descSearch);
 if (selectedTab==simpleTab && descSearch)
     searchTermsExist = TRUE;
 
 hPrintf("</td></tr><td style='max-height:4px;'></td></tr></table>");
 //hPrintf("</td></tr></table>");
 hPrintf("<input type='submit' name='%s' id='searchSubmit' value='search' style='font-size:.8em;'>\n", TRACK_SEARCH);
 hPrintf("<input type='button' name='clear' value='clear' class='clear' style='font-size:.8em;' onclick='findTracksClear();'>\n");
 hPrintf("<input type='submit' name='submit' value='cancel' class='cancel' style='font-size:.8em;'>\n");
 hPrintf("</div>\n");
 
 // Advanced tab
 hPrintf("<div id='advancedTab' style='width:inherit;'>\n"
-        "<table cellSpacing=0 style='width:inherit; font-size:.9em;'>\n");
+        "<table id='advancedTable' cellSpacing=0 style='width:inherit; font-size:.9em;'>\n");
 cols = 8;
 
 // Track Name contains
 hPrintf("<tr><td colspan=3></td>");
 hPrintf("<td nowrap><b style='max-width:100px;'>Track&nbsp;Name:</b></td>");
 hPrintf("<td align='right'>contains</td>\n");
 hPrintf("<td colspan='%d'>", cols - 4);
 hPrintf("<input type='text' name='%s' id='nameSearch' class='submitOnEnter' value='%s' onkeyup='findTracksSearchButtonsEnable(true);' style='min-width:326px; font-size:.9em;'>",
         TRACK_SEARCH_ON_NAME, nameSearch == NULL ? "" : nameSearch);
 hPrintf("</td></tr>\n");
 
 // Description contains
 hPrintf("<tr><td colspan=2></td><td align='right'>and&nbsp;</td>");
 hPrintf("<td><b style='max-width:100px;'>Description:</b></td>");
 hPrintf("<td align='right'>contains</td>\n");
@@ -989,31 +1005,31 @@
 if(metaDbExists)
     numMetadataSelects = printMdbSelects(conn, cart, selectedTab, &mdbVar, &mdbVal, &numMetadataNonEmpty, cols);
 else
     numMetadataSelects = 0;
 
 hPrintf("</table>\n");
 hPrintf("<input type='submit' name='%s' id='searchSubmit' value='search' style='font-size:.8em;'>\n", TRACK_SEARCH);
 hPrintf("<input type='button' name='clear' value='clear' class='clear' style='font-size:.8em;' onclick='findTracksClear();'>\n");
 hPrintf("<input type='submit' name='submit' value='cancel' class='cancel' style='font-size:.8em;'>\n");
 //hPrintf("<a target='_blank' href='../goldenPath/help/trackSearch.html'>help</a>\n");
 hPrintf("</div>\n");
 
 #ifdef FILES_SEARCH
 // Files tab
 hPrintf("<div id='filesTab' style='width:inherit;'>\n"
-        "<table cellSpacing=0 style='width:inherit; font-size:.9em;'>\n");
+        "<table id='filesTable' cellSpacing=0 style='width:inherit; font-size:.9em;'>\n");
 cols = 8;
 
 //// Track Name contains
 //hPrintf("<tr><td colspan=3></td>");
 //hPrintf("<td nowrap><b style='max-width:100px;'>Track&nbsp;Name:</b></td>");
 //hPrintf("<td align='right'>contains</td>\n");
 //hPrintf("<td colspan='%d'>", cols - 4);
 //hPrintf("<input type='text' name='%s' id='nameSearch' class='submitOnEnter' value='%s' onkeyup='findTracksSearchButtonsEnable(true);' style='min-width:326px; font-size:.9em;'>",
 //        TRACK_SEARCH_ON_NAME, nameSearch == NULL ? "" : nameSearch);
 //hPrintf("</td></tr>\n");
 //
 //// Description contains
 //hPrintf("<tr><td colspan=2></td><td align='right'>and&nbsp;</td>");
 //hPrintf("<td><b style='max-width:100px;'>Description:</b></td>");
 //hPrintf("<td align='right'>contains</td>\n");
@@ -1101,51 +1117,53 @@
     struct slPair *mdbPairs = NULL;
     for(ix = 0; ix < numMetadataSelects; ix++)
         {
         if(!isEmpty(mdbVal[ix]))
             slAddHead(&mdbPairs,slPairNew(mdbVar[ix],mdbVal[ix]));
         }
     slReverse(&mdbPairs);
 
     // Now search
     struct slRef *tracks = NULL;
     if(selectedTab==simpleTab)
         tracks = simpleSearchForTracksstruct(trix,descWords,descWordCount);
     else if(selectedTab==advancedTab)
         tracks = advancedSearchForTracks(conn,groupList,descWords,descWordCount,nameSearch,typeSearch,descSearch,groupSearch,mdbPairs);
 #ifdef FILES_SEARCH
-    else if(selectedTab==filesTab)
+    else if(selectedTab==filesTab && mdbPairs != NULL)
         fileSearchResults(database, conn, mdbPairs, fileTypeSearch);
 #endif///def FILES_SEARCH
 
     if (measureTiming)
         uglyTime("Searched for tracks");
 
+    if (tracks != NULL)
+        {
     // Sort and Print results
     if(selectedTab!=filesTab)
         {
         enum sortBy sortBy = cartUsualInt(cart,TRACK_SEARCH_SORT,sbRelevance);
         tracksFound = slCount(tracks);
         if(tracksFound > 1)
             findTracksSort(&tracks,sortBy);
 
         displayFoundTracks(cart,tracks,tracksFound,sortBy);
 
         if (measureTiming)
             uglyTime("Displayed found tracks");
         }
-
+        }
     slPairFreeList(&mdbPairs);
     }
 hFreeConn(&conn);
 
 webNewSection("About Track Search");
 if(metaDbExists)
     hPrintf("<p>Search for terms in track names, descriptions, groups, and ENCODE "
             "metadata.  If multiple terms are entered, only tracks with all terms "
             "will be part of the results.");
 else
     hPrintf("<p>Search for terms in track descriptions, groups, and names. "
             "If multiple terms are entered, only tracks with all terms "
             "will be part of the results.");
 hPrintf("<BR><a target='_blank' href='../goldenPath/help/trackSearch.html'>more help</a></p>\n");
 webEndSectionTables();