fcccdfc15c15096674cea4176724ad95a340b3d4
tdreszer
  Tue Aug 2 15:48:52 2011 -0700
More incremental work on subCfg
diff --git src/hg/js/hui.js src/hg/js/hui.js
index 4f274b0..1344e76 100644
--- src/hg/js/hui.js
+++ src/hg/js/hui.js
@@ -86,57 +86,63 @@
         }
     }
     matSubCBsSelected();
     obj.lastIndex = obj.selectedIndex;
 }
 
 function matSelectViewForSubTracks(obj,view)
 {
     waitOnFunction( _matSelectViewForSubTracks, obj,view);
 }
 
 function exposeAll()
 {
     // Make main display dropdown show full if currently hide
     var visDD = $("select.visDD"); // limit to hidden
-    if ($(visDD).length == 1 && $(visDD).attr('selectedIndex') == 0)   // limit to hidden
+    if ($(visDD).length == 1) {
+        visDD = visDD[0];              // limit to hidden
+        if ($(visDD).attr('selectedIndex') == 0) {
         $(visDD).attr('selectedIndex',$(visDD).children('option').length - 1);
+            scm.propagateVis(visDD);
+        }
+    }
 }
 
 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.
-    matSubCBsetShadow(subCB);
-    hideOrShowSubtrack(subCB);
+    scm.checkOneSubtrack(subCB,subCB.checked,!subCB.disabled);
+    //////////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 );
     //}
 
     if(subCB.checked)
         exposeAll();  // Unhide composite vis?
 
-    scm.enableCfg(subCB,null,subCB.checked);
+    ///////////scm.enableCfg(subCB,null,subCB.checked);
 
     matSubCBsSelected();
 }
 
 function matCbClick(matCB)
 {
 // matCB:onclick  When a matrix CB is clicked, the set of subtracks checked may change
 // Also called indirectly by matButton:onclick via matSetMatrixCheckBoxes
 
     var classList = $( matCB ).attr("class").split(" ");
     var isABC = (aryFind(classList,"abc") != -1);
     classList = aryRemove(classList,"matCB","halfVis","abc");
     if(classList.length == 0 )
        matSubCBsCheck(matCB.checked);
     else if(classList.length == 1 )
@@ -169,45 +175,47 @@
     matSubCBsSelected();
 }
 
 function _matSetMatrixCheckBoxes(state)
 {
 // matButtons:onclick Set all Matrix checkboxes to state.  If additional arguments are passed in, the list of CBs will be narrowed by the classes
     //jQuery(this).css('cursor', 'wait');
     var matCBs = $("input.matCB").not(".abc");
     for(var vIx=1;vIx<arguments.length;vIx++) {
         matCBs = $( matCBs ).filter("."+arguments[vIx]);  // Successively limit list by additional classes.
     }
     $( matCBs ).each( function (i) {
         this.checked = state;
         matCbComplete(this,true);
     });
-    subCbs = $("input.subCB");
+    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) {
-        this.checked = state;
-        matSubCBsetShadow(this);
+        scm.checkOneSubtrack(this,state,!(this.disabled));
+        /////////this.checked = state;
+        /////////matSubCBsetShadow(this);
+        /////////scm.enableCfg(this,null,this.checked);
     });
     if(state)
         exposeAll();  // Unhide composite vis?
