d3ed4e62c1515da4f6c9417545b657a412a8d0df
tdreszer
  Fri Feb 25 12:05:08 2011 -0800
Moved code from 'hgTracks.js' to common 'utils.js' and added support for multi-selects in file and track search
diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js
index 0dfa3f0..8e9631d 100644
--- src/hg/js/hgTracks.js
+++ src/hg/js/hgTracks.js
@@ -2340,489 +2340,43 @@
         $('#img_data_' + track).attr('width', rec.width);
         $('#img_data_' + track).attr('src', rec.img);
         $('#td_data_' + track + ' > div').each(function(index) {
                                                    if(index == 1) {
                                                        var style = $(this).attr('style');
                                                        style = style.replace(/height:\s*\d+/i, "height:" + rec.height);
                                                        $(this).attr('style', style);
                                                    }
                                                });
         var style = $('#p_btn_' + track).attr('style');
         style = style.replace(/height:\s*\d+/i, "height:" + rec.height);
         $('#p_btn_' + track).attr('style', style);
     }
 }
 
-/////////////////////////////////////////////////////
-// findTracks functions
-
-function findTracksMdbVarChanged(obj)
-{ // Ajax call to repopulate a metadata vals select when mdb var changes
-  // This handles the currnet case when 2 vars have the same name (e.g. advanced, files tabs)
-
-    findTracksClearFound();  // Changing values so abandon what has been found
-
-    var newVar = $(obj).val();
-    var a = /hgt_mdbVar(\d+)/.exec(obj.name); // NOTE must match METADATA_NAME_PREFIX in hg/hgTracks/searchTracks.c
-    if(newVar != undefined && a && a[1]) {
-        var num = a[1];
-        $("select.mdbVar[name='hgt_mdbVar"+num+"'][value!='"+newVar+"']").val(newVar);
-        $.ajax({
-                   type: "GET",
-                   url: "../cgi-bin/hgApi",
-                   data: "db=" + getDb() +  "&cmd=hgt_mdbVal" + num + "&var=" + newVar,
-                   trueSuccess: findTracksHandleNewMdbVals,
-                   success: catchErrorOrDispatch,
-                   error: errorHandler,
-                   cache: true,
-                   cmd: "hgt_mdbVal" + num, // NOTE must match METADATA_VALUE_PREFIX in hg/hgTracks/searchTracks.c
-                   num: num
-               });
-    }
-    //findTracksSearchButtonsEnable(true);
-}
-
-function findTracksHandleNewMdbVals(response, status)
-{ // Handle ajax response (repopulate a metadata val select)
-  // This handles the currnet case when 2 vars have the same name (e.g. advanced, files tabs)
-
-    var td = $('td#' + this.cmd );
-    if (td != undefined) {
-        td.empty();
-        td.append(response);
-        var inp = $(td).find('.mdbVal');
-        var tdIsLike = $('td#isLike'+this.num);
-        if (inp != undefined && tdIsLike != undefined) {
-            if ($(inp).hasClass('freeText')) {
-                $(tdIsLike).text('contains');
-            } else {
-                $(tdIsLike).text('is');
-            }
-        }
-    }
-    updateMetaDataHelpLinks(this.num);
-}
-
-function findTracksMdbValChanged(obj)
-{ // Keep all tabs with same selects in sync  TODO: Change from name to id based identification and only have one set of inputs in form
-  // This handles the currnet case when 2 vars have the same name (e.g. advanced, files tabs)
-
-    findTracksClearFound();  // Changing values so abandon what has been found
-
-    var newVal = $(obj).val();
-    var a = /hgt_mdbVal(\d+)/.exec(obj.name); // NOTE must match METADATA_NAME_PREFIX in hg/hgTracks/searchTracks.c
-    if(newVal != undefined && a && a[1]) {
-        var num = a[1];
-        $("select.mdbVal[name='hgt_mdbVal"+num+"'][value!='"+newVal+"']").val(newVal);
-    }
-    //findTracksSearchButtonsEnable(true);
-}
-
 function searchKeydown(event)
 {
     if (event.which == 13) {
         // Required to fix problem on IE and Safari where value of hgt_tSearch is "-" (i.e. not "Search").
         $("input[name=hgt_tsPage]").val(0);  // NOTE: must match TRACK_SEARCH_PAGER in hg/inc/searchTracks.h
         $('#trackSearch').submit();
         // This doesn't work with IE or Safari.
         // $('#searchSubmit').click();
     }
 }
 
