b9f7469b125c83471a07002d953acbc50876a120
angie
  Mon Oct 24 17:07:27 2011 -0700
Code review advice from Tim about how to properly use ClosestToHome.
diff --git src/hg/lib/cart.c src/hg/lib/cart.c
index 66bbd7e..48e8cc5 100644
--- src/hg/lib/cart.c
+++ src/hg/lib/cart.c
@@ -908,30 +908,51 @@
     }
 }
 
 boolean cartVarExists(struct cart *cart, char *var)
 /* Return TRUE if variable is in cart. */
 {
 return hashFindVal(cart->hash, var) != NULL;
 }
 
 boolean cartListVarExists(struct cart *cart, char *var)
 /* Return TRUE if a list variable is in cart (list may still be empty). */
 {
 return cartVarExists(cart, cartMultShadowVar(cart, var));
 }
 
+boolean cartListVarExistsAnyLevel(struct cart *cart, struct trackDb *tdb,
+				  boolean compositeLevel, char *suffix)
+/* Return TRUE if a list variable for tdb->track (or tdb->parent->track,
+ * or tdb->parent->parent->track, etc.) is in cart (list itself may be NULL). */
+{
+if (compositeLevel)
+    tdb = tdb->parent;
+for ( ; tdb != NULL; tdb = tdb->parent)
+    {
+    char var[PATH_LEN];
+    if (suffix[0] == '.' || suffix[0] == '_')
+        safef(var, sizeof var, "%s%s%s", cgiMultListShadowPrefix(), tdb->track, suffix);
+    else
+        safef(var, sizeof var, "%s%s.%s", cgiMultListShadowPrefix(), tdb->track, suffix);
+    char *cartSetting = hashFindVal(cart->hash, var);
+    if (cartSetting != NULL)
+	return TRUE;
+    }
+return FALSE;
+}
+
 char *cartString(struct cart *cart, char *var)
 /* Return string valued cart variable. */
 {
 return hashMustFindVal(cart->hash, var);
 }
 
 char *cartOptionalString(struct cart *cart, char *var)
 /* Return string valued cart variable or NULL if it doesn't exist. */
 {
 return hashFindVal(cart->hash, var);
 }
 
 char *cartNonemptyString(struct cart *cart, char *name)
 /* Return string value associated with name.  Return NULL
  * if value doesn't exist or if it is pure white space. */