-    showOrHideSelectedSubtracks();
+    ////////showOrHideSelectedSubtracks();
     matSubCBsSelected();
     //jQuery(this).css('cursor', '');
 
     var tbody = $( subCbs[0] ).parents('tbody.sorting');
     if (tbody != undefined)
          $(tbody).removeClass('sorting');
     return true;
 }
 function matSetMatrixCheckBoxes(state)
 {
     var tbody = $( 'tbody.sortable');
     if (tbody != undefined)
          $(tbody).addClass('sorting');
 
     if (arguments.length >= 5)
@@ -235,30 +243,31 @@
 // 2) 3 state matCBs for dimX and Y but not for Z (checked,unchecked,indeterminate (incomplete set of subCBs for this matCB))
 // 3) cart vars for viewDD, abcCBs and subCBs but matCBs set by the state of those 3
 // What is awkward or does not work
 // A) Awkward: matCB could be 5 state (all,none,subset,superset,excusive non-matching set)
 function matSubCBsCheck(state)
 {
 // Set all subtrack checkboxes to state.  If additional arguments are passed in, the list of CBs will be narrowed by the classes
 // called by matCB clicks (matCbClick()) !
     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 checking subCBs, then make sure up to 3 dimensions of matCBs agree with each other on subCB verdict
         var classes = matAbcCBclasses(false);
+        if (classes.length > 0)
         subCBs = objsFilterByClasses(subCBs,"not",classes);  // remove unchecked abcCB classes
         if(arguments.length == 1 || arguments.length == 3) { // Requested dimX&Y: check dim ABC state
             $( subCBs ).each( function (i) { matSubCBcheckOne(this,state); });
         } else {//if(arguments.length == 2) { // Requested dim ABC (or only 1 dimension so this code is harmless)
             var matXY = $("input.matCB").not(".abc");  // check X&Y state
             matXY = $( matXY ).filter(":checked");
             for(var mIx=0;mIx<matXY.length;mIx++) {
                 var classes = $(matXY[mIx]).attr("class").split(' ');
                 classes = aryRemove(classes,"matCB","halfVis");
                 $( subCBs ).filter('.'+classes.join(".")).each( function (i) { matSubCBcheckOne(this,state); });
             }
         }
     } else  // state not checked so no filtering by other matCBs needed
         subCBs.each( function (i) { matSubCBcheckOne(this,state); });
 
@@ -571,103 +580,30 @@
     return true;
 }
 
 function subtrackCfgHideAll(table)
 {
 // hide all the subtrack configuration stuff
     $("div[id $= '_cfg']").each( function (i) {
         $( this ).css('display','none');
         $( this ).children("input[name$='.childShowCfg']").val("off");
     });
     // Hide all "..." metadata displayed
     $("div[id $= '_meta']:visible").toggle();
     $("img[src$='../images/upBlue.png']").attr('src','../images/downBlue.png');
 }
 
-var popUpTrackName;
-var popUpTitle = "";
-var popSaveAllVars = null;
-function popUpCfgOk(popObj, trackName)
-{ // Kicks off a Modal Dialog for the provided content.
-    var allVars = getAllVars(popObj, trackName );   // always subtrack cfg
-    var changedVars = varHashChanges(allVars,popSaveAllVars);
-    //warn("cfgVars:"+varHashToQueryString(changedVars));
-    setVarsFromHash(changedVars);
-    var newVis = changedVars[trackName];
-    if(newVis != null) {
-        var sel = $('input[name="'+trackName+'_sel"]:checkbox');
-        var checked = (newVis != 'hide' && newVis != '[]');  // subtracks do not have "hide", thus '[]'
-        if( $(sel) != undefined ) {
-            $(sel).each( function (i) { matSubCBcheckOne(this,checked); });  // Though there is only one, the each works but the direct call does not!
-            matSubCBsSelected();
-        }
-    }
-}
-
-function popUpCfg(content, status)
-{ // Kicks off a Modal Dialog for the provided content.
-    // Set up the modal dialog
-    var popit = $('#popit');
-    $(popit).html("<div style='font-size:80%'>" + content + "</div>");
-    $(popit).dialog({
-        ajaxOptions: { cache: true }, // This doesn't work
-        resizable: false,
-        height: 'auto',
-        width: 'auto',
-        minHeight: 200,
-        minWidth: 700,
-        modal: true,
-        closeOnEscape: true,
-        autoOpen: false,
-        buttons: { "OK": function() {
-            popUpCfgOk(this,popUpTrackName);
-            $(this).dialog("close");
-        }},
-        open: function() { popSaveAllVars = getAllVars( this, popUpTrackName ); }, // always subtrack cfg
-        close: function() { $('#popit').empty(); }
-    });
-    // Apparently the options above to dialog take only once, so we set title explicitly.
-    if(popUpTitle != undefined && popUpTitle.length > 0)
-        $(popit).dialog('option' , 'title' , popUpTitle );
-    else
-        $(popit).dialog('option' , 'title' , "Please Respond");
-    $(popit).dialog('open');
-}
-
-function _popUpSubrackCfg(trackName,label)
-{ // popup cfg dialog
-    popUpTrackName = trackName;
-    popUpTitle = label;
-
-    $.ajax({
-        type: "GET",
-        url: "../cgi-bin/hgTrackUi?ajax=1&g=" + trackName + "&hgsid=" + getHgsid() + "&db=" + getDb(),
-        dataType: "html",
-        trueSuccess: popUpCfg,
-        success: catchErrorOrDispatch,
-        error: errorHandler,
-        cmd: "cfg",
-        cache: false
-    });
-}
-
-function popUpSubtrackCfg(trackName,label)
-{
-    waitOnFunction( _popUpSubrackCfg, trackName, label );  // Launches the popup but shields the ajax with a waitOnFunction
-    return false;
-}
-
 function subtrackCfgShow(tableName)
 {
 // Will show subtrack specific configuration controls
 // Config controls not matching name will be hidden
     var divit = $("#div_"+tableName+"_cfg");
     if(($(divit).css('display') == 'none')
     && metadataIsVisible(tableName))
         metadataShowHide(tableName,"","");
 
     // Could have all inputs commented out, then uncommented when clicked:
     // But would need to:
     // 1) be able to find composite view level input
     // 2) know if subtrack input is non-default (if so then subtrack value overrides composite view level value)
     // 3) know whether so composite view level value has changed since hgTrackUi displayed (if so composite view level value overrides)
     $(divit).toggle();
@@ -715,31 +651,31 @@
         }
     });
 
     // Close the cfg controls in the subtracks
     $("table.subtracks").each( function (i) { subtrackCfgHideAll(this);} );
     return true;
 }
 
 function showOrHideSelectedSubtracks(inp)
 {
 // Show or Hide subtracks based upon radio toggle
     var showHide;
     if(arguments.length > 0)
         showHide=inp;
     else {
-        var onlySelected = $("input[name='displaySubtracks']");
+        var onlySelected = $("input.allOrOnly'");
         if(onlySelected.length > 0)
             showHide = onlySelected[0].checked;
         else
             return;
     }
     showSubTrackCheckBoxes(showHide);
 
     var tbody = $("tbody.sortable")
     $(tbody).each(function (i) {
         sortedTableAlternateColors(this);
     });
 }
 
 ///// Following functions called on page load
 function matInitializeMatrix()