-function findTracksChangeVis(seenVis)
-{ // called by onchange of vis
-    var visName = $(seenVis).attr('id');
-    var trackName = visName.substring(0,visName.length - "_id".length)
-    var hiddenVis = $("input[name='"+trackName+"']");
-    var tdb = tdbGetJsonRecord(trackName);
-    if($(seenVis).val() != "hide")
-        $(hiddenVis).val($(seenVis).val());
-    else {
-        var selCb = $("input#"+trackName+"_sel_id");
-        $(selCb).attr('checked',false);  // Can't set it to [] because that means default setting is used.  However, we are explicitly hiding this!
-        $(seenVis).attr('disabled',true);  // Can't set it to [] because that means default setting is used.  However, we are explicitly hiding this!
-        var needSel = (tdb.parentTrack != undefined);
-        if (needSel) {
-            var hiddenSel = $("input[name='"+trackName+"_sel']");
-            $(hiddenSel).val('0');  // Can't set it to [] because that means default setting is used.  However, we are explicitly hiding this!
-            $(hiddenSel).attr('disabled',false);
-        }
-        if(tdbIsSubtrack(tdb))
-            $(hiddenVis).val("[]");
-        else
-            $(hiddenVis).val("hide");
-    }
-    $(hiddenVis).attr('disabled',false);
-
-    $('input.viewBtn').val('View in Browser');
-    //warn("Changed "+trackName+" to "+$(hiddenVis).val())
-}
-
-function findTracksClickedOne(selCb,justClicked)
-{ // called by on click of CB and findTracksCheckAll()
-    var selName = $(selCb).attr('id');
-    var trackName = selName.substring(0,selName.length - "_sel_id".length)
-    var hiddenSel = $("input[name='"+trackName+"_sel']");
-    var seenVis = $('select#' + trackName + "_id");
-    var hiddenVis = $("input[name='"+trackName+"']");
-    var tr = $(selCb).parents('tr.found');
-    var tdb = tdbGetJsonRecord(trackName);
-    var needSel = (tdb.parentTrack != undefined);
-    var shouldPack = tdb.canPack && tdb.kindOfParent == 0; // If parent then not pack but full
-    if (shouldPack && tdb.shouldPack != undefined && !tdb.shouldPack)
-        shouldPack = false;
-    var checked = $(selCb).attr('checked');
-    //warn(trackName +" selName:"+selName +" justClicked:"+justClicked +" hiddenSel:"+$(hiddenSel).attr('name') +" seenVis:"+$(seenVis).attr('id') +" hiddenVis:"+$(hiddenVis).attr('name') +" needSel:"+needSel +" shouldPack:"+shouldPack);
-
-    // First deal with seenVis control
-    if(checked) {
-        $(seenVis).attr('disabled', false);
-        if($(seenVis).attr('selectedIndex') == 0) {
-            if(shouldPack)
-                $(seenVis).attr('selectedIndex',3);  // packed
-            else
-                $(seenVis).attr('selectedIndex',$(seenVis).attr('length') - 1);
-        }
-    } else {
-        $(seenVis).attr('selectedIndex',0);  // hide
-        $(seenVis).attr('disabled', true );
-    }
-
-    // Deal with hiddenSel and hiddenVis so that submit does the right thing
-    // Setting these requires justClicked OR seen vs. hidden to be different
-    var setHiddenInputs = justClicked;
-    if(!justClicked) {
-        if(needSel)
-            setHiddenInputs = (checked != ($(hiddenSel).val() == '1'));
-        else if (checked)
-            setHiddenInputs = ($(seenVis).val() != $(hiddenVis).val());
-        else
-            setHiddenInputs = ($(hiddenVis).val() != "hide" && $(hiddenVis).val() != "[]");
-    }
-    if(setHiddenInputs) {
-        if(checked)
-            $(hiddenVis).val($(seenVis).val());
-        else if(tdbIsSubtrack(tdb))
-            $(hiddenVis).val("[]");
-        else
-            $(hiddenVis).val("hide");
-        $(hiddenVis).attr('disabled',false);
-
-        if(needSel) {
-            if(checked)
-                $(hiddenSel).val('1');
-            else
-                $(hiddenSel).val('0');  // Can't set it to [] because that means default setting is used.  However, we are explicitly hiding this!
-            $(hiddenSel).attr('disabled',false);
-        }
-    }
-
-    // The "view in browser" button should be enabled/disabled
-    if(justClicked) {
-        $('input.viewBtn').val('View in Browser');
-        findTracksCounts();
-    }
-}
-
-
-function findTracksNormalize()
-{ // Normalize the page based upon current state of all found tracks
-    $('div#found').show()
-    var selCbs = $('input.selCb');
-
-    // All should have their vis enabled/disabled appropriately (false means don't update cart)
-    $(selCbs).each( function(i) { findTracksClickedOne(this,false); });
-
-    findTracksCounts();
-}
-
-function findTracksNormalizeWaitOn()
-{ // Put up wait mask then Normalize the page based upon current state of all found tracks
-    waitOnFunction( findTracksNormalize );
-}
-
-function findTracksCheckAll(check)
-{ // Checks/unchecks all found tracks.
-    var selCbs = $('input.selCb');
-    $(selCbs).attr('checked',check);
-
-    // All should have their vis enabled/disabled appropriately (false means don't update cart)
-    $(selCbs).each( function(i) { findTracksClickedOne(this,false); });
-
-    $('input.viewBtn').val('View in Browser');
-    findTracksCounts();
-    return false;  // Pressing button does nothing more
-}
-
-function findTracksCheckAllWithWait(check)
-{
-    waitOnFunction( findTracksCheckAll, check);
-}
-
-function findTracksSearchButtonsEnable(enable)
-{ // Displays visible and checked track count
-    var searchButton = $('input[name="hgt_tSearch"]'); // NOTE: must match TRACK_SEARCH in hg/inc/searchTracks.h
-    var clearButton  = $('input.clear');
-    if(enable) {
-        $(searchButton).attr('disabled',false);
-        $(clearButton).attr('disabled',false);
-    } else {
-        $(searchButton).attr('disabled',true);
-        $(clearButton).attr('disabled',true);
-    }
-}
-
-function findTracksCounts()
-{// Displays visible and checked track count
-    var counter = $('.selCbCount');
-    if(counter != undefined) {
-        var selCbs =  $("input.selCb");
-        $(counter).text("("+$(selCbs).filter(":enabled:checked").length + " of " +$(selCbs).length+ " selected)");
-    }
-}
-
-function findTracksClearFound()
-{// Clear found tracks and all input controls
-    var found = $('div#found');
-    if(found != undefined)
-        $(found).remove();
-    found = $('div#filesFound');
-    if(found != undefined)
-        $(found).remove();
-    return false;
-}
-
-function findTracksClear()
-{// Clear found tracks and all input controls
-    findTracksClearFound();
-    $('input[type="text"]').val(''); // This will always be found
-    //$('select.mdbVar').attr('selectedIndex',0); // Do we want to set the first two to cell/antibody?
-    $('select.mdbVal').attr('selectedIndex',0); // Should be 'Any'
-    $('select.groupSearch').attr('selectedIndex',0);
-    $('select.typeSearch').attr('selectedIndex',0);
-    //findTracksSearchButtonsEnable(false);
-    return false;
-}
-
-function findTracksSortNow(obj)
-{// Called by radio button to sort tracks
-    if( $('#sortIt').length == 0 )
-        $('form#trackSearch').append("<input TYPE=HIDDEN id='sortIt' name='"+$(obj).attr('name')+"' value='"+$(obj).val()+"'>");
-    else
-        $('#sortIt').val($(obj).val());
-
-    // How to hold onto selected tracks?
-    // There are 2 separate forms.  Scrape named inputs from searchResults form and dup them on trackSearch?
-    var inp = $('form#searchResults').find('input:hidden').not(':disabled').not("[name='hgsid']");
-    if($(inp).length > 0) {
-        $(inp).appendTo('form#trackSearch');
-        $('form#trackSearch').attr('method','POST'); // Must be post to avoid url too long  NOTE: probably needs to be post anyway
-    }
-
-    $('#searchSubmit').click();
-    return true;
-}
-
-function findTracksPage(pageVar,startAt)
-{// Called by radio button to sort tracks
-    var pager = $("input[name='"+pageVar+"']");
-    if( $(pager).length == 1)
-        $(pager).val(startAt);
-
-    // How to hold onto selected tracks?
-    // There are 2 separate forms.  Scrape named inputs from searchResults form and dup them on trackSearch?
-    var inp = $('form#searchResults').find('input:hidden').not(':disabled').not("[name='hgsid']");
-    if($(inp).length > 0) {
-        $(inp).appendTo('form#trackSearch');
-        $('form#trackSearch').attr('method','POST'); // Must be post to avoid url too long  NOTE: probably needs to be post anyway
-    }
-
-    $('#searchSubmit').click();
-    return false;
-}
-
-function findTracksConfigureSet(name)
-{// Called when configuring a composite or superTrack
-    var thisForm =  $('form#searchResults');
-    $(thisForm).attr('action',"../cgi-bin/hgTrackUi?hgt_tSearch=Search&g="+name);
-    $(thisForm).find('input.viewBtn').click();
-}
-
-function findTracksMdbSelectPlusMinus(obj, rowNum)
-{ // Now [+][-] mdb var rows with javascript rather than cgi roundtrip
-  // Will remove row or clone new one.  Complication is that 'advanced' and 'files' tab duplicate the tables!
-
-    var objId = $(obj).attr('id');
-    rowNum = objId.substring(objId.length - 1);
-    if ($(obj).val() == '+') {
-        var buttons = $("input#plusButton"+rowNum);  // Two tabs may have the exact same buttons!
-        if (buttons.length > 0) {
-            $(buttons).each(function (i) {
-                var tr = $(this).parents('tr.mdbSelect')[0];
-                if (tr != undefined)
-                    $(tr).after( $(tr).clone() );
-                findTracksMdbSelectRowsNormalize($(tr).parents('table')[0]); // magic is in this function
-            });
-            return false;
-        }
-    } else { // == '-'
-        var buttons = $("input#minusButton"+rowNum);  // Two tabs may have the exact same buttons!
-        if (buttons.length > 0) {
-            var remaining = 0;
-            $(buttons).each(function (i) {
-                var tr = $(this).parents('tr')[0];
-                var table = $(tr).parents('table')[0];
-                if (tr != undefined)
-                    $(tr).remove();
-                remaining = findTracksMdbSelectRowsNormalize(table);  // Must renormalize since 2nd of 3 rows may have been removed
-            });
-            if (remaining > 0) {
-                removeNum = remaining + 1;  // Got to remove the cart vars, though it doesn't matter which as count must not be too many.
-                setCartVars( [ "hgt_mdbVar"+removeNum, "hgt_mdbVal"+removeNum ], [ "[]","[]" ] );
-            }
-
-            findTracksClearFound();  // Changing values so abandon what has been found
-            return false;
-        }
-    }
-    return true;
-}
-
-function findTracksMdbSelectRowsNormalize(table)
-{ // Called when [-][+] buttons changed the number of mdbSelects in findTracks\
-  // Will walk through each row and get the numberings of addressable elements correct.
-    if (table != undefined) {
-        var mdbSelectRows = $(table).find('tr.mdbSelect');
-        var needMinus = (mdbSelectRows.length > 2);
-        $(table).find('tr.mdbSelect').each( function (ix) {
-            var rowNum = ix + 1;  // Each [-][+] and mdb var=val pair of selects must be numbered
-
-            // First the [-][+] buttons
-            var plusButton = $(this).find("input[value='+']")[0];
-            if (plusButton != undefined) {
-                $(plusButton).attr('id',"plusButton"+rowNum);
-                $(plusButton).unbind('click')
-                $(plusButton).click(function() { return findTracksMdbSelectPlusMinus($(plusButton), rowNum); });
-                var minusButton = $(this).find("input[value='-']")[0];
-                if (needMinus) {
-                    if (minusButton == undefined) {
-                        $(plusButton).before("<input type='button' id='minusButton"+rowNum+"' value='-' style='font-size:.7em;' title='delete this row' onclick='return findTracksMdbSelectPlusMinus(this,"+rowNum+");'>");
-                        minusButton = $(this).find("input[value='-']")[0];
-                    } else {
-                        $(minusButton).attr('id',"minusButton"+rowNum);
-                        $(minusButton).unbind('click');
-                        $(minusButton).click(function() { return findTracksMdbSelectPlusMinus($(minusButton), rowNum); });
-                    }
-                } else if (minusButton != undefined)
-                    $(minusButton).remove();
-            }
-            // Now the mdb var=val pair of selects
-            var element = $(this).find("select[name^='hgt_mdbVar']")[0];
-            if (element != undefined)
-                $(element).attr('name','hgt_mdbVar' + rowNum);
-
-            element = $(this).find("select[name^='hgt_mdbVal']")[0];
-            if (element != undefined)
-                $(element).attr('name','hgt_mdbVal' + rowNum);
-
-            // A couple more things
-            element = $(this).find("td[id^='isLike']")[0];
-            if (element != undefined)
-                $(element).attr('id','isLike' + rowNum);
-            element = $(this).find("td[id^='hgt_mdbVal']")[0];
-            if (element != undefined)
-                $(element).attr('id','hgt_mdbVal' + rowNum);
-        });
-        return mdbSelectRows.length;
-    }
-    return 0;
-}
-
-function findTracksSwitchTabs(ui)
-{ // switching tabs on findTracks page
-
-    if( ui.panel.id == 'simpleTab' && $('div#found').length < 1) {
-        setTimeout("$('input#simpleSearch').focus();",20); // delay necessary, since select event not afterSelect event
-    }
-    if( $('div#filesFound').length == 1) {
-        if( ui.panel.id == 'filesTab')
-            $('div#filesFound').show();
-        else
-            $('div#filesFound').hide();
-    }
-    if( $('div#found').length == 1) {
-        if( ui.panel.id != 'filesTab')
-            $('div#found').show();
-        else
-            $('div#found').hide();
-    }
-}
-
 /////////////////////////////////////////////////////
 
