497d85f0a8f8ca48592955b0edd40468305a5be3
tdreszer
  Tue Sep 27 17:08:37 2011 -0700
Major rework of subCfg module to no longer rely upon removing name at initialization.
diff --git src/hg/js/hui.js src/hg/js/hui.js
index 26347e9..742a5b2 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 "scm" if needed
+                        matSubCBsetShadow(this);  // 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);
@@ -99,32 +99,32 @@
     var visDD = normed($("select.visDD")); // limit to hidden
     if (visDD != undefined) {
         if ($(visDD).attr('selectedIndex') == 0) {
             $(visDD).attr('selectedIndex',$(visDD).children('option').length - 1);
             $(visDD).change(); // triggers onchange code effecting inherited subtrack vis
         }
     }
 }
 
 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 "scm" then 'change' event will update it
-    if (isFauxDisabled(subCB,false)) { // disabled subCB is still clickable when "scm"
+    // 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);
     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 );
@@ -187,31 +187,31 @@
     $( 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 "scm" then 'change' event will update it
+            $(this).change() // NOTE: if "subCfg" then 'change' event will update it
             matSubCBsetShadow(this);
         }
     });
     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)
@@ -280,73 +280,73 @@
 {
 // 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 "scm" if needed
+        matSubCBsetShadow(this);    // 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;
-        $(subCB).change();  // NOTE: if "scm" then 'change' event will update it
+        $(subCB).change();  // NOTE: if "subCfg" then 'change' event will update it
         matSubCBsetShadow(subCB);
         hideOrShowSubtrack(subCB);
     }
 }
 
 function matSubCBsetShadow(subCB)
 {
 // Since CBs only get into cart when enabled/checked, the shadow control enables cart to know other states
-//  will update "scm" if needed
+//  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#boolshad_-"+subCB.id));
+    var fourWay = normed($("input.fourWay[name='boolshad\\."+subCB.name+"']"));
     if (fourWay == undefined && subCB.name != undefined) {
-        fourWay = normed($("input.fourWay[name='boolshad\\."+subCB.name+"']"));
+        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(scm) !== "undefined") {
-            scm.enableCfg(subCB,null,(shadowState == 1));
-            $(subCB).change(); // 'change' event will update "scm"
+        if (typeof(subCfg) !== "undefined") {
+            subCfg.enableCfg(subCB,null,(shadowState == 1));
+            /////$(subCB).change(); // 'change' event will update "subCfg"  // FIXME: Is this needed??
         }
     }
 }
 
 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
@@ -482,32 +482,32 @@
             var classList = $( this ).attr("class").split(" ");
             classList = aryRemove(classList,["matCB","abc"]);
             classes.push( classList[0] );
         });
     } else { // No abcCBs so look for filterBox classes
         return filterCompositeClasses(wantSelected);
     }
     return classes;
 }
 
 function matSubCBsSelected()
 {
 // Displays visible and checked track count
     var counter = $('.subCBcount');
     if(counter != undefined) {
-        var subCBs =  $("input.subCB");
-        $(counter).text($(subCBs).filter(":enabled:checked").length + " of " +$(subCBs).length+ " selected");
+        var subCBs =  $("input.subCB");                   // subCfg uses fauxDisabled
+        $(counter).text($(subCBs).filter(":enabled:checked").not('.disabled').length + " of " +$(subCBs).length+ " selected");
     }
 }
 
 /////////////////// subtrack configuration support ////////////////
 function compositeCfgUpdateSubtrackCfgs(inp)
 {
 // Updates all subtrack configuration values when the composite cfg is changed
     // If view association then find it:
     var view = "";
     var daddy = normed($(inp).parents(".blueBox"));
     if(daddy != undefined) {
         var classList = $(daddy).attr("class").split(" ");
         if(classList.length == 2) {
             view = classList[1];
         }
@@ -1107,31 +1107,31 @@
 
 function tableSortAtButtonPress(anchor,tagId)
 { // Special ONLY for hgTrackUi sorting.  Others use utils.js::tableSortOnButtonPress()
     var table = $( anchor ).parents("table.sortable");
     if (table) {
         subtrackCfgHideAll(table);
         waitOnFunction( _tableSortOnButtonPressEncapsulated, anchor, tagId);
     }
     return false;  // called by link so return false means don't try to go anywhere
 }
 
 function fauxDisable(obj,disable,title)
 {// Makes an obj appear disabled, but it isn't
  //  span.disabled & input.disabled is opacity 0.5
  //   div.disabled is border-color: gray; color: gray;
-    if ($(obj).hasClass('subCB') == false || typeof(scm) !== "undefined") {
+    if ($(obj).hasClass('subCB') == false || typeof(subCfg) !== "undefined") {
         if(disable) {
             if ($.browser.msie)
                 $(obj).css('opacity', '0.5');
             $(obj).addClass('disabled');
         } else {
             if ($.browser.msie)
                 $(obj).css('opacity', '1');  // For some reason IE<9 accepts direct change but isn't happy with simply adding class!
             $(obj).removeClass('disabled');
         }
     } else {
         obj.disabled = disable;
     }
     if (arguments.length > 2)
         $(obj).attr("title",title);
 }
@@ -1140,32 +1140,32 @@
 {// Is object [faux] disabled?
     if (orReallyDisabled && obj.disabled)
         return true;
 
     return ($(obj).hasClass('disabled'));
 }
 
 // The following js depends upon the jQuery library
 $(document).ready(function()
 {
     if (normed($('table.subtracks')) != undefined) {
         matInitializeMatrix();
 
         // If divs with class 'subCfg' then initialize the subtrack cfg code
         // NOTE: must be before any ddcl setup
-        if (typeof(scm) !== "undefined" && normed($("div.subCfg")) != undefined) {
-            scm.initialize();
+        if (typeof(subCfg) !== "undefined" && normed($("div.subCfg")) != undefined) {
+            subCfg.initialize();
         }
     }
 
     // Initialize sortable tables
     $('table.sortable').each(function (ix) {
         sortTableInitialize(this,true,true);
     });
 
     // Register tables with drag and drop
     $("table.tableWithDragAndDrop").each(function (ix) {
         tableDragAndDropRegister(this);
     });
 
     // Put navigation links in top corner
     navigationLinksSetup();