dcb06ec7727033f47e202f2db1a0e72f0715fa73
hiram
  Thu Aug 31 11:20:30 2017 -0700
indicate no off-targets for crispr tracks when no data is available refs #20077

diff --git src/hg/hgc/bigBedClick.c src/hg/hgc/bigBedClick.c
index 13dee32..c07211a 100644
--- src/hg/hgc/bigBedClick.c
+++ src/hg/hgc/bigBedClick.c
@@ -58,30 +58,38 @@
 printf("<td>\n");
 char *words[255];
 int wordCount = chopByChar(val, ',', words, ArraySize(words));
 int i;
 printf("<table style='border-style: hidden'><tr>\n");
 for (i=0; i<wordCount; i++)
     printf("<td style='border:1px solid #CCCCCC; font-weight: normal; width:auto'><b>%d mismatches:</b><br>%s off-targets</td>", i, words[i]);
 printf("</tr></table>\n");
 }
 
 static void extFieldCrisprOfftargets(char *val, struct slPair *extraFields)
 /* crispr track: locations of off-targets. A |-separated string of coords, including strand and 
  a score
  e.g. chr15;63615585-;71|chr16;8835640+;70 */
 {
+if (NULL == val)
+    {
+    printf("<br><table class='bedExtraTbl'>\n");
+    printf("<tr><td>Potential Off-targets</td>\n");
+    printf("<td>No Off-targets found for this guide</td></tr>\n");
+    printf("</table>\n");
+    return;
+    }
 printf("<tr><td>Potential Off-targets</td>\n");
 
 printf("<td>\n");
 char *coords[65536];
 int coordCount = chopByChar(val, '|', coords, ArraySize(coords));
 int i;
 
 struct subText *subList = NULL;
 slSafeAddHead(&subList, subTextNew("ig:", "intergenic "));
 slSafeAddHead(&subList, subTextNew("ex:", "exon "));
 slSafeAddHead(&subList, subTextNew("in:", "intron "));
 slSafeAddHead(&subList, subTextNew("|", "-"));
 
 struct sqlConnection *conn = hAllocConn(database);
 
@@ -289,32 +297,37 @@
     {
     char *fieldName = pair->name;
     char *detailsUrl = pair->val;
 
     // get extra bigBed field (=the offset) and seek to it
     void *p = slPairFindVal(extraFields, fieldName);
     if (p==NULL)
         {
         printf("Error when parsing trackDb detailsTabUrls statement:<br>\n");
         printf("Cannot find extra bigBed field with name %s\n", fieldName);
         return;
         }
     char *offsetStr = (char*)p;
 
     if (offsetStr==NULL || sameWord(offsetStr, "0"))
+	{
+	/* need to show the empty off-targets for crispr tracks */
+	if (startsWith("crispr", tdb->track))
+	    extFieldCrisprOfftargets(NULL, NULL);
         // empty or "0" value in bigBed means that the lookup should not be performed
         continue;
+	}
     off_t offset = atoll(offsetStr);
 
     seekAndPrintTable(detailsUrl, offset, extraFields);
     }
 slPairFreeValsAndList(&detailsUrls);
 }
 
 static void bigBedClick(char *fileName, struct trackDb *tdb,
                      char *item, int start, int end, int bedSize)
 /* Handle click in generic bigBed track. */
 {
 boolean showUrl = FALSE;
 char *chrom = cartString(cart, "c");
 
 /* Open BigWig file and get interval list. */