2a17d0be037117b42ee7c740fd98fadf0e58aff2
max
  Mon Sep 12 16:58:05 2016 -0700
changes after code review, refs #18067

diff --git src/hg/hgc/bigBedClick.c src/hg/hgc/bigBedClick.c
index 7d12190..a350096 100644
--- src/hg/hgc/bigBedClick.c
+++ src/hg/hgc/bigBedClick.c
@@ -39,51 +39,48 @@
 /* given two strings of same length, print . for every match and for mismatches, the letter of b */
 {
 int i = 0;
 while (TRUE)
     {
     if (a[i]=='\0' || b[i]=='\0')
         break;
     if (a[i]==b[i])
         printf(".");
     else
         printf("%c", (b[i]));
     i++;
     }
 }
 
-static void detailsTabPrintSpecial(char *name, char *val, struct slPair *extraFields)
-/* some extra fields require special printing code, they all start with '_'  */
-{
-// crispr track: number of mismatches. A comma-sep string of integers
-if (sameWord(name, "_mismatchCounts"))
+static void extFieldMismatchCounts(char *val)
+/* crispr track: number of mismatches. A comma-sep string of integers */
 {
 printf("<tr><td>Number of potential off-targets</td>\n");
 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");
 }
 
-// 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 (sameWord(name, "_crisprOfftargets"))
+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 */
 {
 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);
@@ -170,30 +167,38 @@
 if (collapsed)
     {
     printf("<p><a id='crisprShowAllLink' href='javascript:crisprShowAll()'>"
         "Show all %d off-targets...</a>\n", coordCount);
     // inline .js is bad style but why pollute our global .js files for such a rare
     // case? Maybe we should have a generic "collapsible" class, like bootstrap?
     printf("<script>\n");
     printf("function crisprShowAll() {\n");
     printf("    $('#crisprShowAllLink').hide();\n");
     printf("    $('.crisprLinkHidden').show();\n");
     printf("    return false;\n");
     printf("}\n");
     printf("</script>\n");
     }
 }
+
+static void detailsTabPrintSpecial(char *name, char *val, struct slPair *extraFields)
+/* some extra fields require special printing code, they all start with '_'  */
+{
+if (sameWord(name, "_mismatchCounts"))
+    extFieldMismatchCounts(val);
+else if (sameWord(name, "_crisprOfftargets"))
+    extFieldCrisprOfftargets(val, extraFields);
 }
 
 static void seekAndPrintTable(char *url, off_t offset, struct slPair *extraFields)
 /* seek to 0 at url, get headers, then seek to offset, read tab-sep fields and output 
  * (extraFields are needed for some special field handlers) */
 {
 char *detailsUrl = replaceChars(url, "$db", database);
 
 // open the URL
 struct lineFile *lf = lineFileUdcMayOpen(detailsUrl, FALSE);
 if (lf==NULL)
     {
     printf("Error: Could not open the URL referenced in detailsTabUrls, %s", detailsUrl);
     return;
     }