Browser.js
Summary
No overview generated for 'Browser.js'
|
Class Summary
|
| Browser |
This class is the main interface between JBrowse and embedders
|
var Browser = function(params) {
dojo.require("dojo.dnd.Source");
dojo.require("dojo.dnd.Moveable");
dojo.require("dojo.dnd.Mover");
dojo.require("dojo.dnd.move");
dojo.require("dijit.layout.ContentPane");
dojo.require("dijit.layout.BorderContainer");
var refSeqs = params.refSeqs;
var trackData = params.trackData;
this.deferredFunctions = [];
this.dataRoot = params.dataRoot;
var dataRoot;
if ("dataRoot" in params)
dataRoot = params.dataRoot;
else
dataRoot = "";
this.names = new LazyTrie(dataRoot + "names/lazy-",
dataRoot + "names/root.json");
this.tracks = [];
var brwsr = this;
brwsr.isInitialized = false;
dojo.addOnLoad(
function() {
dojo.addClass(document.body, "tundra");
brwsr.container = dojo.byId(params.containerID);
brwsr.container.genomeBrowser = brwsr;
var topPane = document.createElement("div");
brwsr.container.appendChild(topPane);
var overview = document.createElement("div");
overview.className = "overview";
overview.id = "overview";
topPane.appendChild(overview);
var maxBase = refSeqs.reduce(function(a,b) {return a.end > b.end ? a : b;}).end;
var navbox = brwsr.createNavBox(topPane, (2 * (String(maxBase).length + (((String(maxBase).length / 3) | 0) / 2))) + 2, params);
var viewElem = document.createElement("div");
brwsr.container.appendChild(viewElem);
viewElem.className = "dragWindow";
var containerWidget = new dijit.layout.BorderContainer({
liveSplitters: false,
design: "sidebar",
gutters: false
}, brwsr.container);
var contentWidget = new dijit.layout.ContentPane({region: "top"}, topPane);
var browserWidget = new dijit.layout.ContentPane({region: "center"}, viewElem);
brwsr.locationTrap = document.createElement("div");
brwsr.locationTrap.className = "locationTrap";
topPane.appendChild(brwsr.locationTrap);
topPane.style.overflow="hidden";
brwsr.allRefs = {};
for (var i = 0; i < refSeqs.length; i++)
brwsr.allRefs[refSeqs[i].name] = refSeqs[i];
var refCookie = dojo.cookie(params.containerID + "-refseq");
brwsr.refSeq = refSeqs[0];
for (var i = 0; i < refSeqs.length; i++) {
brwsr.chromList.options[i] = new Option(refSeqs[i].name,
refSeqs[i].name);
if (refSeqs[i].name.toUpperCase() == String(refCookie).toUpperCase()) {
brwsr.refSeq = brwsr.allRefs[refSeqs[i].name];
brwsr.chromList.selectedIndex = i;
}
}
dojo.connect(brwsr.chromList, "onchange", function(event) {
var oldLocMap = dojo.fromJson(dojo.cookie(brwsr.container.id + "-location")) || {};
var newRef = brwsr.allRefs[brwsr.chromList.options[brwsr.chromList.selectedIndex].value];
if (oldLocMap[newRef.name])
brwsr.navigateTo(newRef.name + ":"
+ oldLocMap[newRef.name]);
else
brwsr.navigateTo(newRef.name + ":"
+ (((newRef.start + newRef.end) * 0.4) | 0)
+ " .. "
+ (((newRef.start + newRef.end) * 0.6) | 0));
});
var gv = new GenomeView(viewElem, 250, brwsr.refSeq, 1/200);
brwsr.view = gv;
brwsr.viewElem = viewElem;
viewElem.view = gv;
dojo.connect(browserWidget, "resize", function() {
gv.sizeInit();
brwsr.view.locationTrapHeight = dojo.marginBox(navbox).h;
gv.showFine();
gv.showCoarse();
});
brwsr.view.locationTrapHeight = dojo.marginBox(navbox).h;
dojo.connect(gv, "onFineMove", brwsr, "onFineMove");
dojo.connect(gv, "onCoarseMove", brwsr, "onCoarseMove");
var trackListDiv = brwsr.createTrackList(brwsr.container, params);
containerWidget.startup();
brwsr.isInitialized = true;
var oldLocMap = dojo.fromJson(dojo.cookie(brwsr.container.id + "-location")) || {};
if (params.location) {
brwsr.navigateTo(params.location);
} else if (oldLocMap[brwsr.refSeq.name]) {
brwsr.navigateTo(brwsr.refSeq.name
+ ":"
+ oldLocMap[brwsr.refSeq.name]);
} else if (params.defaultLocation){
brwsr.navigateTo(params.defaultLocation);
} else {
brwsr.navigateTo(brwsr.refSeq.name
+ ":"
+ ((((brwsr.refSeq.start + brwsr.refSeq.end)
* 0.4) | 0)
+ " .. "
+ (((brwsr.refSeq.start + brwsr.refSeq.end)
* 0.6) | 0)));
}
for (var i = 0; i < brwsr.deferredFunctions.length; i++)
brwsr.deferredFunctions[i]();
brwsr.deferredFunctions = [];
});
};
Browser.prototype.onFineMove = function(startbp, endbp) {
var length = this.view.ref.end - this.view.ref.start;
var trapLeft = Math.round((((startbp - this.view.ref.start) / length)
* this.view.overviewBox.w) + this.view.overviewBox.l);
var trapRight = Math.round((((endbp - this.view.ref.start) / length)
* this.view.overviewBox.w) + this.view.overviewBox.l);
var locationTrapStyle;
if (dojo.isIE) {
locationTrapStyle =
"top: " + this.view.overviewBox.t + "px;"
+ "height: " + this.view.overviewBox.h + "px;"
+ "left: " + trapLeft + "px;"
+ "width: " + (trapRight - trapLeft) + "px;"
+ "border-width: 0px";
} else {
locationTrapStyle =
"top: " + this.view.overviewBox.t + "px;"
+ "height: " + this.view.overviewBox.h + "px;"
+ "left: " + this.view.overviewBox.l + "px;"
+ "width: " + (trapRight - trapLeft) + "px;"
+ "border-width: " + "0px "
+ (this.view.overviewBox.w - trapRight) + "px "
+ this.view.locationTrapHeight + "px " + trapLeft + "px;";
}
this.locationTrap.style.cssText = locationTrapStyle;
};
Browser.prototype.createTrackList = function(parent, params) {
var leftPane = document.createElement("div");
leftPane.style.cssText="width: 10em";
parent.appendChild(leftPane);
var leftWidget = new dijit.layout.ContentPane({region: "left", splitter: true}, leftPane);
var trackListDiv = document.createElement("div");
trackListDiv.id = "tracksAvail";
trackListDiv.className = "container handles";
trackListDiv.style.cssText = "width: 100%; height: 100%;";
trackListDiv.innerHTML =
"Available Tracks:<br/>(Drag <img src=\""
+ (params.browserRoot ? params.browserRoot : "")
+ "img/right_arrow.png\"/> to view)<br/><br/>";
leftPane.appendChild(trackListDiv);
var brwsr = this;
var changeCallback = function() {
brwsr.view.showVisibleBlocks(true);
};
var trackListCreate = function(track, hint) {
var node = document.createElement("div");
node.className = "tracklist-label";
node.innerHTML = track.key;
if ("avatar" != hint) {
var container = document.createElement("div");
container.className = "tracklist-container";
container.appendChild(node);
node = container;
}
node.id = dojo.dnd.getUniqueId();
return {node: node, data: track, type: ["track"]};
};
this.trackListWidget = new dojo.dnd.Source(trackListDiv,
{creator: trackListCreate,
accept: ["track"],
withHandles: false});
var trackCreate = function(track, hint) {
var node;
if ("avatar" == hint) {
return trackListCreate(track, hint);
} else {
var replaceData = {refseq: brwsr.refSeq.name};
var url = track.url.replace(/\{([^}]+)\}/g, function(match, group) {return replaceData[group];});
var klass = eval(track.type);
var newTrack = new klass(track, url, brwsr.refSeq,
{
changeCallback: changeCallback,
trackPadding: brwsr.view.trackPadding,
baseUrl: brwsr.dataRoot,
charWidth: brwsr.view.charWidth,
seqHeight: brwsr.view.seqHeight
});
node = brwsr.view.addTrack(newTrack);
}
return {node: node, data: track, type: ["track"]};
};
this.viewDndWidget = new dojo.dnd.Source(this.view.container,
{
creator: trackCreate,
accept: ["track"],
withHandles: true
});
dojo.subscribe("/dnd/drop", function(source,nodes,iscopy){
var trackLabels = dojo.map(brwsr.view.trackList(),
function(track) { return track.name; });
dojo.cookie(brwsr.container.id + "-tracks",
trackLabels.join(","),
{expires: 60});
brwsr.view.showVisibleBlocks();
});
this.trackListWidget.insertNodes(false, params.trackData);
var oldTrackList = dojo.cookie(this.container.id + "-tracks");
if (params.tracks) {
this.showTracks(params.tracks);
} else if (oldTrackList) {
this.showTracks(oldTrackList);
} else if (params.defaultTracks) {
this.showTracks(params.defaultTracks);
}
return trackListDiv;
};
Browser.prototype.addTracks = function(trackList, replace) {
if (!this.isInitialized) {
var brwsr = this;
this.deferredFunctions.push(
function() {brwsr.addTracks(trackList, show); }
);
return;
}
this.tracks.concat(trackList);
if (show || (show === undefined)) {
this.showTracks(dojo.map(trackList,
function(t) {return t.label;}).join(","));
}
};
Browser.prototype.navigateTo = function(loc) {
if (!this.isInitialized) {
var brwsr = this;
this.deferredFunctions.push(function() { brwsr.navigateTo(loc); });
return;
}
loc = dojo.trim(loc);
var matches = String(loc).match(/^(((\S*)\s*:)?\s*(-?[0-9,.]*[0-9])\s*(\.\.|-|\s+))?\s*(-?[0-9,.]+)$/i);
if (matches) {
if (matches[3]) {
var refName;
for (ref in this.allRefs) {
if ((matches[3].toUpperCase() == ref.toUpperCase())
||
("CHR" + matches[3].toUpperCase() == ref.toUpperCase())
||
(matches[3].toUpperCase() == "CHR" + ref.toUpperCase())) {
refName = ref;
}
}
if (refName) {
dojo.cookie(this.container.id + "-refseq", refName, {expires: 60});
if (refName == this.refSeq.name) {
this.view.setLocation(this.refSeq,
parseInt(matches[4].replace(/[,.]/g, "")),
parseInt(matches[6].replace(/[,.]/g, "")));
} else {
var curTracks = [];
this.viewDndWidget.forInItems(function(obj, id, map) {
curTracks.push(obj.data);
});
for (var i = 0; i < this.chromList.options.length; i++)
if (this.chromList.options[i].text == refName)
this.chromList.selectedIndex = i;
this.refSeq = this.allRefs[refName];
this.view.setLocation(this.refSeq,
parseInt(matches[4].replace(/[,.]/g, "")),
parseInt(matches[6].replace(/[,.]/g, "")));
this.viewDndWidget.insertNodes(false, curTracks);
}
return;
}
} else if (matches[4]) {
this.view.setLocation(this.refSeq,
parseInt(matches[4].replace(/[,.]/g, "")),
parseInt(matches[6].replace(/[,.]/g, "")));
return;
} else if (matches[6]) {
this.view.centerAtBase(parseInt(matches[6].replace(/[,.]/g, "")));
return;
}
}
var brwsr = this;
this.names.exactMatch(loc, function(nameMatches) {
var goingTo;
for (var i = 0; i < nameMatches.length; i++) {
if (nameMatches[i][1] == loc)
goingTo = nameMatches[i];
}
if (!goingTo) {
for (var i = 0; i < nameMatches.length; i++) {
if (nameMatches[i][1].toLowerCase() == loc.toLowerCase())
goingTo = nameMatches[i];
}
}
if (!goingTo) goingTo = nameMatches[0];
var startbp = goingTo[3];
var endbp = goingTo[4];
var flank = Math.round((endbp - startbp) * .2);
brwsr.navigateTo(goingTo[2]
+ ":" + (startbp - flank)
+ ".." + (endbp + flank));
brwsr.showTracks(brwsr.names.extra[nameMatches[0][0]]);
});
};
Browser.prototype.showTracks = function(trackNameList) {
if (!this.isInitialized) {
var brwsr = this;
this.deferredFunctions.push(
function() { brwsr.showTracks(trackNameList); }
);
return;
}
var trackNames = trackNameList.split(",");
var removeFromList = [];
var brwsr = this;
for (var n = 0; n < trackNames.length; n++) {
this.trackListWidget.forInItems(function(obj, id, map) {
if (trackNames[n] == obj.data.label) {
brwsr.viewDndWidget.insertNodes(false, [obj.data]);
removeFromList.push(id);
}
});
}
var movedNode;
for (var i = 0; i < removeFromList.length; i++) {
this.trackListWidget.delItem(removeFromList[i]);
movedNode = dojo.byId(removeFromList[i]);
movedNode.parentNode.removeChild(movedNode);
}
};
Browser.prototype.visibleRegion = function() {
return this.view.ref.name + ":" + Math.round(this.view.minVisible()) + ".." + Math.round(this.view.maxVisible());
};
Browser.prototype.visibleTracks = function() {
var trackLabels = dojo.map(this.view.trackList(),
function(track) { return track.name; });
return trackLabels.join(",");
};
Browser.prototype.onCoarseMove = function(startbp, endbp) {
var length = this.view.ref.end - this.view.ref.start;
var trapLeft = Math.round((((startbp - this.view.ref.start) / length)
* this.view.overviewBox.w) + this.view.overviewBox.l);
var trapRight = Math.round((((endbp - this.view.ref.start) / length)
* this.view.overviewBox.w) + this.view.overviewBox.l);
this.view.locationThumb.style.cssText =
"height: " + (this.view.overviewBox.h - 4) + "px; "
+ "left: " + trapLeft + "px; "
+ "width: " + (trapRight - trapLeft) + "px;"
+ "z-index: 20";
if (! this.isInitialized) return;
var locString = Util.addCommas(Math.round(startbp)) + " .. " + Util.addCommas(Math.round(endbp));
this.locationBox.value = locString;
this.goButton.disabled = true;
this.locationBox.blur();
var oldLocMap = dojo.fromJson(dojo.cookie(this.container.id + "-location"));
if ((typeof oldLocMap) != "object") oldLocMap = {};
oldLocMap[this.refSeq.name] = locString;
dojo.cookie(this.container.id + "-location",
dojo.toJson(oldLocMap),
{expires: 60});
document.title = this.refSeq.name + ":" + locString;
};
Browser.prototype.createNavBox = function(parent, locLength, params) {
var brwsr = this;
var navbox = document.createElement("div");
var browserRoot = params.browserRoot ? params.browserRoot : "";
navbox.id = "navbox";
parent.appendChild(navbox);
navbox.style.cssText = "text-align: center; padding: 2px; z-index: 10;";
var moveLeft = document.createElement("input");
moveLeft.type = "image";
moveLeft.src = browserRoot + "img/slide-left.png";
moveLeft.id = "moveLeft";
moveLeft.className = "icon nav";
moveLeft.style.height = "40px";
dojo.connect(moveLeft, "click",
function(event) {
dojo.stopEvent(event);
brwsr.view.slide(0.9);
});
navbox.appendChild(moveLeft);
var moveRight = document.createElement("input");
moveRight.type = "image";
moveRight.src = browserRoot + "img/slide-right.png";
moveRight.id="moveRight";
moveRight.className = "icon nav";
moveRight.style.height = "40px";
dojo.connect(moveRight, "click",
function(event) {
dojo.stopEvent(event);
brwsr.view.slide(-0.9);
});
navbox.appendChild(moveRight);
navbox.appendChild(document.createTextNode("\u00a0\u00a0\u00a0\u00a0"));
var bigZoomOut = document.createElement("input");
bigZoomOut.type = "image";
bigZoomOut.src = browserRoot + "img/zoom-out-2.png";
bigZoomOut.id = "bigZoomOut";
bigZoomOut.className = "icon nav";
bigZoomOut.style.height = "40px";
navbox.appendChild(bigZoomOut);
dojo.connect(bigZoomOut, "click",
function(event) {
dojo.stopEvent(event);
brwsr.view.zoomOut(undefined, undefined, 2);
});
var zoomOut = document.createElement("input");
zoomOut.type = "image";
zoomOut.src = browserRoot + "img/zoom-out-1.png";
zoomOut.id = "zoomOut";
zoomOut.className = "icon nav";
zoomOut.style.height = "40px";
dojo.connect(zoomOut, "click",
function(event) {
dojo.stopEvent(event);
brwsr.view.zoomOut();
});
navbox.appendChild(zoomOut);
var zoomIn = document.createElement("input");
zoomIn.type = "image";
zoomIn.src = browserRoot + "img/zoom-in-1.png";
zoomIn.id = "zoomIn";
zoomIn.className = "icon nav";
zoomIn.style.height = "40px";
dojo.connect(zoomIn, "click",
function(event) {
dojo.stopEvent(event);
brwsr.view.zoomIn();
});
navbox.appendChild(zoomIn);
var bigZoomIn = document.createElement("input");
bigZoomIn.type = "image";
bigZoomIn.src = browserRoot + "img/zoom-in-2.png";
bigZoomIn.id = "bigZoomIn";
bigZoomIn.className = "icon nav";
bigZoomIn.style.height = "40px";
dojo.connect(bigZoomIn, "click",
function(event) {
dojo.stopEvent(event);
brwsr.view.zoomIn(undefined, undefined, 2);
});
navbox.appendChild(bigZoomIn);
navbox.appendChild(document.createTextNode("\u00a0\u00a0\u00a0\u00a0"));
this.chromList = document.createElement("select");
this.chromList.id="chrom";
navbox.appendChild(this.chromList);
this.locationBox = document.createElement("input");
this.locationBox.size=locLength;
this.locationBox.type="text";
this.locationBox.id="location";
dojo.connect(this.locationBox, "keydown", function(event) {
if (event.keyCode == dojo.keys.ENTER) {
brwsr.navigateTo(brwsr.locationBox.value);
brwsr.goButton.disabled = true;
dojo.stopEvent(event);
} else {
brwsr.goButton.disabled = false;
}
});
navbox.appendChild(this.locationBox);
this.goButton = document.createElement("button");
this.goButton.appendChild(document.createTextNode("Go"));
this.goButton.disabled = true;
dojo.connect(this.goButton, "click", function(event) {
brwsr.navigateTo(brwsr.locationBox.value);
brwsr.goButton.disabled = true;
dojo.stopEvent(event);
});
navbox.appendChild(this.goButton);
return navbox;
};
Documentation generated by
JSDoc on Sat Jun 13 17:13:32 2009