b4ac25c5138fbad826427cdade2bdd627dc10745
tdreszer
  Wed Sep 28 15:07:50 2011 -0700
A few nice bug catches due to walking through code in firebug.
diff --git src/hg/js/hui.js src/hg/js/hui.js
index 742a5b2..6edfb15 100644
--- src/hg/js/hui.js
+++ src/hg/js/hui.js
@@ -49,31 +49,31 @@
                     var classList = $( this ).attr("class").split(" ");
                     classesAbcChecked.push( aryRemove(classList,["matCB","disabled","abc"]) );
                 });
 
                 // Walk through checked non-ABC matCBs and sheck related subCBs
                 var subCBs = $("input.subCB").filter("."+view).not(":checked");
                 matCBs.not(".abc").each( function (i) {
                     var classList = $( this ).attr("class").split(" ");
                     classList = aryRemove(classList,["matCB","disabled"]);
                     var subCBsMatching = objsFilterByClasses(subCBs,"and",classList);
                     if (classesAbcChecked.length>0)
                         subCBsMatching = objsFilterByClasses(subCBsMatching,"or",classesAbcChecked);
                     // Check the subCBs that belong to this view and checked matCBs
                     subCBsMatching.each( function (i) {
                         this.checked = true;
-                        matSubCBsetShadow(this);  // will update "subCfg" if needed
+                        matSubCBsetShadow(this,true);  // will update "subCfg" if needed
                         hideOrShowSubtrack(this);
                     });
                 });
             } // If no matrix, then enabling is all that was needed.
 
             // fix 3-way which may need to go from unchecked to .disabled
             var matCBs = $("input.matCB").not(".abc").not(".disabled").not(":checked");
             if(matCBs.length > 0) {
                 $( matCBs ).each( function (i) { matChkBoxNormalize( this, classesHidden ); });
             }
         }
     }
     // fix 3-way matCBs which may need to go from disabled to checked or unchecked depending
     var matCBs = $("input.matCB").not(":checked").not(".disabled");
     var matCBs = matCBsWhichAreComplete(false);
