cc1314a4ff21d4dc406d4ae239566dfa9d0c6fae
larrym
  Wed Nov 2 14:03:29 2011 -0700
replace some instances of $(#...) with document.getElementById to deal with possible metacharacter in track names; add and use escapeJQuerySelectorChars
diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js
index fb02c8e..709a66a 100644
--- src/hg/js/hgTracks.js
+++ src/hg/js/hgTracks.js
@@ -380,31 +380,31 @@
     }
 }
 
   ///////////////////////////////////////////////
  //// visibility (mixed with group toggle) /////
 ///////////////////////////////////////////////
 var vis = {
 
     enumOrder: new Array("hide", "dense", "full", "pack", "squish"),  // map cgi enum visibility codes to strings
 
     update: function (track, visibility)
     {   // Updates visibility state in hgTracks.trackDb and any visible elements on the page.
         // returns true if we modify at least one select in the group list
         var rec = hgTracks.trackDb[track];
         var selectUpdated = false;
-        $("select[name=" + track + "]").each(function(t) {
+        $("select[name=" + escapeJQuerySelectorChars(track) + "]").each(function(t) {
             $(this).attr('class', visibility == 'hide' ? 'hiddenText' : 'normalText');
             $(this).val(visibility);
             selectUpdated = true;
         });
         if(rec) {
             rec.localVisibility = visibility;
         }
         return selectUpdated;
     },
 
     get: function (track)
     {   // return current visibility for given track
         var rec = hgTracks.trackDb[track];
         if(rec) {
             if(rec.localVisibility) {
@@ -1976,31 +1976,31 @@
                         var str = blankImg + " hide track set";
                         if (offerHideSubset)
                             str += " (blue)";
                         o[str] = {onclick: rightClick.makeHitCallback('hideComposite')};
                         //o[rightClick.makeImgTag("btnBlueX.png") + " hide track set"] = {onclick: rightClick.makeHitCallback('hideComposite')};
                         menu.push(o);
                     }
 
                     // Second set of options: visibility for single track
                     if (offerSingles) {
                         if (offerHideComposite)
                             menu.push($.contextMenu.separator);
 
                         // XXXX what if select is not available (b/c trackControlsOnMain is off)?
                         // Move functionality to a hidden variable?
-                        var select = $("select[name=" + id + "]");
+                        var select = $("select[name=" + escapeJQuerySelectorChars(id) + "]");
                         if (select.length > 1)  // Not really needed if $('#hgTrackUiDialog').html(""); has worked
                             select =  [ $(select)[0] ];
                         var cur = $(select).val();
                         if(cur) {
                             $(select).children().each(function(index, o) {
                                 var title = $(this).val();
                                 var str = blankImg + " " + title;
                                 if(title == cur)
                                     str = selectedImg + " " + title;
                                 var o = new Object();
                                 o[str] = {onclick: function (menuItemClicked, menuObject) {
                                             rightClick.hit(menuItemClicked, menuObject, title);
                                             return true;}};
                                 menu.push(o);
                             });