8a3891b32fa630eddb3808ab704836d5c9e1ffe8
larrym
Sun Jul 10 20:58:40 2011 -0700
move javascript globals from hiddens to an object
diff --git src/hg/js/hgTracks.js src/hg/js/hgTracks.js
index 0eb6a12..3f4f162 100644
--- src/hg/js/hgTracks.js
+++ src/hg/js/hgTracks.js
@@ -1,27 +1,23 @@
// Javascript for use in hgTracks CGI
var debug = false;
var originalPosition;
var originalSize;
var originalCursor;
var originalMouseOffset = {x:0, y:0};
-var clickClipHeight;
-var revCmplDisp;
-var insideX;
var startDragZoom = null;
-var newWinWidth;
var imageV2 = false;
var imgBoxPortal = false;
var blockUseMap = false;
var mapItems;
var trackImg; // jQuery element for the track image
var trackImgTbl; // jQuery element used for image table under imageV2
var imgAreaSelect; // jQuery element used for imgAreaSelect
var originalImgTitle;
var autoHideSetting = true; // Current state of imgAreaSelect autoHide setting
var selectedMenuItem; // currently choosen context menu item (via context menu).
var browser; // browser ("msie", "safari" etc.)
var mapIsUpdateable = true;
var currentMapItem;
var floatingMenuItem;
var visibilityStrsOrder = new Array("hide", "dense", "full", "pack", "squish"); // map browser numeric visibility codes to strings
@@ -113,122 +109,112 @@
if(size) {
$('#size').text(size);
}
}
function checkPosition(img, selection)
{
// return true if user's selection is still w/n the img (including some slop).
var imgWidth = jQuery(img).width();
var imgHeight = jQuery(img).height();
var imgOfs = jQuery(img).offset();
var slop = 10;
// We ignore clicks in the gray tab and track title column (we really should suppress all drag activity there,
// but I don't know how to do that with imgAreaSelect).
- var leftX = revCmplDisp ? imgOfs.left - slop : imgOfs.left + insideX - slop;
- var rightX = revCmplDisp ? imgOfs.left + imgWidth - insideX + slop : imgOfs.left + imgWidth + slop;
+ var leftX = hgTracks.revCmplDisp ? imgOfs.left - slop : imgOfs.left + hgTracks.insideX - slop;
+ var rightX = hgTracks.revCmplDisp ? imgOfs.left + imgWidth - hgTracks.insideX + slop : imgOfs.left + imgWidth + slop;
return (selection.event.pageX >= leftX) && (selection.event.pageX < rightX)
&& (selection.event.pageY >= (imgOfs.top - slop)) && (selection.event.pageY < (imgOfs.top + imgHeight + slop));
}
function pixelsToBases(img, selStart, selEnd, winStart, winEnd)
// Convert image coordinates to chromosome coordinates
{
-var insideX = parseInt(document.getElementById("hgt.insideX").value);
-var imgWidth = jQuery(img).width() - insideX;
-var width = winEnd - winStart;
+var imgWidth = jQuery(img).width() - hgTracks.insideX;
+var width = hgTracks.winEnd - hgTracks.winStart;
var mult = width / imgWidth; // mult is bp/pixel multiplier
var startDelta; // startDelta is how many bp's to the right/left
-if(revCmplDisp) {
+if(hgTracks.revCmplDisp) {
var x1 = Math.min(imgWidth, selStart);
startDelta = Math.floor(mult * (imgWidth - x1));
} else {
- var x1 = Math.max(insideX, selStart);
- startDelta = Math.floor(mult * (x1 - insideX));
+ var x1 = Math.max(hgTracks.insideX, selStart);
+ startDelta = Math.floor(mult * (x1 - hgTracks.insideX));
}
var endDelta;
-if(revCmplDisp) {
+if(hgTracks.revCmplDisp) {
endDelta = startDelta;
var x2 = Math.min(imgWidth, selEnd);
startDelta = Math.floor(mult * (imgWidth - x2));
} else {
- var x2 = Math.max(insideX, selEnd);
- endDelta = Math.floor(mult * (x2 - insideX));
+ var x2 = Math.max(hgTracks.insideX, selEnd);
+ endDelta = Math.floor(mult * (x2 - hgTracks.insideX));
}
-var newStart = winStart + startDelta;
-var newEnd = winStart + 1 + endDelta;
+var newStart = hgTracks.winStart + startDelta;
+var newEnd = hgTracks.winStart + 1 + endDelta;
if(newEnd > winEnd) {
newEnd = winEnd;
}
return {chromStart : newStart, chromEnd : newEnd};
}
function selectionPixelsToBases(img, selection)
// Convert selection x1/x2 coordinates to chromStart/chromEnd.
{
-var winStart = parseInt(document.getElementById("hgt.winStart").value);
-var winEnd = parseInt(document.getElementById("hgt.winEnd").value);
-return pixelsToBases(img, selection.x1, selection.x2, winStart, winEnd);
+return pixelsToBases(img, selection.x1, selection.x2, hgTracks.winStart, hgTracks.winEnd);
}
function updatePosition(img, selection, singleClick)
{
-var chromName = document.getElementById("hgt.chromName").value;
-var winStart = parseInt(document.getElementById("hgt.winStart").value);
-var winEnd = parseInt(document.getElementById("hgt.winEnd").value);
-var pos = pixelsToBases(img, selection.x1, selection.x2, winStart, winEnd);
-if(typeof imgBoxPortalStart != "undefined" && imgBoxPortalStart) {
- winStart = imgBoxPortalStart;
- winEnd = imgBoxPortalEnd;
-}
+ var pos = pixelsToBases(img, selection.x1, selection.x2, hgTracks.winStart, hgTracks.winEnd);
// singleClick is true when the mouse hasn't moved (or has only moved a small amount).
if(singleClick) {
var center = (pos.chromStart + pos.chromEnd)/2;
- pos.chromStart = Math.floor(center - newWinWidth/2);
- pos.chromEnd = pos.chromStart + newWinWidth;
+ pos.chromStart = Math.floor(center - hgTracks.newWinWidth/2);
+ pos.chromEnd = pos.chromStart + hgTracks.newWinWidth;
}
-setPositionByCoordinates(chromName, pos.chromStart+1, pos.chromEnd);
+ setPositionByCoordinates(hgTracks.chromName, pos.chromStart+1, pos.chromEnd);
return true;
}
function selectChange(img, selection)
{
initVars();
if(selection.x1 != selection.x2) { // TODO: Larry could you examine this?
if(checkPosition(img, selection)) {
updatePosition(img, selection, false);
jQuery('body').css('cursor', originalCursor);
} else {
jQuery('body').css('cursor', 'not-allowed');
}
}
return true;
}
function selectEnd(img, selection)
{
var now = new Date();
var doIt = false;
if(originalCursor != null)
jQuery('body').css('cursor', originalCursor);
// ignore releases outside of the image rectangle (allowing a 10 pixel slop)
if(autoHideSetting && checkPosition(img, selection)) {
// ignore single clicks that aren't in the top of the image (this happens b/c the clickClipHeight test in selectStart
// doesn't occur when the user single clicks).
- doIt = startDragZoom != null || selection.y1 <= clickClipHeight;
+ doIt = startDragZoom != null || selection.y1 <= hgTracks.clickClipHeight;
}
if(doIt) {
// startDragZoom is null if mouse has never been moved
if(updatePosition(img, selection, (selection.x2 == selection.x1) || startDragZoom == null || (now.getTime() - startDragZoom) < 100)) {
jQuery('body').css('cursor', 'wait');
document.TrackHeaderForm.submit();
}
} else {
setPosition(originalPosition, originalSize);
originalPosition = originalSize = null;
// if(mapHtml) {
// $('#map').append(mapHtml);
// }
}
// mapHtml = null;
@@ -282,71 +268,62 @@
function (e) {
mapEvent(e);
}
);
trackImg.mousedown(
function (e) {
mapMouseDown(e);
}
);
}
}
});
function loadImgAreaSelect(firstTime)
{
- var rulerEle = document.getElementById("hgt.rulerClickHeight");
- var dragSelectionEle = document.getElementById("hgt.dragSelection");
-
// disable if ruler is not visible.
- if((dragSelectionEle != null) && (dragSelectionEle.value == '1') && (rulerEle != null)) {
+ if(typeof(hgTracks) != "undefined" && hgTracks.dragSelection && hgTracks.rulerClickHeight > 0) {
var imgHeight = 0;
trackImg = $('#img_data_ruler');
if(trackImg == undefined || trackImg.length == 0) { // Revert to old imageV1
trackImg = $('#trackMap');
imgHeight = jQuery(trackImg).height();
} else {
imageV2 = true;
trackImgTbl = $('#imgTbl');
imgHeight = trackImg.height();
// XXXX Tim, I think we should get height from trackImgTbl, b/c it automatically adjusts as we add/delete items.
imgHeight = trackImgTbl.height();
}
- clickClipHeight = parseInt(rulerEle.value);
- newWinWidth = parseInt(document.getElementById("hgt.newWinWidth").value);
- revCmplDisp = parseInt(document.getElementById("hgt.revCmplDisp").value) == 0 ? false : true;
- insideX = parseInt(document.getElementById("hgt.insideX").value);
-
imgAreaSelect = jQuery((trackImgTbl || trackImg).imgAreaSelect({ selectionColor: 'blue', outerColor: '',
minHeight: imgHeight, maxHeight: imgHeight,
onSelectStart: selectStart, onSelectChange: selectChange, onSelectEnd: selectEnd,
autoHide: autoHideSetting, movable: false,
- clickClipHeight: clickClipHeight}));
+ clickClipHeight: hgTracks.rulerClickHeight}));
}
}
function makeItemsEnd(img, selection)
{
var image = $(img);
var imageId = image.attr('id');
var trackName = imageId.substring('img_data_'.length);
-var chrom = document.getElementById("hgt.chromName").value;
var pos = selectionPixelsToBases(image, selection);
var command = document.getElementById('hgt_doJsCommand');
-command.value = "makeItems " + trackName + " " + chrom + " " + pos.chromStart + " " + pos.chromEnd;
+command.value = "makeItems " + trackName + " " + hgTracks.chromName + " " + pos.chromStart + " " + pos.chromEnd;
document.TrackHeaderForm.submit();
return true;
}
function setUpMakeItemsDrag(trackName)
{
// Set up so that they can drag out to define a new item on a makeItems track.
var img = $("#img_data_" + trackName);
if(img != undefined && img.length != 0) {
var trackImgTbl = $('#imgTbl');
var imgHeight = trackImgTbl.height();
jQuery(img.imgAreaSelect( { selectionColor: 'green', outerColor: '',
minHeight: imgHeight, maxHeight: imgHeight, onSelectEnd: makeItemsEnd,
autoHide: true, movable: false}));
}
@@ -473,33 +450,31 @@
if( isWithin(chr.left,pxUp,chr.right+1) ) {
selRange.beg = convertToBases(pxDown);
selRange.end = convertToBases(pxUp);
if(Math.abs(selRange.end - selRange.beg) < 20)
mouseHasMoved = false; // Drag so small: treat as simple click
else
dontAsk = false;
}
//else warn("chromIdeo("+chr.name+") NOT WITHIN HORIZONTAL RANGE\n selected range (pix):"+pxDown+"-"+pxUp+" chrom range (pix):"+chr.left+"-"+chr.right);
}
if(mouseHasMoved == false) { // Not else because small drag turns this off
hiliteShow(pxUp,pxUp);
- var curBeg = parseInt($("#hgt\\.winStart").val()); // Note the escaped '.'
- var curEnd = parseInt($("#hgt\\.winEnd").val());
- var curWidth = curEnd - curBeg;
+ var curWidth = hgTracks.winEnd - hgTracks.winStart;
selRange.beg = convertToBases(pxUp) - Math.round(curWidth/2); // Notice that beg is based upon up position
selRange.end = selRange.beg + curWidth;
}
if(selRange.end > -1) {
// prompt, then submit for new position
selRange = rangeNormalizeToChrom(selRange,chr);
if(mouseHasMoved == false) { // Update highlight by converting bp back to pix
pxDown = convertFromBases(selRange.beg)
pxUp = convertFromBases(selRange.end)
hiliteShow(pxDown,pxUp);
}
//if((selRange.end - selRange.beg) < 50000)
// dontAsk = true;
if(dontAsk || confirm("Jump to new position:\n\n"+chr.name+":"+commify(selRange.beg)+"-"+commify(selRange.end)+" size:"+commify(selRange.width)) ) {
setPositionByCoordinates(chr.name, selRange.beg, selRange.end)
@@ -1073,31 +1048,31 @@
// Updates the 'position/search" display with change due to panning
var portalWidthBases = imgBoxPortalEnd - imgBoxPortalStart;
var portalScrolledX = (imgBoxPortalOffsetX+imgBoxLeftLabel) + newOffsetX;
var newPortalStart = imgBoxPortalStart - Math.round(portalScrolledX*imgBoxBasesPerPixel); // As offset goes down, bases seen goes up!
if( newPortalStart < imgBoxChromStart && bounded) // Stay within bounds
newPortalStart = imgBoxChromStart;
var newPortalEnd = newPortalStart + portalWidthBases;
if( newPortalEnd > imgBoxChromEnd && bounded) {
newPortalEnd = imgBoxChromEnd;
newPortalStart = newPortalEnd - portalWidthBases;
}
if(newPortalStart > 0) {
// XXXX ? imgBoxPortalStart = newPortalStart;
// XXXX ? imgBoxPortalEnd = newPortalEnd;
- var newPos = document.getElementById("hgt.chromName").value + ":" + commify(newPortalStart) + "-" + commify(newPortalEnd);
+ var newPos = hgTracks.chromName + ":" + commify(newPortalStart) + "-" + commify(newPortalEnd);
setPosition(newPos, (newPortalEnd - newPortalStart + 1));
}
return true;
}
function mapTopAndBottom(mapName,left,right)
{
// Find the top and bottom px given left and right boundaries
var span = { top: -10, bottom: -10 };
var items = $("map[name='"+mapName+"']").children();
if($(items).length>0) {
$(items).each(function(t) {
var loc = this.coords.split(",");
var aleft = parseInt(loc[0]);
var aright = parseInt(loc[2]);
if(aleft < right && aright >= left) {
@@ -1593,31 +1568,31 @@
function contextMenuHitFinish(menuItemClicked, menuObject, cmd, args)
{
// dispatcher for context menu hits
var id = selectedMenuItem.id;
if(menuObject.shown) {
// showWarning("Spinning: menu is still shown");
setTimeout(function() { contextMenuHitFinish(menuItemClicked, menuObject, cmd); }, 10);
return;
}
if(cmd == 'selectWholeGene' || cmd == 'getDna') {
// bring whole gene into view or redirect to DNA screen.
var href = selectedMenuItem.href;
var chromStart, chromEnd;
var a = /hgg_chrom=(\w+)&/.exec(href);
// Many links leave out the chrom (b/c it's in the server side cart as "c")
- var chrom = document.getElementById("hgt.chromName").value;
+ var chrom = hgTracks.chromName;
if(a) {
if(a && a[1])
chrom = a[1];
a = /hgg_start=(\d+)/.exec(href);
if(a && a[1])
// XXXX does chromStart have to be incremented by 1?
chromStart = a[1];
a = /hgg_end=(\d+)/.exec(href);
if(a && a[1])
chromEnd = a[1];
} else {
// a = /hgc.*\W+c=(\w+)/.exec(href);
a = /hgc.*\W+c=(\w+)/.exec(href);
if(a && a[1])
chrom = a[1];
@@ -2503,35 +2478,36 @@
}
} else {
if(imageV2) {
// We update row's one at a time (updating the whole imgTable at one time doesn't work in IE).
for (id in trackDbJson) {
if(!updateTrackImgForId(response, id)) {
showWarning("Couldn't parse out new image for id: " + id);
//alert("Couldn't parse out new image for id: " + id+"BR"+response); // Very helpful
}
}
// parse out and reset position info.
a = /]*NAME=["']position['"] VALUE=['"]([^'"]+)/.exec(response);
if(a != null && a[1] != null) {
var o = parsePosition(a[1]);
setPosition(a[1], commify(o.end - o.start + 1));
- $("#hgt\\.winStart").val(o.start - 1);
- $("#hgt\\.winEnd").val(o.end);
+ hgTracks.winStart = o.start - 1;
+ hgTracks.winEnd = o.end;
} else {
showWarning("Couldn't parse out new position info");
}
+ abort("This is broken (needs to be fixed to pull new variable values out of the response)");
a = /]*id=["']hgt\.newWinWidth['"][^>]*value=['"]([^'"]+)/.exec(response);
if(a != null && a[1] != null) {
$("#hgt\\.newWinWidth").val(a[1]);
}
afterImgTblReload();
} else {
a= /
]+SRC[^>]+id='trackMap[^>]*)>/.exec(response);
// Deal with a is null
if(a[1]) {
var b = /WIDTH\s*=\s*['"]?(\d+)['"]?/.exec(a[1]);
var width = b[1];
b = /HEIGHT\s*=\s*['"]?(\d+)['"]?/.exec(a[1]);
var height = b[1];
b = /SRC\s*=\s*"([^")]+)"/.exec(a[1]);
var src = b[1];