89363e8aeb7f6cb7f1a5ad00cf8ee9d54932e847
tdreszer
  Thu Jan 23 11:05:33 2014 -0800
Adding 'jump or zoom' functionalight to drag highlight feature.  Redmine #709.
diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js
index afa0846..9dc5658 100644
--- src/hg/js/hgTracks.js
+++ src/hg/js/hgTracks.js
@@ -2097,41 +2097,47 @@
             }
         } else if (cmd == 'hideComposite') {
             var rec = hgTracks.trackDb[id];
             if (tdbIsSubtrack(rec)) {
                 var row = $( 'tr#tr_' + id );
                 var rows = dragReorder.getCompositeSet(row);
                 if (rows && rows.length > 0) {
                     for (var ix=rows.length - 1; ix >= 0; ix--) { // from bottom, just in case remove screws with us
                         $(rows[ix]).remove();
                     }
                 var selectUpdated = vis.update(rec.parentTrack, 'hide');
                 setCartVar(rec.parentTrack, 'hide' );
                 imageV2.afterImgChange(true);
                 }
             }
-            //else
-            //    warn('What went wrong?');
-        } else if (cmd == 'zoomToHighlight') { // If highlight exists for this assembly, zoom to it
+        } else if (cmd == 'jumpToHighlight') { // If highlight exists for this assembly, jump to it
             if (hgTracks.highlight) {
-                var pos = parsePositionWithDb(hgTracks.highlight);
-                if (pos && pos.db == getDb()) {
+                var newPos = parsePositionWithDb(hgTracks.highlight);
+                if (newPos && newPos.db == getDb()) {
+                    if ( $('#highlightItem').length == 0) { // not visible? jump to it
+                        var curPos = parsePosition(genomePos.get());
+                        var diff = ((curPos.end - curPos.start) - (newPos.end - newPos.start));
+                        if (diff > 0) { // new position is smaller then current, then center it
+                            newPos.start = Math.max( Math.floor(newPos.start - (diff/2) ), 0 );
+                            newPos.end   = newPos.start + (curPos.end - curPos.start);
+                        }
+                    }
                     if (imageV2.inPlaceUpdate) {
-                        var params = "position=" + pos.chrom + ':' + pos.start + '-' + pos.end;
+                        var params = "position=" + newPos.chrom+':'+newPos.start+'-'+newPos.end;
                         imageV2.navigateInPlace(params, null, true);
                     } else {
-                        genomePos.setByCoordinates(pos.chrom, pos.start, pos.end);
+                        genomePos.setByCoordinates(newPos.chrom, newPos.start, newPos.end);
                         jQuery('body').css('cursor', 'wait');
                         document.TrackHeaderForm.submit();
                     }
                 }
             }
         } else if (cmd == 'removeHighlight') {
             hgTracks.highlight = null;
             setCartVars(['highlight'], ['[]']);
             imageV2.highlightRegion();
         } else {   // if ( cmd in 'hide','dense','squish','pack','full','show' )
             // Change visibility settings:
             //
             // First change the select on our form:
             var rec = hgTracks.trackDb[id];
             var selectUpdated = vis.update(id, cmd);
@@ -2461,44 +2467,44 @@
                         o[(rightClick.selectedMenuItem.id == rightClick.floatingMenuItem ?
                                 selectedImg : blankImg) + " float"] = {
                             onclick: function(menuItemClicked, menuObject) {
                                 rightClick.hit(menuItemClicked, menuObject, "float");
                                 return true; }
                         };
                     }
                     menu.push($.contextMenu.separator);
                     menu.push(o);
                 }
 
                 menu.push($.contextMenu.separator);
                 if(hgTracks.highlight) {
                     var o;
                     if (hgTracks.highlight.search(getDb() + '.') == 0) {
+                        var currentlySeen = ($('#highlightItem').length > 0); 
                         o = new Object();
-                        o[rightClick.makeImgTag("highlightZoom.png") + 
-                                                                  " Zoom to highlighted region"] = 
-                            {   onclick:function(menuItemClicked, menuObject) {
-                                    rightClick.hit(menuItemClicked, menuObject, "zoomToHighlight");
-                                    return true; 
-                                }
+                        // Jumps to highlight when not currently seen in image
+                        var text = (currentlySeen ? " Zoom" : " Jump") + " to highlighted region";
+                        o[rightClick.makeImgTag("highlightZoom.png") + text] = {
+                            onclick: rightClick.makeHitCallback('jumpToHighlight')
                         };
-                        o[rightClick.makeImgTag("highlightRemove.png") + " Remove highlighting"] = 
-                            {   onclick:function(menuItemClicked, menuObject) {
-                                    rightClick.hit(menuItemClicked, menuObject, "removeHighlight");
-                                    return true; 
-                                }
+
+                        if ( currentlySeen ) {   // Remove only when seen
+                            o[rightClick.makeImgTag("highlightRemove.png") + 
+                                                                       " Remove highlighting"] = {
+                                onclick: rightClick.makeHitCallback('removeHighlight')
                             };
+                        }
                         menu.push(o);
                     }
                 }
                 // Add view image at end
                 var o = new Object();
                 o[rightClick.makeImgTag("eye.png") + " View image"] = {
                     onclick: function(menuItemClicked, menuObject) {
                         rightClick.hit(menuItemClicked, menuObject, "viewImg");
                         return true; }
                 };
                 menu.push(o);
 
                 return menu;
             },
             {