-function updateMetaDataHelpLinks(index)
-{
-// update the metadata help links based on currently selected values.
-// If index == 0 we update all help items, otherwise we only update the one == index.
-    var i;
-    var db = getDb();
-    var disabled = {
-        'accession': 1,
-        'dataType': 1,
-        'dataVersion': 1,
-        'geoSample': 1,
-        'grant': 1,
-        'lab': 1,
-        'labExpId': 1,
-        'labVersion': 1,
-        'origAssembly': 1,
-        'replicate': 1,
-        'setType': 1,
-        'softwareVersion': 1,
-        'subId': 1,
-        'view': 1
-    }
-    for(i=1;true;i++) {
-        var span = $("#helpLink" + i);
-        if(span.length > 0) {
-            if(index == 0 || i == index) {
-                var val = $("select[name='hgt_mdbVar" + i + "']").val();  // NOTE must match METADATA_NAME_PREFIX in hg/hgTracks/searchTracks.c
-                var text = $("select[name='hgt_mdbVar" + i + "'] option:selected").text();
-                var str;
-                span.empty();
-                if(val == 'cell') {
-                    if(db.substr(0, 2) == "mm") {
-                        str = "../ENCODE/cellTypesMouse.html";
-                    } else {
-                        str = "../ENCODE/cellTypes.html";
-                    }
-                } else if (val.toLowerCase() == 'antibody') {
-                    str = "../ENCODE/antibodies.html";
-                } else {
-                    str = "../ENCODE/otherTerms.html#" + val;
-                }
-                if(typeof(disabled[val]) == 'undefined')
-                    span.html("<a target='_blank' title='detailed descriptions of terms' href='" + str + "'>" + text + "</a>");
-                else
-                    span.empty();
-            }
-        } else {
-            return;
-        }
-    }
-}
-
 function windowOpenFailedMsg()
 {
     alert("Your web browser prevented us from opening a new window.\n\nPlease change your browser settings to allow pop-up windows from " + document.domain + ".");
 }
 
 function updateVisibility(track, visibility)
 {
 // Updates visibility state in trackDbJson and any visible elements on the page.
 // returns true if we modify at least one select in the group list
     var rec = trackDbJson[track];
     var selectUpdated = false;
     $("select[name=" + track + "]").each(function(t) {
                                           $(this).attr('class', visibility == 'hide' ? 'hiddenText' : 'normalText');
                                           $(this).val(visibility);
                                           selectUpdated = true;