@@ -1508,30 +1444,39 @@
         if (isComposite) {
 
             return subVis;
 
         } else {
             var classList = $( parentObj ).attr("class").split(" ");
             classList = aryRemove(classList,"viewDD","normalText");
             if (classList.length != 1) {
                 warn("Unexpected view vis class list:"+classList);
                 return [];
             }
             return $(subVis).filter('.' + classList[0]);
         }
     },
 
+    checkOneSubtrack: function (subCb,check,enable)
+    { // Handle a single check of a single subCb
+        subCb.checked = check;
+        subCb.dsabled = enable;
+        matSubCBsetShadow(subCb);
+        hideOrShowSubtrack(subCb);
+        scm.enableCfg(subCb,null,check);
+    },
+
     propagateSetting: function (parentObj)
     { // propagate composite/view level setting to subtrack children
         var children = scm.childrenFind(parentObj);
         if(parentObj.type.indexOf("checkbox") == 0) {
             var parentChecked = parentObj.checked;
             $(children).each(function (i) {
                 // Note checkbox and boolshad are children.
                 if (this.type != 'hidden')
                     this.checked = parentObj.checked;
                 scm.clearChange(this);
             });
             // deal with hidden boolshads!
             //var parentIdSafe = parentObj.id.replace(/\./g,"\\.");
             //var boolshad = $('input#boolshad\\.'+parentIdSafe);
             var boolshad = $('input#boolshad_-'+parentObj.id);
@@ -1843,47 +1788,50 @@
             success: catchErrorOrDispatch,
             error: errorHandler,
             cmd: "cfg",
             cache: false
         });
     },
 
     replaceWithVis: function (obj,subtrack,open)
     { // Replaces the current fauxVis object with a true visibility selector
 
         if ($(obj).hasClass('disabled'))
             return;
         var classList = $( obj ).attr("class").split(" ");
         var view = classList[classList.length - 1];
         var classList = $(obj).attr('class').split(' '); // This relies on view being the last class!!!
-        var selectHtml = "<SELECT id='"+subtrack+"' class='normalText subVisDD "+view+"' style='width: 70px'>";
+        var selectHtml = "<SELECT id='"+subtrack+"' class='normalText subVisDD "+view+"' style='width: 70px'";
+        if (open)
+            selectHtml += " size=5";
+        selectHtml += ">";
         var selected = $(obj).text();
         if (selected == 'hide')
             selectHtml += "<OPTION SELECTED>hide</OPTION><OPTION>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>";
         else if (selected == 'dense')
             selectHtml += "<OPTION>hide</OPTION><OPTION SELECTED>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>";
         else if (selected == 'squish')
             selectHtml += "<OPTION>hide</OPTION><OPTION>dense</OPTION><OPTION SELECTED>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>";
         else if (selected == 'full')
             selectHtml += "<OPTION>hide</OPTION><OPTION>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION SELECTED>full</OPTION>";
         else
             selectHtml += "<OPTION>hide</OPTION><OPTION>dense</OPTION><OPTION>squish</OPTION><OPTION>pack</OPTION><OPTION>full</OPTION>";
         selectHtml += "</SELECT>";
         $(obj).replaceWith(selectHtml);
         if (open) {
             var newObj = $('select#'+subtrack);
-            $(newObj).attr('size',5)
+            //$(newObj).attr('size',5)
             $(newObj).one('blur',function (e) {
                 $(this).attr('size',1);
                 $(this).unbind()
             });
             $(newObj).one('change',function (e) {
                 $(this).attr('size',1);
             });
             // Doesn't work!
             //$(newObj).parents('td').first().attr('valign','top');
             $(newObj).focus();
         }
     },
 
     enableCfg: function (subCb,subtrack,setTo)
     { // Enables or disables subVis and wrench
@@ -1954,30 +1902,50 @@
                 subCb = subCb[0];
             if (subCb.disabled == true) // || subCb.checked == false)
                 return false;
 
             if(metadataIsVisible(subtrack))
                 metadataShowHide(subtrack,"","");
             if ($(cfg).hasClass('filled'))
                 $(cfg).show();
             else
                 waitOnFunction( scm.cfgPopulate, cfg, subtrack );
         } else
             $(cfg).hide();
         return false; // called by link!
     },
 