@@ -104,31 +104,31 @@
         }
     }
 }
 
 function matSubCbClick(subCB)
 {
 // subCB:onclick  When a subtrack checkbox is clicked, it may result in
 // Clicking/unclicking the corresponding matrix CB.  Also the
 // subtrack may be hidden as a result.
 
     // NOTE: if "subCfg" then 'change' event will update it
     if (isFauxDisabled(subCB,false)) { // disabled subCB is still clickable when "subCfg"
         subCB.checked = true;
         fauxDisable(subCB,false,""); // enable and get rid of message
     }
-    matSubCBsetShadow(subCB);
+    matSubCBsetShadow(subCB,false);
     hideOrShowSubtrack(subCB);
     // When subCBs are clicked, 3-state matCBs may need to be set
     var classes = matViewClasses('hidden');
     classes = classes.concat( matAbcCBclasses(false) );
     var matCB = matCbFindFromSubCb( subCB );
     if( matCB != undefined ) {
         matChkBoxNormalize( matCB, classes );
     }
     //var abcCB = matAbcCbFindFromSubCb( subCB );
     //if( abcCB != undefined ) {
     //    matChkBoxNormalize( abcCB, classes );
     //}
 
     if(subCB.checked)
         exposeAll();  // Unhide composite vis?
@@ -187,32 +187,32 @@
     $( matCBs ).each( function (i) {
         this.checked = state;
         matCbComplete(this,true);
     });
     var subCbs = $("input.subCB");
     for(var vIx=1;vIx<arguments.length;vIx++) {
         subCbs = $( subCbs ).filter("."+arguments[vIx]);  // Successively limit list by additional classes.
     }
     if(state) { // If clicking [+], further limit to only checked ABCs
         var classes = matAbcCBclasses(false);
         subCbs = objsFilterByClasses(subCbs,"not",classes);  // remove unchecked abcCB classes
     }
     $( subCbs ).each( function (i) {
         if (this.checked != state) {
             this.checked = state;
-            $(this).change() // NOTE: if "subCfg" then 'change' event will update it
-            matSubCBsetShadow(this);
+            matSubCBsetShadow(this,false);
+            $(this).change();  // NOTE: if "subCfg" then 'change' event will update it
         }
     });
     if(state)
         exposeAll();  // Unhide composite vis?
     showOrHideSelectedSubtracks();
     matSubCBsSelected();
     //jQuery(this).css('cursor', '');
 
     var tbody = $( subCbs[0] ).parents('tbody.sorting');
     if (tbody != undefined)
          $(tbody).removeClass('sorting');
     return true;
 }
 function matSetMatrixCheckBoxes(state)
 { // Called exclusively by matrix [+][-] buttons on click
@@ -280,73 +280,74 @@
 {
 // Enables/Disables subtracks checkboxes.  If additional arguments are passed in, the list of CBs will be narrowed by the classes
     var subCBs = $("input.subCB");
     for(var vIx=1;vIx<arguments.length;vIx++) {
         if(arguments[vIx].length > 0)
             subCBs = subCBs.filter("."+arguments[vIx]);  // Successively limit list by additional classes.
     }
     subCBs.each( function (i) {
         if(state) {
             fauxDisable(this,false,'');
             $(this).parent().attr('cursor','');
         } else {
             fauxDisable(this,true, 'view is hidden');
             $(this).parent().attr('cursor','pointer');
         }
-        matSubCBsetShadow(this);    // will update "subCfg" if needed
+        matSubCBsetShadow(this,true);    // will update "subCfg" if needed
         hideOrShowSubtrack(this);
     });
 
     return true;
 }
 
 function matSubCBcheckOne(subCB,state)
 {
 // setting a single subCB may cause it to appear/disappear
     if (subCB.checked != state) {
         subCB.checked = state;
+        matSubCBsetShadow(subCB,false);
         $(subCB).change();  // NOTE: if "subCfg" then 'change' event will update it
-        matSubCBsetShadow(subCB);
         hideOrShowSubtrack(subCB);
     }
 }
 
-function matSubCBsetShadow(subCB)
+function matSubCBsetShadow(subCB,triggerChange)
 {
 // Since CBs only get into cart when enabled/checked, the shadow control enables cart to know other states
 //  will update "subCfg" if needed
     var shadowState = 0;
     if(subCB.checked)
         shadowState = 1;
     //if(subCB.disabled)
     if (isFauxDisabled(subCB,true))
         shadowState -= 2;
-    var fourWay = normed($("input.fourWay[name='boolshad\\."+subCB.name+"']"));
+    var fourWay = normed($("input.cbShadow[name='boolshad\\."+subCB.name+"']"));
     if (fourWay == undefined && subCB.name != undefined) {
         fourWay = normed($("input.cbShadow#boolshad_-"+subCB.id));  // subCfg noname version specific
         if (fourWay == undefined)
             fourWay = normed($("#"+subCB.name+"_4way"));  // FIXME: obsolete as soon as subCfg is working
     }
     if (fourWay == undefined) {
         warn("DEBUG: Failed to find fourWay shadow for '#"+subCB.id+"' ["+subCB.name+"]");
         return;
     }
     if ($(fourWay).val() != shadowState.toString()) {
         $(fourWay).val(shadowState);
         if (typeof(subCfg) !== "undefined") {
             subCfg.enableCfg(subCB,null,(shadowState == 1));
-            /////$(subCB).change(); // 'change' event will update "subCfg"  // FIXME: Is this needed??
+            if (triggerChange)
+                $(subCB).change(); // 'change' event will update "subCfg"  // FIXME: Is this needed?  YES.  But not on direct cb click
         }
     }
 }
 
 function matChkBoxNormalize(matCB)
 {
 // Makes sure matCBs are in one of 3 states (checked,unchecked,indeterminate) based on matching set of subCBs
     var classList = $( matCB ).attr("class").split(" ");
     var isABC = (aryFind(classList,"abc") != -1);
     if(isABC)
         alert("ASSERT: matChkBoxNormalize() called for dim ABC!");
     classList = aryRemove(classList,["matCB","disabled"]);
 
     var classes = '.' + classList.join(".");// created string filter of classes converting "matCB K562 H3K4me1" as ".K562.H3K4me1"
     var subCBs = $("input.subCB").filter(classes); // All subtrack CBs that match matrix CB