8dc2f2a3bfe8d47e02a94ca4d9f62063df86b15c
braney
  Thu Oct 5 14:56:25 2017 -0700
ongoing work on hgCollection.  Add the ability to add tracks in hgTracks
to a collection.   Turn "overlay method" back on for custom collections.
Fix panning bug in hgTracks with custom collections

diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js
index 273466b..25a966c 100644
--- src/hg/js/hgTracks.js
+++ src/hg/js/hgTracks.js
@@ -2530,30 +2530,31 @@
     {
         setTimeout( function() {
                         rightClick.hitFinish(menuItemClicked, menuObject, cmd, args);
                     }, 1);
     },
 
     hitFinish: function (menuItemClicked, menuObject, cmd, args)
     {   // dispatcher for context menu hits
         var id = rightClick.selectedMenuItem.id;
         var url = null;  // TODO: Break this giant routine with shared vars into some sub-functions
         var href = null;
         var rec = null;
         var row = null;
         var rows = null;
         var selectUpdated = null;
+                function mySuccess() {}
         if (menuObject.shown) {
             // warn("Spinning: menu is still shown");
             setTimeout(function() { rightClick.hitFinish(menuItemClicked, menuObject, cmd); }, 10);
             return;
         }
         if (cmd === 'selectWholeGene' || cmd === 'getDna' || cmd === 'highlightItem') {
                 // bring whole gene into view or redirect to DNA screen.
                 href = rightClick.selectedMenuItem.href;
                 var chrom, chromStart, chromEnd;
                 // Many links leave out the chrom (b/c it's in the server side cart as "c")
                 // var chrom = hgTracks.chromName; // This is no longer acceptable
                 // with multi-window capability drawing multiple positions on multiple chroms.
                 var a = /hgg_chrom=(\w+)&/.exec(href);
                 if (a) {
                     if (a && a[1])
@@ -2690,32 +2691,65 @@
 
             url = "hgTrackUi?hgsid=" + getHgsid() + "&g=";
             rec = hgTracks.trackDb[id];
             if (tdbHasParent(rec) && tdbIsLeaf(rec))
                 url += rec.parentTrack;
             else {
                 // The button already has the ref
                 var link = normed($( 'td#td_btn_'+ rightClick.selectedMenuItem.id ).children('a')); 
                 if (link)
                     url = $(link).attr('href');
                 else
                     url += rightClick.selectedMenuItem.id;
             }
             location.assign(url);
 
-        } else if ((cmd === 'sortExp') || (cmd === 'sortSim')) {
+        } else if (cmd === 'newCollection') {
+            $.ajax({
+                type: "PUT",
+                async: false,
+                url: "../cgi-bin/hgCollection",
+                data:  "cmd=newCollection&track=" + id + "&hgsid=" + getHgsid(),
+                trueSuccess: mySuccess,
+                success: catchErrorOrDispatch,
+                error: errorHandler,
+            });
+
+            imageV2.fullReload();
+        } else if (cmd === 'addCollection') {
+            var shortLabel = $(menuItemClicked).text().substring(9).slice(0,-1); 
+            var ii;
+            var collectionName;
+            for(ii=0; ii < hgTracks.collections.length; ii++) {
+                if ( hgTracks.collections[ii].shortLabel === shortLabel) {
+                    collectionName = hgTracks.collections[ii].track;
+                    break;
+                }
+            }
+
+            $.ajax({
+                type: "PUT",
+                async: false,
+                url: "../cgi-bin/hgCollection",
+                data: "cmd=addTrack&track=" + id + "&collection=" + collectionName + "&hgsid=" + getHgsid(),
+                trueSuccess: mySuccess,
+                success: catchErrorOrDispatch,
+                error: errorHandler,
+            });
 
+            imageV2.fullReload();
+        } else if ((cmd === 'sortExp') || (cmd === 'sortSim')) {
             url = "hgTracks?hgsid=" + getHgsid() + "&" + cmd + "=";
             rec = hgTracks.trackDb[id];
             if (tdbHasParent(rec) && tdbIsLeaf(rec))
                 url += rec.parentTrack;
             else {
                 // The button already has the ref
                 var link2 = normed($( 'td#td_btn_'+ rightClick.selectedMenuItem.id ).children('a')); 
                 if (link2)
                     url = $(link2).attr('href');
                 else
                     url += rightClick.selectedMenuItem.id;
             }
             location.assign(url);
 
         } else if (cmd === 'viewImg') {
@@ -3219,30 +3253,55 @@
                     var text = (currentlySeen ? " Zoom" : " Jump") + " to highlight";
                     o[rightClick.makeImgTag("highlightZoom.png") + text] = {
                         onclick: rightClick.makeHitCallback('jumpToHighlight')
                     };
 
                     if ( currentlySeen ) {   // Remove only when seen
                         o[rightClick.makeImgTag("highlightRemove.png") + 
                                                                    " Remove highlight"] = {
                             onclick: rightClick.makeHitCallback('removeHighlight')
                         };
                     }
                     menu.push(o);
                 }
             }
 
+            if (rec.isCustomComposite)
+                {
+                // add delete from composite
+                }
+            else if (!rec.hasChildren && rec.type.startsWith("bigWig")) {
+                o = {};
+                o[" Make a New Collection with \"" + rec.shortLabel + "\""] = {
+                    onclick: rightClick.makeHitCallback("newCollection")
+                };  
+                menu.push(o);
+
+                if (hgTracks.collections) {
+                    var ii;
+                    for(ii=0; ii < hgTracks.collections.length; ii++) {
+                        o = {};
+                        o[" Add to \"" + hgTracks.collections[ii].shortLabel + "\""] = {
+                            onclick: rightClick.makeHitCallback("addCollection")
+                        };  
+                        menu.push(o);
+                    }
+                }
+
+                menu.push($.contextMenu.separator);
+            }
+
             // add sort options if this is a custom composite
             if (rec.isCustomComposite) {
 
                 o = {};
                 o[" Sort by Expression "] = {
                     onclick: function(menuItemClicked, menuObject) {
                         rightClick.hit(menuItemClicked, menuObject, "sortExp");
                         return true; }
                 };  
                 menu.push(o);
 
                 o = {};
                 o[" Sort by Similarity "] = {
                     onclick: function(menuItemClicked, menuObject) {
                         rightClick.hit(menuItemClicked, menuObject, "sortSim");