+    subCbInit: function (subCb)
+    { // unnames the subCb control and sets up on change envent
+        scm.unnameIt(subCb,true);
+        var boolshad = $('input#boolshad_-'+subCb.id);
+        if (boolshad != undefined && boolshad.length == 1) {
+            scm.unnameIt(boolshad[0],false);
+        }
+        $(subCb).bind('click',function (e) {
+            // deal with hidden boolshads!
+            var boolshad = $('input#boolshad_-'+subCb.id);
+            if (boolshad != undefined && boolshad.length == 1) {
+                if (subCb.checked == false)
+                    scm.markChange(boolshad[0]);
+                else
+                    scm.clearChange(boolshad[0]);
+            }
+            scm.markChange(subCb);
+        });
+    },
+
     viewInit: function (viewId)
     { // unnames all view controls
         // iterate through all matching controls and unname
         var tr = $('tr#tr_cfg_'+viewId);
         if (tr == undefined || tr.length == 0) {
             warn('Did not find view: ' + viewId);
             return;
         }
         if (tr.length == 1)
             tr = tr[0];
         var viewAllObjs = $(tr).find('input,select')
         var viewObjs = $(viewAllObjs).not("input[type='hidden']");
         if (viewObjs.length > 0) {
             $(viewObjs).each(function (i) {
                 scm.unnameIt(this,true);
@@ -2008,30 +1976,36 @@
 
     initialize: function ()
     { // unnames all composite controls and then all view controls
         // mySelf = this; // There is no need for a "mySelf" unless this object is being instantiated.
         scm.compositeId = $('.visDD').first().attr('name');
         scm.visIndependent = ($('.subVisDD').length > 0);
 
         // Find all appropriate controls and unname
 
         // matCBs are easy, they never get named again
         var matCbs = $('input.matCB');
         $(matCbs).each(function (i) {
             scm.unnameIt(this,false);
         });
 
+        // SubCBs will get renamed and on change will name them back.
+        var subCbs = $('input.subCB');
+        $(subCbs).each(function (i) {
+            scm.subCbInit(this);
+        });
+
         // Now vis control
         var visObj = $("select[name='"+scm.compositeId+"']");
         if (visObj == undefined || visObj.length == 0) {
             warn('Did not find visibility control for composite.');
             return;
         }
         if (visObj.length == 1)
             visObj = visObj[0];
         scm.unnameIt(visObj,true);
         $(visObj).bind('change',function (e) {
             scm.propagateVis(visObj,null);
         });
 
         // iterate through views
         var viewVis = $('select.viewDD');