galaxy-commits
Threads by month
- ----- 2025 -----
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/9ec73a5b31a4/
changeset: r5102:9ec73a5b31a4
user: greg
date: 2011-02-22 16:38:35
summary: (no commit message)
affected #: 2 files (173 bytes)
--- a/lib/galaxy/web/controllers/library_common.py Mon Feb 21 16:25:35 2011 -0500
+++ b/lib/galaxy/web/controllers/library_common.py Tue Feb 22 10:38:35 2011 -0500
@@ -1585,6 +1585,7 @@
message += '(%s)' % ldda.name
message += '. '
if valid_ldda_ids:
+ encoded_ldda_ids = [ trans.security.encode_id( ldda_id ) for ldda_id in valid_ldda_ids ]
folder_id = trans.security.encode_id( valid_lddas[0].library_dataset.folder.id )
trans.response.send_redirect( web.url_for( controller='library_common',
action='ldda_permissions',
@@ -1592,7 +1593,7 @@
use_panels=use_panels,
library_id=library_id,
folder_id=folder_id,
- id=",".join( valid_ldda_ids ),
+ id=",".join( encoded_ldda_ids ),
show_deleted=show_deleted,
message=util.sanitize_text( message ),
status=status ) )
--- a/templates/library/common/browse_library.mako Mon Feb 21 16:25:35 2011 -0500
+++ b/templates/library/common/browse_library.mako Tue Feb 22 10:38:35 2011 -0500
@@ -361,9 +361,7 @@
<div style="float: left; margin-left: 2px;" class="menubutton split popup" id="folder_img-${folder.id}-popup"><a class="folder-${encoded_id}-click" href="javascript:void(0);">
%if folder.deleted:
- <span class="libraryItem-error">
- ${folder.name}
- </span>
+ <span class="libraryItem-error">${folder.name}</span>
%else:
${folder.name}
%endif
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Update bowtie_wrapper and bowtie_color_wrapper to use test data from the external test data repository
by Bitbucket 21 Feb '11
by Bitbucket 21 Feb '11
21 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/b26e5c6ff96d/
changeset: r5101:b26e5c6ff96d
user: natefoo
date: 2011-02-21 22:25:35
summary: Update bowtie_wrapper and bowtie_color_wrapper to use test data from the external test data repository
affected #: 2 files (428 bytes)
--- a/tools/sr_mapping/bowtie_color_wrapper.xml Mon Feb 21 15:54:22 2011 -0500
+++ b/tools/sr_mapping/bowtie_color_wrapper.xml Mon Feb 21 16:25:35 2011 -0500
@@ -396,8 +396,7 @@
chrM_color needs to be the base location/name of the index files.
--><param name="genomeSource" value="indexed" />
- <!-- this is the backwards-compatible "unique value" for this index, not an actual path -->
- <param name="index" value="/galaxy/data/equCab2_chrM/bowtie_index/cs/chrM" />
+ <param name="index" value="equCab2chrM" /><param name="sPaired" value="single" /><param name="sInput1" ftype="fastqcssanger" value="bowtie_in1.fastqcssanger" /><param name="sSettingsType" value="preSet" />
@@ -466,8 +465,7 @@
chrM_base is the index files' location/base name.
--><param name="genomeSource" value="indexed" />
- <!-- this is the backwards-compatible "unique value" for this index, not an actual path -->
- <param name="index" value="/galaxy/data/equCab2_chrM/bowtie_index/cs/chrM" />
+ <param name="index" value="equCab2chrM" /><param name="sPaired" value="single" /><param name="sInput1" ftype="fastqcssanger" value="bowtie_in1.fastqcssanger" /><param name="sSettingsType" value="full" />
--- a/tools/sr_mapping/bowtie_wrapper.xml Mon Feb 21 15:54:22 2011 -0500
+++ b/tools/sr_mapping/bowtie_wrapper.xml Mon Feb 21 16:25:35 2011 -0500
@@ -379,8 +379,7 @@
chrM_base needs to be the base location/name of the index files.
--><param name="genomeSource" value="indexed" />
- <!-- this is the backwards-compatible "unique value" for this index, not an actual path -->
- <param name="index" value="/galaxy/data/equCab2_chrM/bowtie_index/chrM" />
+ <param name="index" value="equCab2chrM" /><param name="sPaired" value="single" /><param name="sInput1" ftype="fastqsanger" value="bowtie_in2.fastqsanger" /><param name="sSettingsType" value="preSet" />
@@ -448,7 +447,7 @@
--><param name="genomeSource" value="indexed" /><!-- this is the backwards-compatible "unique value" for this index, not an actual path -->
- <param name="index" value="/galaxy/data/equCab2_chrM/bowtie_index/chrM" />
+ <param name="index" value="equCab2chrM" /><param name="sPaired" value="single" /><param name="sInput1" ftype="fastqsanger" value="bowtie_in2.fastqsanger" /><param name="sSettingsType" value="full" />
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/89df419a7e21/
changeset: r5100:89df419a7e21
user: jgoecks
date: 2011-02-21 21:54:22
summary: Trackster refactoring: (a) move ReadTrack-specific code out of FeatureTrack and into ReadTrack; (b) move VCFTrack-specific code of out FeatureTrack and into VcfTTrack. This makes it easier to modify drawing for each track type but creates some repeated code in draw_tile() for different classes that needs to be cleaned up.
affected #: 2 files (13.8 KB)
--- a/lib/galaxy/visualization/tracks/data_providers.py Mon Feb 21 15:10:22 2011 -0500
+++ b/lib/galaxy/visualization/tracks/data_providers.py Mon Feb 21 15:54:22 2011 -0500
@@ -285,7 +285,7 @@
paired_pending = {}
for read in data:
if len(results) > MAX_VALS:
- message = "Only the first %s pairs are being displayed." % MAX_VALS
+ message = "Only the first %s reads are being displayed." % MAX_VALS
break
qname = read.qname
seq = read.seq
--- a/static/scripts/trackster.js Mon Feb 21 15:10:22 2011 -0500
+++ b/static/scripts/trackster.js Mon Feb 21 15:54:22 2011 -0500
@@ -2266,8 +2266,588 @@
*/
return highest_slot;
},
- // Right now this function is used only for rendering BAM reads.
- rect_or_text: function(ctx, w_scale, tile_low, tile_high, feature_start, cigar, orig_seq, y_center) {
+ /**
+ * Draw FeatureTrack tile.
+ */
+ draw_tile: function(resolution, tile_index, parent_element, w_scale) {
+ var tile_low = tile_index * DENSITY * resolution,
+ tile_high = ( tile_index + 1 ) * DENSITY * resolution,
+ tile_span = tile_high - tile_low;
+ //console.log("drawing " + tile_low + " to " + tile_high);
+
+ /*for (var k in this.data_cache.obj_cache) {
+ var k_split = k.split("_"), k_low = k_split[0], k_high = k_split[1];
+ if (k_low <= tile_low && k_high >= tile_high) {
+ data = this.data_cache.get(k);
+ break;
+ }
+ }*/
+
+ //
+ // Get tile data; if data not available, issue get_data request and return.
+ //
+ var result = this.data_cache.get_data(tile_low, tile_high, this.mode);
+ if (result === undefined || result === "pending" ||
+ (this.mode !== "Auto" && result.dataset_type === "summary_tree")) {
+ this.data_queue[ [tile_low, tile_high] ] = true;
+ this.get_data(tile_low, tile_high);
+ return;
+ }
+ //
+ // Create/set/compute some useful vars.
+ //
+ var width = Math.ceil( tile_span * w_scale ),
+ label_color = this.prefs.label_color,
+ block_color = this.prefs.block_color,
+ mode = this.mode,
+ min_height = 25,
+ no_label,
+ left_offset = this.left_offset,
+ slots, required_height, y_scale;
+
+ var canvas = document.createElement("canvas");
+ if (window.G_vmlCanvasManager) { G_vmlCanvasManager.initElement(canvas); } // EXCANVAS HACK
+ canvas = $(canvas);
+
+ if (result.dataset_type === "summary_tree") {
+ required_height = this.summary_draw_height;
+ } else if (mode === "Dense") {
+ required_height = min_height;
+ y_scale = DENSE_TRACK_HEIGHT;
+ } else {
+ // Set y_scale based on mode and result data.
+ if (mode === "Squish") {
+ y_scale = SQUISH_TRACK_HEIGHT;
+ no_label = true;
+ } else if (mode === "Pack") {
+ y_scale = PACK_TRACK_HEIGHT;
+ // TODO: is there data where there is no label even in pack mode?
+ no_label = false;
+ } else if (result.extra_info === "no_detail") { // mode == "Auto"
+ y_scale = NO_DETAIL_TRACK_HEIGHT;
+ no_label = true;
+ } else {
+ y_scale = PACK_TRACK_HEIGHT;
+ no_label = false;
+ }
+
+ // Calculate new slots incrementally for this new chunk of data and update height if necessary.
+ required_height = this.incremental_slots(w_scale, result.data, no_label, mode) * y_scale + min_height;
+ slots = this.inc_slots[w_scale];
+ }
+
+ canvas.get(0).width = width + left_offset;
+ canvas.get(0).height = required_height;
+ if (result.dataset_type == "summary_tree") {
+ // Increase canvas height in order to display max label.
+ canvas.get(0).height += LABEL_SPACING + CHAR_HEIGHT_PX;
+ }
+ parent_element.parent().css("height", Math.max(this.height_px, required_height) + "px");
+ // console.log(( tile_low - this.view.low ) * w_scale, tile_index, w_scale);
+ var ctx = canvas.get(0).getContext("2d");
+ ctx.fillStyle = block_color;
+ ctx.font = this.default_font;
+ ctx.textAlign = "right";
+ this.container_div.find(".yaxislabel").remove();
+
+ //
+ // Draw summary tree. If tree is drawn, canvas is returned.
+ //
+ if (result.dataset_type == "summary_tree") {
+ var
+ // Set base Y so that max label and data do not overlap. Base Y is where rectangle bases
+ // start. However, height of each rectangle is relative to required_height; hence, the
+ // max rectangle is required_height.
+ base_y = required_height + LABEL_SPACING + CHAR_HEIGHT_PX;
+ points = result.data,
+ max = result.max,
+ delta_x_px = Math.ceil(result.delta * w_scale);
+
+ var max_label = $("<div />").addClass('yaxislabel');
+ max_label.text(max);
+
+ max_label.css({ position: "absolute", top: "22px", left: "10px" });
+ max_label.prependTo(this.container_div);
+
+ for (var i = 0, len = points.length; i < len; i++) {
+ var x = Math.floor( (points[i][0] - tile_low) * w_scale );
+ var y = points[i][1];
+
+ if (!y) { continue; }
+ var y_px = y / max * required_height;
+
+ ctx.fillStyle = "black";
+ ctx.fillRect(x + left_offset, base_y - y_px, delta_x_px, y_px);
+
+ // Draw number count if it can fit the number with some padding, otherwise things clump up
+ var text_padding_req_x = 4;
+ if (this.prefs.show_counts && (ctx.measureText(y).width + text_padding_req_x) < delta_x_px) {
+ ctx.fillStyle = "#666";
+ ctx.textAlign = "center";
+ ctx.fillText(y, x + left_offset + (delta_x_px/2), 10);
+ }
+ }
+ return canvas;
+ }
+
+ //
+ // If there is a message, show it; also, return if there's no data to draw.
+ // FIXME: Why is this drawn on a canvas instead of a div?
+ if (result.message) {
+ canvas.css({
+ "border-color": "red"
+ });
+
+ ctx.fillStyle = "red";
+ ctx.textAlign = "left";
+ ctx.fillText(result.message, 100 + left_offset, y_scale);
+
+ // If there's no data, return.
+ if (!result.data) {
+ return canvas;
+ }
+ }
+
+ //
+ // If tile is filterable, add class to canvas.
+ //
+ for (var f = 0; f < this.filters.length; f++) {
+ if (result.data.length && this.filters[f].applies_to(result.data[0])) {
+ canvas.addClass(FILTERABLE_CLASS);
+ break;
+ }
+ }
+
+ //
+ // Draw data points.
+ //
+ var data = result.data;
+
+ // Set mode in Auto; never use Dense, so decide b/t Squish and Pack.
+ if (mode == "Auto" && data.length > 0) {
+ if (feature.length <= 4) {
+ mode = "Squish";
+ }
+ else {
+ mode = "Pack";
+ }
+ }
+
+ for (var i = 0, len = data.length; i < len; i++) {
+ var feature = data[i],
+ feature_uid = feature[0],
+ feature_start = feature[1],
+ // -1 b/c intervals are half-open.
+ feature_end = feature[2] - 1,
+ feature_name = feature[3];
+
+ // TODO: why is this necessary? Without explicitly short-circuiting it, it prevents dense mode from rendering.
+ if (this.mode != "Dense" && slots[feature_uid] === undefined) {
+ continue;
+ }
+
+ // Apply filters to feature.
+ var hide_feature = false;
+ var filter;
+ for (var f = 0; f < this.filters.length; f++) {
+ filter = this.filters[f];
+ filter.update_attrs( feature );
+ if ( !filter.keep( feature ) ) {
+ hide_feature = true;
+ break;
+ }
+ }
+ if (hide_feature) {
+ continue;
+ }
+
+ if (feature_start <= tile_high && feature_end >= tile_low) {
+ // All features need a start, end, and vertical center.
+ var f_start = Math.floor( Math.max(0, (feature_start - tile_low) * w_scale) ),
+ f_end = Math.ceil( Math.min(width, Math.max(0, (feature_end - tile_low) * w_scale)) ),
+ y_center = (mode === "Dense" ? 1 : (1 + slots[feature_uid])) * y_scale;
+ var thickness, y_start, thick_start = null, thick_end = null;
+
+ //
+ // There are really four modes for interval indices:
+ // dense, no_detail, squish, pack.
+ //
+
+ // Dense mode displays the same for all data.
+ if (mode == "Dense") {
+ ctx.fillStyle = block_color;
+ ctx.fillRect(f_start + left_offset, y_center + 5, f_end - f_start, DENSE_FEATURE_HEIGHT);
+ }
+ // Mode is either Squish or Pack:
+ else if (feature.length <= 4) {
+ // No details for feature, so only one way to display.
+ ctx.fillStyle = block_color;
+ // TODO: what should width be here?
+ ctx.fillRect(f_start + left_offset, y_center + 5, f_end - f_start, DENSE_FEATURE_HEIGHT);
+ } else {
+ // Feature has details.
+ var feature_strand = feature[5],
+ feature_ts = feature[6],
+ feature_te = feature[7],
+ feature_blocks = feature[8];
+
+ if (feature_ts && feature_te) {
+ thick_start = Math.floor( Math.max(0, (feature_ts - tile_low) * w_scale) );
+ thick_end = Math.ceil( Math.min(width, Math.max(0, (feature_te - tile_low) * w_scale)) );
+ }
+
+ // Set vars that depend on mode.
+ var thin_height, thick_height;
+ if (mode == "Squish") {
+ thin_height = 1;
+ thick_height = SQUISH_FEATURE_HEIGHT;
+ }
+ else { // mode == "Pack"
+ thin_height = 5;
+ thick_height = PACK_FEATURE_HEIGHT;
+ }
+
+ // Draw feature/feature blocks + connectors.
+ if (!feature_blocks) {
+ // If there are no blocks, treat the feature as one big exon.
+ if ( feature.strand ) {
+ if (feature.strand == "+") {
+ ctx.fillStyle = RIGHT_STRAND_INV;
+ } else if (feature.strand == "-") {
+ ctx.fillStyle = LEFT_STRAND_INV;
+ }
+ }
+ else { // No strand.
+ ctx.fillStyle = CONNECTOR_COLOR;
+ }
+ ctx.fillRect(f_start + left_offset, y_center + (thick_height-thin_height)/2 + 1,
+ f_end - f_start, thick_height);
+ }
+ else {
+ // There are feature blocks and mode is either Squish or Pack.
+ //
+ // Approach: (a) draw whole feature as connector/intron and (b) draw blocks as
+ // needed. This ensures that whole feature, regardless of whether it starts with
+ // a block, is visible.
+ //
+
+ // Draw whole feature as connector/intron.
+ var cur_y_center, cur_height;
+ if (mode == "Squish") {
+ ctx.fillStyle = CONNECTOR_COLOR;
+ cur_y_center = y_center + Math.floor(SQUISH_FEATURE_HEIGHT/2) + 1;
+ cur_height = 1;
+ }
+ else { // mode == "Pack"
+ if (feature_strand) {
+ var cur_y_center = y_center;
+ var cur_height = thick_height;
+ if (feature_strand == "+") {
+ ctx.fillStyle = RIGHT_STRAND;
+ } else if (feature_strand == "-") {
+ ctx.fillStyle = LEFT_STRAND;
+ }
+ }
+ else {
+ ctx.fillStyle = CONNECTOR_COLOR;
+ cur_y_center += (SQUISH_FEATURE_HEIGHT/2) + 1;
+ cur_height = 1;
+ }
+ }
+ ctx.fillRect(f_start + left_offset, cur_y_center, f_end - f_start, cur_height);
+
+ for (var k = 0, k_len = feature_blocks.length; k < k_len; k++) {
+ var block = feature_blocks[k],
+ block_start = Math.floor( Math.max(0, (block[0] - tile_low) * w_scale) ),
+ block_end = Math.ceil( Math.min(width, Math.max((block[1] - tile_low) * w_scale)) );
+
+ // Skip drawing if block not on tile.
+ if (block_start > block_end) { continue; }
+
+ // Draw thin block.
+ ctx.fillStyle = block_color;
+ ctx.fillRect(block_start + left_offset, y_center + (thick_height-thin_height)/2 + 1,
+ block_end - block_start, thin_height);
+
+ // If block intersects with thick region, draw block as thick.
+ if (thick_start !== undefined && !(block_start > thick_end || block_end < thick_start) ) {
+ var block_thick_start = Math.max(block_start, thick_start),
+ // -1 b/c intervals are half-open.
+ block_thick_end = Math.min(block_end, thick_end-1);
+ ctx.fillRect(block_thick_start + left_offset, y_center + 1,
+ block_thick_end - block_thick_start, thick_height);
+ }
+ }
+ }
+
+ // Draw label for Pack mode.
+ if (mode == "Pack" && feature_start > tile_low) {
+ ctx.fillStyle = label_color;
+ if (tile_index === 0 && f_start - ctx.measureText(feature_name).width < 0) {
+ ctx.textAlign = "left";
+ ctx.fillText(feature_name, f_end + left_offset + LABEL_SPACING, y_center + 8);
+ } else {
+ ctx.textAlign = "right";
+ ctx.fillText(feature_name, f_start + left_offset - LABEL_SPACING, y_center + 8);
+ }
+ ctx.fillStyle = block_color;
+ }
+ }
+ }
+ }
+ return canvas;
+ }
+});
+
+var VcfTrack = function(name, view, hda_ldda, dataset_id, prefs, filters) {
+ FeatureTrack.call(this, name, view, hda_ldda, dataset_id, prefs, filters);
+ this.track_type = "VcfTrack";
+};
+
+$.extend(VcfTrack.prototype, TiledTrack.prototype, FeatureTrack.prototype, {
+ /**
+ * Draw VcfTrack tile.
+ */
+ draw_tile: function(resolution, tile_index, parent_element, w_scale) {
+ var tile_low = tile_index * DENSITY * resolution,
+ tile_high = ( tile_index + 1 ) * DENSITY * resolution,
+ tile_span = tile_high - tile_low;
+ //console.log("drawing " + tile_low + " to " + tile_high);
+
+ /*for (var k in this.data_cache.obj_cache) {
+ var k_split = k.split("_"), k_low = k_split[0], k_high = k_split[1];
+ if (k_low <= tile_low && k_high >= tile_high) {
+ data = this.data_cache.get(k);
+ break;
+ }
+ }*/
+
+ //
+ // Get tile data; if data not available, issue get_data request and return.
+ //
+ var result = this.data_cache.get_data(tile_low, tile_high, this.mode);
+ if (result === undefined || result === "pending" ||
+ (this.mode !== "Auto" && result.dataset_type === "summary_tree")) {
+ this.data_queue[ [tile_low, tile_high] ] = true;
+ this.get_data(tile_low, tile_high);
+ return;
+ }
+ //
+ // Create/set/compute some useful vars.
+ //
+ var width = Math.ceil( tile_span * w_scale ),
+ label_color = this.prefs.label_color,
+ block_color = this.prefs.block_color,
+ mode = this.mode,
+ min_height = 25,
+ no_label,
+ left_offset = this.left_offset,
+ slots, required_height, y_scale;
+
+ var canvas = document.createElement("canvas");
+ if (window.G_vmlCanvasManager) { G_vmlCanvasManager.initElement(canvas); } // EXCANVAS HACK
+ canvas = $(canvas);
+
+ if (result.dataset_type === "summary_tree") {
+ required_height = this.summary_draw_height;
+ } else if (mode === "Dense") {
+ required_height = min_height;
+ y_scale = DENSE_TRACK_HEIGHT;
+ } else {
+ // Set y_scale based on mode and result data.
+ if (mode === "Squish") {
+ y_scale = SQUISH_TRACK_HEIGHT;
+ no_label = true;
+ } else if (mode === "Pack") {
+ y_scale = PACK_TRACK_HEIGHT;
+ // TODO: is there data where there is no label even in pack mode?
+ no_label = false;
+ } else if (result.extra_info === "no_detail") { // mode == "Auto"
+ y_scale = NO_DETAIL_TRACK_HEIGHT;
+ no_label = true;
+ } else {
+ y_scale = PACK_TRACK_HEIGHT;
+ no_label = false;
+ }
+
+ // Calculate new slots incrementally for this new chunk of data and update height if necessary.
+ required_height = this.incremental_slots(w_scale, result.data, no_label, mode) * y_scale + min_height;
+ slots = this.inc_slots[w_scale];
+ }
+
+ canvas.get(0).width = width + left_offset;
+ canvas.get(0).height = required_height;
+ if (result.dataset_type == "summary_tree") {
+ // Increase canvas height in order to display max label.
+ canvas.get(0).height += LABEL_SPACING + CHAR_HEIGHT_PX;
+ }
+ parent_element.parent().css("height", Math.max(this.height_px, required_height) + "px");
+ // console.log(( tile_low - this.view.low ) * w_scale, tile_index, w_scale);
+ var ctx = canvas.get(0).getContext("2d");
+ ctx.fillStyle = block_color;
+ ctx.font = this.default_font;
+ ctx.textAlign = "right";
+ this.container_div.find(".yaxislabel").remove();
+
+ //
+ // Draw summary tree. If tree is drawn, canvas is returned.
+ //
+ if (result.dataset_type == "summary_tree") {
+ var
+ // Set base Y so that max label and data do not overlap. Base Y is where rectangle bases
+ // start. However, height of each rectangle is relative to required_height; hence, the
+ // max rectangle is required_height.
+ base_y = required_height + LABEL_SPACING + CHAR_HEIGHT_PX;
+ points = result.data,
+ max = result.max,
+ delta_x_px = Math.ceil(result.delta * w_scale);
+
+ var max_label = $("<div />").addClass('yaxislabel');
+ max_label.text(max);
+
+ max_label.css({ position: "absolute", top: "22px", left: "10px" });
+ max_label.prependTo(this.container_div);
+
+ for (var i = 0, len = points.length; i < len; i++) {
+ var x = Math.floor( (points[i][0] - tile_low) * w_scale );
+ var y = points[i][1];
+
+ if (!y) { continue; }
+ var y_px = y / max * required_height;
+
+ ctx.fillStyle = "black";
+ ctx.fillRect(x + left_offset, base_y - y_px, delta_x_px, y_px);
+
+ // Draw number count if it can fit the number with some padding, otherwise things clump up
+ var text_padding_req_x = 4;
+ if (this.prefs.show_counts && (ctx.measureText(y).width + text_padding_req_x) < delta_x_px) {
+ ctx.fillStyle = "#666";
+ ctx.textAlign = "center";
+ ctx.fillText(y, x + left_offset + (delta_x_px/2), 10);
+ }
+ }
+ return canvas;
+ }
+
+ //
+ // If there is a message, show it; also, return if there's no data to draw.
+ // FIXME: Why is this drawn on a canvas instead of a div?
+ if (result.message) {
+ canvas.css({
+ "border-color": "red"
+ });
+
+ ctx.fillStyle = "red";
+ ctx.textAlign = "left";
+ ctx.fillText(result.message, 100 + left_offset, y_scale);
+
+ // If there's no data, return.
+ if (!result.data) {
+ return canvas;
+ }
+ }
+
+ //
+ // If tile is filterable, add class to canvas.
+ //
+ for (var f = 0; f < this.filters.length; f++) {
+ if (result.data.length && this.filters[f].applies_to(result.data[0])) {
+ canvas.addClass(FILTERABLE_CLASS);
+ break;
+ }
+ }
+
+ //
+ // Draw data points.
+ //
+ var data = result.data;
+ for (var i = 0, len = data.length; i < len; i++) {
+ var feature = data[i],
+ feature_uid = feature[0],
+ feature_start = feature[1],
+ // -1 b/c intervals are half-open.
+ feature_end = feature[2] - 1,
+ feature_name = feature[3];
+
+ // TODO: why is this necessary? Without explicitly short-circuiting it, it prevents dense mode from rendering.
+ if (this.mode != "Dense" && slots[feature_uid] === undefined) {
+ continue;
+ }
+
+ // Apply filters to feature.
+ var hide_feature = false;
+ var filter;
+ for (var f = 0; f < this.filters.length; f++) {
+ filter = this.filters[f];
+ filter.update_attrs( feature );
+ if ( !filter.keep( feature ) ) {
+ hide_feature = true;
+ break;
+ }
+ }
+ if (hide_feature) {
+ continue;
+ }
+
+ if (feature_start <= tile_high && feature_end >= tile_low) {
+ // All features need a start, end, and vertical center.
+ var f_start = Math.floor( Math.max(0, (feature_start - tile_low) * w_scale) ),
+ f_end = Math.ceil( Math.min(width, Math.max(0, (feature_end - tile_low) * w_scale)) ),
+ y_center = (mode === "Dense" ? 1 : (1 + slots[feature_uid])) * y_scale;
+ var thickness, y_start, thick_start = null, thick_end = null;
+
+
+ if (no_label) {
+ ctx.fillStyle = block_color;
+ ctx.fillRect(f_start + left_offset, y_center + 5, f_end - f_start, 1);
+ }
+ else { // Show blocks, labels, etc.
+ // Unpack.
+ var ref_base = feature[4], alt_base = feature[5], qual = feature[6];
+
+ // Draw block for entry.
+ thickness = 9;
+ y_start = 1;
+ ctx.fillRect(f_start + left_offset, y_center, f_end - f_start, thickness);
+
+ // Add label for entry.
+ if (mode !== "Dense" && feature_name !== undefined && feature_start > tile_low) {
+ // Draw label
+ ctx.fillStyle = label_color;
+ if (tile_index === 0 && f_start - ctx.measureText(feature_name).width < 0) {
+ ctx.textAlign = "left";
+ ctx.fillText(feature_name, f_end + 2 + left_offset, y_center + 8);
+ } else {
+ ctx.textAlign = "right";
+ ctx.fillText(feature_name, f_start - 2 + left_offset, y_center + 8);
+ }
+ ctx.fillStyle = block_color;
+ }
+
+ // Show additional data on block.
+ var vcf_label = ref_base + " / " + alt_base;
+ if (feature_start > tile_low && ctx.measureText(vcf_label).width < (f_end - f_start)) {
+ ctx.fillStyle = "white";
+ ctx.textAlign = "center";
+ ctx.fillText(vcf_label, left_offset + f_start + (f_end-f_start)/2, y_center + 8);
+ ctx.fillStyle = block_color;
+ }
+ }
+ }
+ }
+ return canvas;
+ }
+});
+
+var ReadTrack = function (name, view, hda_ldda, dataset_id, prefs, filters) {
+ FeatureTrack.call(this, name, view, hda_ldda, dataset_id, prefs, filters);
+ this.track_type = "ReadTrack";
+};
+$.extend(ReadTrack.prototype, TiledTrack.prototype, FeatureTrack.prototype, {
+ /**
+ * Draw a single read.
+ */
+ draw_read: function(ctx, w_scale, tile_low, tile_high, feature_start, cigar, orig_seq, y_center) {
ctx.textAlign = "center";
var
tile_region = [tile_low, tile_high],
@@ -2411,11 +2991,14 @@
ctx.drawDownwardEquilateralTriangle(item[0], item[1], item[2]);
}
},
+ /**
+ * Draw ReadTrack tile.
+ */
draw_tile: function(resolution, tile_index, parent_element, w_scale) {
var tile_low = tile_index * DENSITY * resolution,
tile_high = ( tile_index + 1 ) * DENSITY * resolution,
tile_span = tile_high - tile_low;
- //console.log("drawing " + tile_low + " to " + tile_high);
+ //console.log("ReadTrack: drawing " + tile_low + " to " + tile_high);
/*for (var k in this.data_cache.obj_cache) {
var k_split = k.split("_"), k_low = k_split[0], k_high = k_split[1];
@@ -2466,7 +3049,7 @@
// TODO: is there data where there is no label even in pack mode?
no_label = false;
} else if (result.extra_info === "no_detail") { // mode == "Auto"
- y_scale = (result.track_type === "bai" ? SQUISH_TRACK_HEIGHT : NO_DETAIL_TRACK_HEIGHT);
+ y_scale = SQUISH_TRACK_HEIGHT;
no_label = true;
} else {
y_scale = PACK_TRACK_HEIGHT;
@@ -2532,9 +3115,8 @@
return canvas;
}
-
//
- // Show message. If there is a message, return canvas.
+ // If there is a message, show it; also, return if there's no data to draw.
// FIXME: Why is this drawn on a canvas instead of a div?
if (result.message) {
canvas.css({
@@ -2551,21 +3133,10 @@
}
}
- //
- // If tile is filterable, add class to canvas.
//
- for (var f = 0; f < this.filters.length; f++) {
- if (result.data.length && this.filters[f].applies_to(result.data[0])) {
- canvas.addClass(FILTERABLE_CLASS);
- break;
- }
- }
-
- //
- // Draw data points.
+ // Draw reads.
//
var data = result.data;
- var j = 0;
for (var i = 0, len = data.length; i < len; i++) {
var feature = data[i],
feature_uid = feature[0],
@@ -2577,268 +3148,60 @@
if (this.mode != "Dense" && slots[feature_uid] === undefined) {
continue;
}
-
- // Apply filters to feature.
- var hide_feature = false;
- var filter;
- for (var f = 0; f < this.filters.length; f++) {
- filter = this.filters[f];
- filter.update_attrs( feature );
- if ( !filter.keep( feature ) ) {
- hide_feature = true;
- break;
- }
- }
- if (hide_feature) {
- continue;
- }
-
+
if (feature_start <= tile_high && feature_end >= tile_low) {
- // -1 b/c intervals are half-open.
- if (result.dataset_type == "interval_index") {
- feature_end -= 1;
- }
-
// All features need a start, end, and vertical center.
var f_start = Math.floor( Math.max(0, (feature_start - tile_low) * w_scale) ),
f_end = Math.ceil( Math.min(width, Math.max(0, (feature_end - tile_low) * w_scale)) ),
y_center = (mode === "Dense" ? 1 : (1 + slots[feature_uid])) * y_scale;
var thickness, y_start, thick_start = null, thick_end = null;
- // BAM/read drawing.
- if (result.dataset_type === "bai") {
+ // Draw read.
+ ctx.fillStyle = block_color;
+ if (feature[5] instanceof Array) {
+ // Read is paired.
+ var b1_start = Math.floor( Math.max(0, (feature[4][0] - tile_low) * w_scale) ),
+ b1_end = Math.ceil( Math.min(width, Math.max(0, (feature[4][1] - tile_low) * w_scale)) ),
+ b2_start = Math.floor( Math.max(0, (feature[5][0] - tile_low) * w_scale) ),
+ b2_end = Math.ceil( Math.min(width, Math.max(0, (feature[5][1] - tile_low) * w_scale)) );
+
+ // Draw left/forward read.
+ if (feature[4][1] >= tile_low && feature[4][0] <= tile_high && feature[4][2]) {
+ this.draw_read(ctx, w_scale, tile_low, tile_high, feature[4][0], feature[4][2], feature[4][3], y_center);
+ }
+ // Draw right/reverse read.
+ if (feature[5][1] >= tile_low && feature[5][0] <= tile_high && feature[5][2]) {
+ this.draw_read(ctx, w_scale, tile_low, tile_high, feature[5][0], feature[5][2], feature[5][3], y_center);
+ }
+ // Draw connector.
+ if (b2_start > b1_end) {
+ ctx.fillStyle = CONNECTOR_COLOR;
+ //ctx.fillRect(b1_end + left_offset, y_center + 5, b2_start - b1_end, 1);
+ ctx.dashedLine(b1_end + left_offset, y_center + 5, left_offset + b2_start, y_center + 5);
+ }
+ } else {
+ // Read is single.
ctx.fillStyle = block_color;
- if (feature[5] instanceof Array) {
- // Read is paired.
- var b1_start = Math.floor( Math.max(0, (feature[4][0] - tile_low) * w_scale) ),
- b1_end = Math.ceil( Math.min(width, Math.max(0, (feature[4][1] - tile_low) * w_scale)) ),
- b2_start = Math.floor( Math.max(0, (feature[5][0] - tile_low) * w_scale) ),
- b2_end = Math.ceil( Math.min(width, Math.max(0, (feature[5][1] - tile_low) * w_scale)) );
-
- // Draw left/forward read.
- if (feature[4][1] >= tile_low && feature[4][0] <= tile_high && feature[4][2]) {
- this.rect_or_text(ctx, w_scale, tile_low, tile_high, feature[4][0], feature[4][2], feature[4][3], y_center);
- }
- // Draw right/reverse read.
- if (feature[5][1] >= tile_low && feature[5][0] <= tile_high && feature[5][2]) {
- this.rect_or_text(ctx, w_scale, tile_low, tile_high, feature[5][0], feature[5][2], feature[5][3], y_center);
- }
- // Draw connector.
- if (b2_start > b1_end) {
- ctx.fillStyle = CONNECTOR_COLOR;
- //ctx.fillRect(b1_end + left_offset, y_center + 5, b2_start - b1_end, 1);
- ctx.dashedLine(b1_end + left_offset, y_center + 5, left_offset + b2_start, y_center + 5);
- }
+ this.draw_read(ctx, w_scale, tile_low, tile_high, feature_start, feature[4], feature[5], y_center);
+ }
+ if (mode !== "Dense" && !no_label && feature_start > tile_low) {
+ // Draw label.
+ ctx.fillStyle = this.prefs.label_color;
+ if (tile_index === 0 && f_start - ctx.measureText(feature_name).width < 0) {
+ ctx.textAlign = "left";
+ ctx.fillText(feature_name, f_end + left_offset + LABEL_SPACING, y_center + 8);
} else {
- // Read is single.
- ctx.fillStyle = block_color;
- this.rect_or_text(ctx, w_scale, tile_low, tile_high, feature_start, feature[4], feature[5], y_center);
+ ctx.textAlign = "right";
+ ctx.fillText(feature_name, f_start + left_offset - LABEL_SPACING, y_center + 8);
}
- if (mode !== "Dense" && !no_label && feature_start > tile_low) {
- // Draw label.
- ctx.fillStyle = this.prefs.label_color;
- if (tile_index === 0 && f_start - ctx.measureText(feature_name).width < 0) {
- ctx.textAlign = "left";
- ctx.fillText(feature_name, f_end + left_offset + LABEL_SPACING, y_center + 8);
- } else {
- ctx.textAlign = "right";
- ctx.fillText(feature_name, f_start + left_offset - LABEL_SPACING, y_center + 8);
- }
- ctx.fillStyle = block_color;
- }
+ ctx.fillStyle = block_color;
}
- // Interval index drawing.
- else if (result.dataset_type === "interval_index") {
- //
- // There are really four modes for interval indices:
- // dense, no_detail, squish, pack.
- //
-
- // TODO: move this code out of loop.
- // Set mode in Auto
- if (mode == "Auto") {
- // Never use dense when in auto mode.
- // TODO: decide when to use squish and when to use pack.
- if (feature.length <= 4) {
- mode = "Squish";
- }
- else {
- mode = "Pack";
- }
- }
-
- // Dense mode displays the same for all data.
- if (mode == "Dense") {
- ctx.fillStyle = block_color;
- ctx.fillRect(f_start + left_offset, y_center + 5, f_end - f_start, DENSE_FEATURE_HEIGHT);
- }
- // Mode is either Squish or Pack:
- else if (feature.length <= 4) {
- // No details for feature, so only one way to display.
- ctx.fillStyle = block_color;
- // TODO: what should width be here?
- ctx.fillRect(f_start + left_offset, y_center + 5, f_end - f_start, DENSE_FEATURE_HEIGHT);
- } else {
- // Feature has details.
- var feature_strand = feature[5],
- feature_ts = feature[6],
- feature_te = feature[7],
- feature_blocks = feature[8];
-
- if (feature_ts && feature_te) {
- thick_start = Math.floor( Math.max(0, (feature_ts - tile_low) * w_scale) );
- thick_end = Math.ceil( Math.min(width, Math.max(0, (feature_te - tile_low) * w_scale)) );
- }
-
- // Set vars that depend on mode.
- var thin_height, thick_height;
- if (mode == "Squish") {
- thin_height = 1;
- thick_height = SQUISH_FEATURE_HEIGHT;
- }
- else { // mode == "Pack"
- thin_height = 5;
- thick_height = PACK_FEATURE_HEIGHT;
- }
-
- // Draw feature/feature blocks + connectors.
- if (!feature_blocks) {
- // If there are no blocks, treat the feature as one big exon.
- if ( feature.strand ) {
- if (feature.strand == "+") {
- ctx.fillStyle = RIGHT_STRAND_INV;
- } else if (feature.strand == "-") {
- ctx.fillStyle = LEFT_STRAND_INV;
- }
- }
- else { // No strand.
- ctx.fillStyle = CONNECTOR_COLOR;
- }
- ctx.fillRect(f_start + left_offset, y_center + (thick_height-thin_height)/2 + 1,
- f_end - f_start, thick_height);
- }
- else {
- // There are feature blocks and mode is either Squish or Pack.
- //
- // Approach: (a) draw whole feature as connector/intron and (b) draw blocks as
- // needed. This ensures that whole feature, regardless of whether it starts with
- // a block, is visible.
- //
-
- // Draw whole feature as connector/intron.
- var cur_y_center, cur_height;
- if (mode == "Squish") {
- ctx.fillStyle = CONNECTOR_COLOR;
- cur_y_center = y_center + Math.floor(SQUISH_FEATURE_HEIGHT/2) + 1;
- cur_height = 1;
- }
- else { // mode == "Pack"
- if (feature_strand) {
- var cur_y_center = y_center;
- var cur_height = thick_height;
- if (feature_strand == "+") {
- ctx.fillStyle = RIGHT_STRAND;
- } else if (feature_strand == "-") {
- ctx.fillStyle = LEFT_STRAND;
- }
- }
- else {
- ctx.fillStyle = CONNECTOR_COLOR;
- cur_y_center += (SQUISH_FEATURE_HEIGHT/2) + 1;
- cur_height = 1;
- }
- }
- ctx.fillRect(f_start + left_offset, cur_y_center, f_end - f_start, cur_height);
-
- for (var k = 0, k_len = feature_blocks.length; k < k_len; k++) {
- var block = feature_blocks[k],
- block_start = Math.floor( Math.max(0, (block[0] - tile_low) * w_scale) ),
- block_end = Math.ceil( Math.min(width, Math.max((block[1] - tile_low) * w_scale)) );
-
- // Skip drawing if block not on tile.
- if (block_start > block_end) { continue; }
-
- // Draw thin block.
- ctx.fillStyle = block_color;
- ctx.fillRect(block_start + left_offset, y_center + (thick_height-thin_height)/2 + 1,
- block_end - block_start, thin_height);
-
- // If block intersects with thick region, draw block as thick.
- if (thick_start !== undefined && !(block_start > thick_end || block_end < thick_start) ) {
- var block_thick_start = Math.max(block_start, thick_start),
- // -1 b/c intervals are half-open.
- block_thick_end = Math.min(block_end, thick_end-1);
- ctx.fillRect(block_thick_start + left_offset, y_center + 1,
- block_thick_end - block_thick_start, thick_height);
- }
- }
- }
-
- // Draw label for Pack mode.
- if (mode == "Pack" && feature_start > tile_low) {
- ctx.fillStyle = label_color;
- if (tile_index === 0 && f_start - ctx.measureText(feature_name).width < 0) {
- ctx.textAlign = "left";
- ctx.fillText(feature_name, f_end + left_offset + LABEL_SPACING, y_center + 8);
- } else {
- ctx.textAlign = "right";
- ctx.fillText(feature_name, f_start + left_offset - LABEL_SPACING, y_center + 8);
- }
- ctx.fillStyle = block_color;
- }
- }
- } else if (result.dataset_type === 'vcf') {
- // VCF track.
- if (no_label) {
- ctx.fillStyle = block_color;
- ctx.fillRect(f_start + left_offset, y_center + 5, f_end - f_start, 1);
- }
- else { // Show blocks, labels, etc.
- // Unpack.
- var ref_base = feature[4], alt_base = feature[5], qual = feature[6];
-
- // Draw block for entry.
- thickness = 9;
- y_start = 1;
- ctx.fillRect(f_start + left_offset, y_center, f_end - f_start, thickness);
-
- // Add label for entry.
- if (mode !== "Dense" && feature_name !== undefined && feature_start > tile_low) {
- // Draw label
- ctx.fillStyle = label_color;
- if (tile_index === 0 && f_start - ctx.measureText(feature_name).width < 0) {
- ctx.textAlign = "left";
- ctx.fillText(feature_name, f_end + 2 + left_offset, y_center + 8);
- } else {
- ctx.textAlign = "right";
- ctx.fillText(feature_name, f_start - 2 + left_offset, y_center + 8);
- }
- ctx.fillStyle = block_color;
- }
-
- // Show additional data on block.
- var vcf_label = ref_base + " / " + alt_base;
- if (feature_start > tile_low && ctx.measureText(vcf_label).width < (f_end - f_start)) {
- ctx.fillStyle = "white";
- ctx.textAlign = "center";
- ctx.fillText(vcf_label, left_offset + f_start + (f_end-f_start)/2, y_center + 8);
- ctx.fillStyle = block_color;
- }
- }
- }
- j++;
}
}
return canvas;
}
});
-var ReadTrack = function (name, view, hda_ldda, dataset_id, prefs, filters) {
- FeatureTrack.call(this, name, view, hda_ldda, dataset_id, prefs, filters);
- this.track_type = "ReadTrack";
-};
-$.extend( ReadTrack.prototype, TiledTrack.prototype, FeatureTrack.prototype, {});
-
/**
* Feature track that displays data generated from tool.
*/
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix the folder popup menu when browsing a deleted folder in a data library, and fis the broken display of deleted library items.
by Bitbucket 21 Feb '11
by Bitbucket 21 Feb '11
21 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/ca53c664778e/
changeset: r5099:ca53c664778e
user: greg
date: 2011-02-21 21:10:22
summary: Fix the folder popup menu when browsing a deleted folder in a data library, and fis the broken display of deleted library items.
affected #: 1 file (153 bytes)
--- a/templates/library/common/browse_library.mako Mon Feb 21 14:00:39 2011 -0500
+++ b/templates/library/common/browse_library.mako Mon Feb 21 15:10:22 2011 -0500
@@ -357,55 +357,55 @@
><td style="padding-left: ${folder_pad}px;"><input type="checkbox" class="folderCheckbox"/>
- %if folder.deleted:
- <span class="libraryItem-error">
- %endif
- <span class="expandLink folder-${encoded_id}-click"><span class="rowIcon"></span>
+ <span class="expandLink folder-${encoded_id}-click"><div style="float: left; margin-left: 2px;" class="menubutton split popup" id="folder_img-${folder.id}-popup">
- <a class="folder-${encoded_id}-click" href="javascript:void(0);">${folder.name}</a>
+ <a class="folder-${encoded_id}-click" href="javascript:void(0);">
+ %if folder.deleted:
+ <span class="libraryItem-error">
+ ${folder.name}
+ </span>
+ %else:
+ ${folder.name}
+ %endif
+ </a></div>
- %if folder.deleted:
- </span>
- %endif
- %if not branch_deleted( folder ):
- %if not library.deleted:
- <div popupmenu="folder_img-${folder.id}-popup">
- %if not branch_deleted( folder ) and can_add:
- <a class="action-button" href="${h.url_for( controller='library_common', action='upload_library_dataset', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Add datasets</a>
- <a class="action-button" href="${h.url_for( controller='library_common', action='create_folder', cntrller=cntrller, parent_id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Add sub-folder</a>
- %endif
- %if not branch_deleted( folder ):
- %if self.has_accessible_datasets:
- <a class="action-button" href="${h.url_for( controller='library_common', action='import_datasets_to_histories', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Select datasets for import into selected histories</a>
- %endif
- %if can_modify:
- <a class="action-button" href="${h.url_for( controller='library_common', action='folder_info', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit information</a>
- %else:
- <a class="action-button" class="view-info" href="${h.url_for( controller='library_common', action='folder_info', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">View information</a>
- %endif
- %endif
- %if not branch_deleted( folder ) and can_modify and not info_association:
- <a class="action-button" href="${h.url_for( controller='library_common', action='add_template', cntrller=cntrller, item_type='folder', form_type=form_type, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Use template</a>
- %endif
- %if not branch_deleted( folder ) and can_modify and info_association:
- <a class="action-button" href="${h.url_for( controller='library_common', action='edit_template', cntrller=cntrller, item_type='folder', form_type=form_type, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit template</a>
- <a class="action-button" href="${h.url_for( controller='library_common', action='delete_template', cntrller=cntrller, item_type='folder', form_type=form_type, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Unuse template</a>
- %endif
- %if not branch_deleted( folder ) and can_manage:
- %if not trans.app.security_agent.folder_is_public( folder ):
- <a class="action-button" href="${h.url_for( controller='library_common', action='make_library_item_public', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), item_type='folder', id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Make public</a>
- %endif
- <a class="action-button" href="${h.url_for( controller='library_common', action='folder_permissions', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit permissions</a>
+ %if not library.deleted:
+ <div popupmenu="folder_img-${folder.id}-popup">
+ %if not branch_deleted( folder ) and can_add:
+ <a class="action-button" href="${h.url_for( controller='library_common', action='upload_library_dataset', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Add datasets</a>
+ <a class="action-button" href="${h.url_for( controller='library_common', action='create_folder', cntrller=cntrller, parent_id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Add sub-folder</a>
+ %endif
+ %if not branch_deleted( folder ):
+ %if self.has_accessible_datasets:
+ <a class="action-button" href="${h.url_for( controller='library_common', action='import_datasets_to_histories', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Select datasets for import into selected histories</a>
%endif
%if can_modify:
- %if not library.deleted and not folder.deleted:
- <a class="action-button" confirm="Click OK to delete the folder '${folder.name}.'" href="${h.url_for( controller='library_common', action='delete_library_item', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), item_id=trans.security.encode_id( folder.id ), item_type='folder', show_deleted=show_deleted )}">Delete this folder</a>
- %elif not library.deleted and folder.deleted and not folder.purged:
- <a class="action-button" href="${h.url_for( controller='library_common', action='undelete_library_item', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), item_id=trans.security.encode_id( folder.id ), item_type='folder', show_deleted=show_deleted )}">Undelete this folder</a>
- %endif
+ <a class="action-button" href="${h.url_for( controller='library_common', action='folder_info', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit information</a>
+ %else:
+ <a class="action-button" class="view-info" href="${h.url_for( controller='library_common', action='folder_info', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">View information</a>
%endif
- </div>
- %endif
+ %endif
+ %if not branch_deleted( folder ) and can_modify and not info_association:
+ <a class="action-button" href="${h.url_for( controller='library_common', action='add_template', cntrller=cntrller, item_type='folder', form_type=form_type, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Use template</a>
+ %endif
+ %if not branch_deleted( folder ) and can_modify and info_association:
+ <a class="action-button" href="${h.url_for( controller='library_common', action='edit_template', cntrller=cntrller, item_type='folder', form_type=form_type, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit template</a>
+ <a class="action-button" href="${h.url_for( controller='library_common', action='delete_template', cntrller=cntrller, item_type='folder', form_type=form_type, library_id=trans.security.encode_id( library.id ), folder_id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Unuse template</a>
+ %endif
+ %if not branch_deleted( folder ) and can_manage:
+ %if not trans.app.security_agent.folder_is_public( folder ):
+ <a class="action-button" href="${h.url_for( controller='library_common', action='make_library_item_public', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), item_type='folder', id=trans.security.encode_id( folder.id ), use_panels=use_panels, show_deleted=show_deleted )}">Make public</a>
+ %endif
+ <a class="action-button" href="${h.url_for( controller='library_common', action='folder_permissions', cntrller=cntrller, id=trans.security.encode_id( folder.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Edit permissions</a>
+ %endif
+ %if can_modify:
+ %if not library.deleted and not folder.deleted:
+ <a class="action-button" confirm="Click OK to delete the folder '${folder.name}.'" href="${h.url_for( controller='library_common', action='delete_library_item', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), item_id=trans.security.encode_id( folder.id ), item_type='folder', show_deleted=show_deleted )}">Delete this folder</a>
+ %elif not library.deleted and folder.deleted and not folder.purged:
+ <a class="action-button" href="${h.url_for( controller='library_common', action='undelete_library_item', cntrller=cntrller, library_id=trans.security.encode_id( library.id ), item_id=trans.security.encode_id( folder.id ), item_type='folder', show_deleted=show_deleted )}">Undelete this folder</a>
+ %endif
+ %endif
+ </div>
%endif
<td>
%if folder.description:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Trackster: save and restore mode for feature and read tracks.
by Bitbucket 21 Feb '11
by Bitbucket 21 Feb '11
21 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/54dc9beb30ea/
changeset: r5098:54dc9beb30ea
user: jgoecks
date: 2011-02-21 20:00:39
summary: Trackster: save and restore mode for feature and read tracks.
affected #: 1 file (553 bytes)
--- a/static/scripts/trackster.js Mon Feb 21 11:49:24 2011 -0500
+++ b/static/scripts/trackster.js Mon Feb 21 14:00:39 2011 -0500
@@ -1318,13 +1318,16 @@
if (track.display_modes !== undefined) {
if (track.mode_div === undefined) {
track.mode_div = $("<div class='right-float menubutton popup' />").appendTo(track.header_div);
- var init_mode = track.display_modes[0];
+ var init_mode = (track.track_config && track.track_config.values['mode'] ?
+ track.track_config.values['mode'] : track.display_modes[0]);
track.mode = init_mode;
track.mode_div.text(init_mode);
var change_mode = function(name) {
track.mode_div.text(name);
+ // TODO: is it necessary to store the mode in two places (.mode and track_config)?
track.mode = name;
+ track.track_config.values['mode'] = name;
track.tile_cache.clear();
track.draw();
};
@@ -2046,9 +2049,33 @@
});
var FeatureTrack = function (name, view, hda_ldda, dataset_id, prefs, filters, tool, parent_track) {
+ //
+ // Preinitialization: do things that need to be done before calling Track and TiledTrack
+ // initialization code.
+ //
var track = this;
this.track_type = "FeatureTrack";
this.display_modes = ["Auto", "Dense", "Squish", "Pack"];
+ // Define and restore track configuration.
+ this.track_config = new TrackConfig( {
+ track: this,
+ params: [
+ { key: 'block_color', label: 'Block color', type: 'color', default_value: '#444' },
+ { key: 'label_color', label: 'Label color', type: 'color', default_value: 'black' },
+ { key: 'show_counts', label: 'Show summary counts', type: 'bool', default_value: true },
+ { key: 'mode', type: 'string', default_value: this.mode, hidden: true },
+ ],
+ saved_values: prefs,
+ onchange: function() {
+ track.tile_cache.clear();
+ track.draw();
+ }
+ });
+ this.prefs = this.track_config.values;
+
+ //
+ // Initialization.
+ //
Track.call(this, name, view, view.viewport_container);
TiledTrack.call(this, filters, tool, parent_track);
@@ -2068,23 +2095,6 @@
this.tile_cache = new Cache(CACHED_TILES_FEATURE);
this.data_cache = new DataCache(20);
this.left_offset = 200;
-
- // Define track configuration
- this.track_config = new TrackConfig( {
- track: this,
- params: [
- { key: 'block_color', label: 'Block color', type: 'color', default_value: '#444' },
- { key: 'label_color', label: 'Label color', type: 'color', default_value: 'black' },
- { key: 'show_counts', label: 'Show summary counts', type: 'bool', default_value: true }
- ],
- saved_values: prefs,
- onchange: function() {
- track.tile_cache.clear();
- track.draw();
- }
- });
-
- this.prefs = this.track_config.values;
};
$.extend( FeatureTrack.prototype, TiledTrack.prototype, {
get_data: function( low, high ) {
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
21 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/fda57df0aa20/
changeset: r5097:fda57df0aa20
user: jgoecks
date: 2011-02-21 17:49:24
summary: Trackster: enhancements to read track display: insertions and deletions now shown correctly, and some efficiency improvements made using overlap calculations. Added function to compute the type of overlap between two regions.
affected #: 2 files (8.0 KB)
--- a/static/scripts/packed/trackster.js Mon Feb 21 09:46:54 2011 -0500
+++ b/static/scripts/packed/trackster.js Mon Feb 21 11:49:24 2011 -0500
@@ -1,1 +1,1 @@
-CanvasRenderingContext2D.prototype.dashedLine=function(c,i,b,h,f){if(f==undefined){f=4}var e=b-c;var d=h-i;var g=Math.floor(Math.sqrt(e*e+d*d)/f);var k=e/g;var j=d/g;for(var a=0;a<g;a++,c+=k,i+=j){if(a%2!=0){continue}this.fillRect(c,i,f,1)}};function sortable(a,b){a.bind("drag",{handle:b,relative:true},function(h,j){var g=$(this).parent();var f=g.children();for(var c=0;c<f.length;c++){if(j.offsetY<$(f.get(c)).position().top){break}}if(c==f.length){if(this!=f.get(c-1)){g.append(this)}}else{if(this!=f.get(c)){$(this).insertBefore(f.get(c))}}})}var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=DENSE_FEATURE_HEIGHT=1,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,PACK_SPACING=5,DEFAULT_FONT="9px Monaco, Lucida Console, monospace",DENSITY=200,FEATURE_LEVELS=10,MAX_FEATURE_DEPTH=100,DEFAULT_DATA_QUERY_WAIT=5000,MAX_CHROMS_SELECTABLE=100,CONNECTOR_COLOR="#ccc",DATA_ERROR="There was an error in indexing this dataset. ",DATA_NOCONVERTER="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",DATA_NONE="No data for this chrom/contig.",DATA_PENDING="Currently indexing... please wait",DATA_CANNOT_RUN_TOOL="Tool cannot be rerun: ",DATA_LOADING="Loading data...",DATA_OK="Ready for display",FILTERABLE_CLASS="filterable",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=5,CACHED_DATA=5,DUMMY_CANVAS=document.createElement("canvas"),RIGHT_STRAND,LEFT_STRAND;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(DUMMY_CANVAS)}var CONTEXT=DUMMY_CANVAS.getContext("2d");CONTEXT.font=DEFAULT_FONT;var CHAR_WIDTH_PX=CONTEXT.measureText("A").width,CHAR_HEIGHT_PX=9;var right_img=new Image();right_img.src=image_path+"/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src=image_path+"/visualization/strand_left.png";left_img.onload=function(){LEFT_STRAND=CONTEXT.createPattern(left_img,"repeat")};var right_img_inv=new Image();right_img_inv.src=image_path+"/visualization/strand_right_inv.png";right_img_inv.onload=function(){RIGHT_STRAND_INV=CONTEXT.createPattern(right_img_inv,"repeat")};var left_img_inv=new Image();left_img_inv.src=image_path+"/visualization/strand_left_inv.png";left_img_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function round_1000(a){return Math.round(a*1000)/1000}var Cache=function(a){this.num_elements=a;this.clear()};$.extend(Cache.prototype,{get:function(b){var a=this.key_ary.indexOf(b);if(a!=-1){this.move_key_to_end(b,a)}return this.obj_cache[b]},set:function(b,c){if(!this.obj_cache[b]){if(this.key_ary.length>=this.num_elements){var a=this.key_ary.shift();delete this.obj_cache[a]}this.key_ary.push(b)}this.obj_cache[b]=c;return c},move_key_to_end:function(b,a){this.key_ary.splice(a,1);this.key_ary.push(b)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var DataCache=function(a){Cache.call(this,a)};$.extend(DataCache.prototype,Cache.prototype,{get_data:function(g,b,e){var h=this.get(this.gen_key(g,b,e));if(h){return h}var j,f,a,d,e,h;for(var c=0;c<this.key_ary.length;c++){j=this.key_ary[c];f=this.split_key(j);a=f[0];d=f[1];if(g>=a&&b<=d){h=this.obj_cache[j];if(h.dataset_type!=="summary_tree"&&h.extra_info!=="no_detail"){this.move_key_to_end(j,c);return h}}}return undefined},set_data:function(b,c,d,a){return this.set(this.gen_key(b,c,d),a)},gen_key:function(a,c,d){var b=a+"_"+c+"_"+d;return b},split_key:function(a){return a.split("_")}});var View=function(a,d,c,b,e){this.container=a;this.chrom=null;this.vis_id=c;this.dbkey=b;this.title=d;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.num_tracks=0;this.track_id_counter=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.init(e);this.reset()};$.extend(View.prototype,{init:function(d){var c=this.container,a=this;this.top_container=$("<div/>").addClass("top-container").appendTo(c);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(c);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(c);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").addClass("viewport-container").appendTo(this.content_div);this.intro_div=$("<div/>").addClass("intro").text("Select a chrom from the dropdown below").hide();this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a href='javascript:void(0);'>Close Overview</a>").addClass("overview-close").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_form=$("<form/>").attr("action",function(){}).appendTo(this.nav_controls);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.chrom_form);var b=function(f){if(f.type==="focusout"||(f.keyCode||f.which)===13||(f.keyCode||f.which)===27){if((f.keyCode||f.which)!==27){a.go_to($(this).val())}$(this).hide();a.location_span.show();a.chrom_select.show();return false}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keypress focusout",b).appendTo(this.chrom_form);this.location_span=$("<span/>").addClass("location").appendTo(this.chrom_form);this.location_span.bind("click",function(){a.location_span.hide();a.chrom_select.hide();a.nav_input.css("display","inline-block");a.nav_input.select();a.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.chrom_form)}this.zo_link=$("<a id='zoom-out' />").click(function(){a.zoom_out();a.redraw()}).appendTo(this.chrom_form);this.zi_link=$("<a id='zoom-in' />").click(function(){a.zoom_in();a.redraw()}).appendTo(this.chrom_form);this.load_chroms({low:0},d);this.chrom_select.bind("change",function(){a.change_chrom(a.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(f){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(f){a.zoom_in(f.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(f,g){this.current_x=g.offsetX}).bind("drag",function(f,h){var i=h.offsetX-this.current_x;this.current_x=h.offsetX;var g=Math.round(i/a.viewport_container.width()*(a.max_high-a.max_low));a.move_delta(-g)});this.overview_close.bind("click",function(){for(var f=0,e=a.tracks.length;f<e;f++){a.tracks[f].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",a.overview_box.height());a.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(f,g){if(f.clientX>a.viewport_container.width()-16){return false}}).bind("dragstart",function(f,g){g.original_low=a.low;g.current_height=f.clientY;g.current_x=g.offsetX}).bind("drag",function(h,j){var f=$(this);var k=j.offsetX-j.current_x;var g=f.scrollTop()-(h.clientY-j.current_height);f.scrollTop(g);j.current_height=h.clientY;j.current_x=j.offsetX;var i=Math.round(k/a.viewport_container.width()*(a.high-a.low));a.move_delta(i)}).bind("mousewheel",function(h,j,g,f){if(g){var i=Math.round(-g/a.viewport_container.width()*(a.high-a.low));a.move_delta(i)}});this.top_labeltrack.bind("dragstart",function(f,g){return $("<div />").css({height:a.content_div.height()+a.top_labeltrack.height()+a.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(j,k){$(k.proxy).css({left:Math.min(j.pageX,k.startX),width:Math.abs(j.pageX-k.startX)});var g=Math.min(j.pageX,k.startX)-a.container.offset().left,f=Math.max(j.pageX,k.startX)-a.container.offset().left,i=(a.high-a.low),h=a.viewport_container.width();a.update_location(Math.round(g/h*i)+a.low,Math.round(f/h*i)+a.low)}).bind("dragend",function(k,l){var g=Math.min(k.pageX,l.startX),f=Math.max(k.pageX,l.startX),i=(a.high-a.low),h=a.viewport_container.width(),j=a.low;a.low=Math.round(g/h*i)+j;a.high=Math.round(f/h*i)+j;$(l.proxy).remove();a.redraw()});this.add_label_track(new LabelTrack(this,this.top_labeltrack));this.add_label_track(new LabelTrack(this,this.nav_labeltrack));$(window).bind("resize",function(){a.resize_window()});$(document).bind("redraw",function(){a.redraw()});this.reset();$(window).trigger("resize")},update_location:function(a,b){this.location_span.text(commatize(a)+" - "+commatize(b));this.nav_input.val(this.chrom+":"+commatize(a)+"-"+commatize(b))},load_chroms:function(b,c){b.num=MAX_CHROMS_SELECTABLE;$.extend(b,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var a=this;$.ajax({url:chrom_url,data:b,dataType:"json",success:function(e){if(e.reference){a.add_label_track(new ReferenceTrack(a))}a.chrom_data=e.chrom_info;var h='<option value="">Select Chrom/Contig</option>';for(var g=0,d=a.chrom_data.length;g<d;g++){var f=a.chrom_data[g].chrom;h+='<option value="'+f+'">'+f+"</option>"}if(e.prev_chroms){h+='<option value="previous">Previous '+MAX_CHROMS_SELECTABLE+"</option>"}if(e.next_chroms){h+='<option value="next">Next '+MAX_CHROMS_SELECTABLE+"</option>"}a.chrom_select.html(h);if(c){c()}a.chrom_start_index=e.start_index},error:function(){alert("Could not load chroms for this dbkey:",a.dbkey)}})},change_chrom:function(e,b,g){if(!e||e==="None"){return}var d=this;if(e=="previous"){d.load_chroms({low:this.chrom_start_index-MAX_CHROMS_SELECTABLE});return}if(e=="next"){d.load_chroms({low:this.chrom_start_index+MAX_CHROMS_SELECTABLE});return}var f=$.grep(d.chrom_data,function(j,k){return j.chrom===e})[0];if(f===undefined){d.load_chroms({chrom:e},function(){d.change_chrom(e,b,g)});return}else{if(e!==d.chrom){d.chrom=e;if(!d.chrom){d.intro_div.show()}else{d.intro_div.hide()}d.chrom_select.val(d.chrom);d.max_high=f.len-1;d.reset();d.redraw(true);for(var h=0,a=d.tracks.length;h<a;h++){var c=d.tracks[h];if(c.init){c.init()}}}if(b!==undefined&&g!==undefined){d.low=Math.max(b,0);d.high=Math.min(g,d.max_high)}d.reset_overview();d.redraw()}},go_to:function(f){var j=this,a,d,b=f.split(":"),h=b[0],i=b[1];if(i!==undefined){try{var g=i.split("-");a=parseInt(g[0].replace(/,/g,""),10);d=parseInt(g[1].replace(/,/g,""),10)}catch(c){return false}}j.change_chrom(h,a,d)},move_fraction:function(c){var a=this;var b=a.high-a.low;this.move_delta(c*b)},move_delta:function(c){var a=this;var b=a.high-a.low;if(a.low-c<a.max_low){a.low=a.max_low;a.high=a.max_low+b}else{if(a.high-c>a.max_high){a.high=a.max_high;a.low=a.max_high-b}else{a.high-=c;a.low-=c}}a.redraw()},add_track:function(a){a.view=this;a.track_id=this.track_id_counter;this.tracks.push(a);if(a.init){a.init()}a.container_div.attr("id","track_"+a.track_id);sortable(a.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(a){a.view=this;this.label_tracks.push(a)},remove_track:function(a){this.has_changes=true;a.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(a)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(h){var g=this.high-this.low,f=this.low,b=this.high;if(f<this.max_low){f=this.max_low}if(b>this.max_high){b=this.max_high}if(this.high!==0&&g<this.min_separation){b=f+this.min_separation}this.low=Math.floor(f);this.high=Math.ceil(b);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/200)/Math.LN10));this.zoom_res=Math.pow(FEATURE_LEVELS,Math.max(0,Math.ceil(Math.log(this.resolution,FEATURE_LEVELS)/Math.log(FEATURE_LEVELS))));var a=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var e=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var j=13;this.overview_box.css({left:a,width:Math.max(j,e)}).show();if(e<j){this.overview_box.css("left",a-(j-e)/2)}if(this.overview_highlight){this.overview_highlight.css({left:a,width:e})}this.update_location(this.low,this.high);if(!h){for(var c=0,d=this.tracks.length;c<d;c++){if(this.tracks[c]&&this.tracks[c].enabled){this.tracks[c].draw()}}for(c=0,d=this.label_tracks.length;c<d;c++){this.label_tracks[c].draw()}}},zoom_in:function(b,c){if(this.max_high===0||this.high-this.low<this.min_separation){return}var d=this.high-this.low,e=d/2+this.low,a=(d/this.zoom_factor)/2;if(b){e=b/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(e-a);this.high=Math.round(e+a);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var b=this.high-this.low,c=b/2+this.low,a=(b*this.zoom_factor)/2;this.low=Math.round(c-a);this.high=Math.round(c+a);this.redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.nav_container.width(this.container.width());this.redraw()},reset_overview:function(){this.overview_viewport.find("canvas").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide()}});var Tool=function(a,b){this.name=a;this.params=b};$.extend(Tool.prototype,{get_param_values_dict:function(){var b={};for(var a=0;a<this.params.length;a++){var c=this.params[a];b[c.name]=c.value}return b},get_param_values:function(){var b=[];for(var a=0;a<this.params.length;a++){b[a]=this.params[a].value}return b}});var NumberToolParameter=function(c,b,e,a,d){this.name=c;this.label=b;this.min=e;this.max=a;this.value=d};var get_tool_from_dict=function(f){if(obj_length(f)==0){return undefined}var b=f.name;var l=f.params;var c=Array();for(var e=0;e<l.length;e++){var g=l[e];var a=g.name,k=g.label,h=g.type,d=g.min,j=g.max,m=g.value;c[c.length]=new NumberToolParameter(a,k,d,j,m)}return new Tool(b,c)};var Filter=function(b,a,c){this.name=b;this.index=a;this.value=c};var NumberFilter=function(b,a){this.name=b;this.index=a;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.slider_min=Number.MAX_VALUE;this.slider_max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};$.extend(NumberFilter.prototype,{applies_to:function(a){if(a.length>this.index){return true}return false},keep:function(a){if(!this.applies_to(a)){return true}return(a[this.index]>=this.low&&a[this.index]<=this.high)},update_attrs:function(b){var a=false;if(!this.applies_to(b)){return a}if(b[this.index]<this.slider_min){this.slider_min=b[this.index];a=true}if(b[this.index]>this.slider_max){this.slider_max=b[this.index];a=false}return a},update_ui_elt:function(){var b=this.slider.slider("option","min"),a=this.slider.slider("option","max");if(this.slider_min<b||this.slider_max>a){this.slider.slider("option","min",this.slider_min);this.slider.slider("option","max",this.slider_max);this.slider.slider("option","values",[this.slider_min,this.slider_max])}}});var get_filters_from_dict=function(a){var g=[];for(var d=0;d<a.length;d++){var f=a[d];var c=f.name,e=f.type,b=f.index;if(e=="int"||e=="float"){g[d]=new NumberFilter(c,b)}else{g[d]=new Filter(c,b,e)}}return g};var TrackConfig=function(a){this.track=a.track;this.params=a.params;this.values={};if(a.saved_values){this.restore_values(a.saved_values)}this.onchange=a.onchange};$.extend(TrackConfig.prototype,{restore_values:function(a){var b=this;$.each(this.params,function(c,d){if(a[d.key]!==undefined){b.values[d.key]=a[d.key]}else{b.values[d.key]=d.default_value}})},build_form:function(){var b=this;var a=$("<div />");$.each(this.params,function(f,d){if(!d.hidden){var c="param_"+f;var k=$("<div class='form-row' />").appendTo(a);k.append($("<label />").attr("for",c).text(d.label+":"));if(d.type=="bool"){k.append($('<input type="checkbox" />').attr("id",c).attr("name",c).attr("checked",b.values[d.key]))}else{if(d.type=="color"){var h=b.values[d.key];var g=$("<input />").attr("id",c).attr("name",c).val(h);var i=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var e=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(i);var j=$("<div/>").appendTo(e).farbtastic({width:100,height:100,callback:g,color:h});$("<div />").append(g).append(i).appendTo(k).bind("click",function(l){i.css({left:$(this).position().left+($(g).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){i.hide();$(document).unbind("click.color-picker")});l.stopPropagation()})}else{k.append($("<input />").attr("id",c).attr("name",c).val(b.values[d.key]))}}}});return a},update_from_form:function(a){var c=this;var b=false;$.each(this.params,function(d,f){if(!f.hidden){var g="param_"+d;var e=a.find("#"+g).val();if(f.type=="float"){e=parseFloat(e)}else{if(f.type=="int"){e=parseInt(e)}else{if(f.type=="bool"){e=a.find("#"+g).is(":checked")}}}if(e!==c.values[f.key]){c.values[f.key]=e;b=true}}});if(b){this.onchange()}}});var Track=function(b,a,e,c,d){this.name=b;this.view=a;this.parent_element=e;this.data_url=(c?c:default_data_url);this.data_query_wait=(d?d:DEFAULT_DATA_QUERY_WAIT);this.dataset_check_url=converted_datasets_state_url;this.container_div=$("<div />").addClass("track").css("position","relative");if(!this.hidden){this.header_div=$("<div class='track-header' />").appendTo(this.container_div);if(this.view.editor){this.drag_div=$("<div class='draghandle' />").appendTo(this.header_div)}this.name_div=$("<div class='menubutton popup' />").appendTo(this.header_div);this.name_div.text(this.name);this.name_div.attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase())}this.content_div=$("<div class='track-content'>").appendTo(this.container_div);this.parent_element.append(this.container_div)};$.extend(Track.prototype,{init:function(){var a=this;a.enabled=false;a.data_queue={};a.tile_cache.clear();a.data_cache.clear();a.initial_canvas=undefined;a.content_div.css("height","auto");a.container_div.removeClass("nodata error pending");if(!a.dataset_id){return}if(a.view.chrom!=null){$.getJSON(converted_datasets_state_url,{hda_ldda:a.hda_ldda,dataset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(!b||b==="error"||b.kind==="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR);if(b.message){var d=a.view.tracks.indexOf(a);var c=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+b.message+"</pre>",{Close:hide_modal})});a.content_div.append(c)}}else{if(b==="no converter"){a.container_div.addClass("error");a.content_div.text(DATA_NOCONVERTER)}else{if(b==="no data"||(b.data!==undefined&&(b.data===null||b.data.length===0))){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b==="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},a.data_query_wait)}else{if(b.status==="data"){if(b.valid_chroms){a.valid_chroms=b.valid_chroms;a.name_div.data("menu_options")["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+a.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}a.content_div.text(DATA_OK);if(a.view.chrom){a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.enabled=true;$.when(a.predraw_init()).done(function(){a.draw()})}}}}}}})}},predraw_init:function(){},update_name:function(a){this.old_name=this.name;this.name=a;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var TiledTrack=function(g,d,s){var o=this,j=o.view;this.filters=(g!==undefined?get_filters_from_dict(g):[]);this.tool=(d!==undefined?get_tool_from_dict(d):undefined);this.parent_track=s;this.child_tracks=[];if(o.hidden){return}if(this.parent_track){this.header_div.find(".draghandle").removeClass("draghandle").addClass("child-track-icon").addClass("icon-button");this.parent_element.addClass("child-track");this.tool=undefined}this.filtering_div=$("<div/>").addClass("track-filters").hide();this.header_div.after(this.filtering_div);this.filtering_div.bind("drag",function(i){i.stopPropagation()}).bind("dblclick",function(i){i.stopPropagation()});var t=$("<table class='filters'>").appendTo(this.filtering_div);$.each(this.filters,function(w,z){var v=$("<tr>").appendTo(t);var y=$("<th class='filter-info'>").appendTo(v);var u=$("<span class='name'>").appendTo(y);u.text(z.name+" ");var i=$("<span class='values'>").appendTo(y);var x=$("<td>").appendTo(v);z.control_element=$("<div id='"+z.name+"-filter-control' style='width: 200px; position: relative'>").appendTo(x);z.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(B,C){var A=C.values;i.text("["+A[0]+"-"+A[1]+"]");z.low=A[0];z.high=A[1];o.draw(true)},change:function(A,B){z.control_element.slider("option","slide").call(z.control_element,A,B)}});z.slider=z.control_element;z.slider_label=i});if(this.tool){this.dynamic_tool_div=$("<div/>").addClass("dynamic-tool").hide();this.header_div.after(this.dynamic_tool_div);this.dynamic_tool_div.bind("drag",function(i){i.stopPropagation()}).bind("click",function(i){i.stopPropagation()}).bind("dblclick",function(i){i.stopPropagation()});var l=$("<div class='tool-name'>").appendTo(this.dynamic_tool_div).text(this.tool.name);var e=this.tool.params;var o=this;$.each(this.tool.params,function(A,v){var y=$("<div>").addClass("param-row").appendTo(o.dynamic_tool_div);var x=$("<div>").addClass("slider-label").appendTo(y);var C=$("<span class='param-name'>").text(v.label+" ").appendTo(x);var w=$("<span/>").text(v.value);var z=$("<span class='param-value'>").appendTo(x).append("[").append(w).append("]");var B=$("<div/>").addClass("slider").appendTo(y);var i=$("<div id='"+v.name+"-param-control'>").appendTo(B);var u=(v.max<=1?0.01:(v.max<=1000?1:5));i.slider({min:v.min,max:v.max,step:u,value:v.value,slide:function(D,F){var E=F.value;v.value=E;if(0<E&&E<1){E=parseFloat(E).toFixed(2)}w.text(E)},change:function(D,E){v.value=E.value}});z.click(function(){var F=w,E=F.text(),D=(v.max<=1?4:v.max.length);F.text("");$("<input type='text'/>").attr("size",D).attr("maxlength",D).attr("value",E).appendTo(F).focus().select().click(function(G){G.stopPropagation()}).blur(function(){$(this).remove();F.text(E)}).keyup(function(I){if(I.keyCode===27){$(this).trigger("blur")}else{if(I.keyCode===13){var G=$(this),H=parseFloat(G.val());if(isNaN(H)||H>v.max||H<v.min){alert("Parameter value must be in the range ["+v.min+"-"+v.max+"]");return $(this)}F.text(H);i.slider("value",H);v.value=H}}})});$("<div style='clear: both;'/>").appendTo(y)});var b=$("<div>").addClass("param-row").appendTo(this.dynamic_tool_div);var n=$("<input type='submit'>").attr("value","Run").appendTo(b);var o=this;n.click(function(){o.run_tool()})}o.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();o.container_div.append(o.child_tracks_container);if(o.display_modes!==undefined){if(o.mode_div===undefined){o.mode_div=$("<div class='right-float menubutton popup' />").appendTo(o.header_div);var m=o.display_modes[0];o.mode=m;o.mode_div.text(m);var a=function(i){o.mode_div.text(i);o.mode=i;o.tile_cache.clear();o.draw()};var f={};for(var q=0,r=o.display_modes.length;q<r;q++){var k=o.display_modes[q];f[k]=function(i){return function(){a(i)}}(k)}make_popupmenu(o.mode_div,f)}else{o.mode_div.hide()}}var h={};h["Edit configuration"]=function(){var v=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},i=function(){o.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},u=function(w){if((w.keyCode||w.which)===27){v()}else{if((w.keyCode||w.which)===13){i()}}};$(window).bind("keypress.check_enter_esc",u);show_modal("Configure Track",o.track_config.build_form(),{Cancel:v,OK:i})};if(o.filters.length>0){h["Show filters"]=function(){var i;if(!o.filtering_div.is(":visible")){i="Hide filters";o.filters_visible=true}else{i="Show filters";o.filters_visible=false}o.filtering_div.toggle()}}if(o.tool){h["Toggle Tool"]=function(){var i;if(!o.dynamic_tool_div.is(":visible")){i="Hide dynamic tool";o.update_name(o.name+o.tool_region_and_parameters_str())}else{i="Show dynamic tool";o.revert_name()}o.dynamic_tool_div.toggle()}}var c=j;var p=function(){$("#no-tracks").show()};if(this.parent_track){c=this.parent_track;p=function(){}}h.Remove=function(){c.remove_track(o);if(c.num_tracks===0){p()}};o.popup_menu=make_popupmenu(o.name_div,h)};$.extend(TiledTrack.prototype,Track.prototype,{draw:function(b){var m=this.view.low,g=this.view.high,j=g-m,c=this.view.container.width(),f=this.view.resolution;var p=$("<div style='position: relative;'></div>"),r=c/j;this.content_div.append(p);this.max_height=0;var a=Math.floor(m/f/DENSITY);var l=0;while((a*DENSITY*f)<g){var n=c+"_"+r+"_"+a;var e=this.tile_cache.get(n);var k=a*DENSITY*this.view.resolution;var q=k+DENSITY*this.view.resolution;if(!b&&e){this.show_tile(e,p,k,r)}else{this.delayed_draw(b,n,k,q,a,f,p,r)}a+=1}var d=this;var o=setInterval(function(){if(l===0){var u=d.content_div.children();var t=false;for(var v=u.length-1,s=0;v>=s;v--){var x=$(u[v]);if(t){x.remove()}else{if(x.children().length!==0){t=true}}}for(var w=0;w<d.filters.length;w++){d.filters[w].update_ui_elt()}clearInterval(o)}},50);for(var h=0;h<this.child_tracks.length;h++){this.child_tracks[h].draw(b)}},delayed_draw:function(b,g,f,i,c,e,h,j){var d=this;var a=setTimeout(function(){if(f<=d.view.high&&i>=d.view.low){var k;if(!b){k=d.tile_cache.get(g)}if(!k){k=d.draw_tile(e,c,h,j);if(k){var l=$("<div class='track-tile'>").prepend(k);if(k.hasClass(FILTERABLE_CLASS)){l.addClass(FILTERABLE_CLASS)}k=l}}if(k){d.tile_cache.set(g,k);d.show_tile(k,h,f,j)}}},50)},show_tile:function(a,f,d,g){var b=this;var c=this.view.high-this.view.low,e=(d-this.view.low)*g;if(this.left_offset){e-=this.left_offset}a.css({position:"absolute",top:0,left:e,height:""});f.append(a);b.max_height=Math.max(b.max_height,a.height());b.content_div.css("height",b.max_height+"px");f.children().css("height",b.max_height+"px");if(b.hidden){return}if(a.hasClass(FILTERABLE_CLASS)){show_hide_popupmenu_options(b.popup_menu,"(Show|Hide) filters");if(b.filters_visible){b.filtering_div.show()}}else{show_hide_popupmenu_options(b.popup_menu,"(Show|Hide) filters",false);b.filtering_div.hide()}},set_overview:function(){var a=this.view;if(this.initial_canvas&&this.is_overview){a.overview_close.show();a.overview_viewport.append(this.initial_canvas);a.overview_highlight.show().height(this.initial_canvas.height());a.overview_viewport.height(this.initial_canvas.height()+a.overview_box.height())}$(window).trigger("resize")},run_tool:function(){var b={dataset_id:this.original_dataset_id,chrom:this.view.chrom,low:this.view.low,high:this.view.high,tool_id:this.tool.name};$.extend(b,this.tool.get_param_values_dict());var d=this,c=b.tool_id+d.tool_region_and_parameters_str(b.chrom,b.low,b.high),e;if(d.track_type=="FeatureTrack"){e=new ToolDataFeatureTrack(c,view,undefined,{},{},d)}this.add_track(e);e.content_div.text("Starting job.");view.has_changes=true;var a=function(){$.getJSON(run_tool_url,b,function(f){if(f=="no converter"){e.container_div.addClass("error");e.content_div.text(DATA_NOCONVERTER)}else{if(f.error){e.container_div.addClass("error");e.content_div.text(DATA_CANNOT_RUN_TOOL+f.message)}else{if(f=="pending"){e.container_div.addClass("pending");e.content_div.text("Converting input data so that it can be easily reused.");setTimeout(a,2000)}else{e.dataset_id=f.dataset_id;e.content_div.text("Running job.");e.init()}}}})};a()},tool_region_and_parameters_str:function(c,a,d){var b=this,e=(c!==undefined&&a!==undefined&&d!==undefined?c+":"+a+"-"+d:"all");return" - region=["+e+"], parameters=["+b.tool.get_param_values().join(", ")+"]"},add_track:function(a){a.track_id=this.track_id+"_"+this.child_tracks.length;a.container_div.attr("id","track_"+a.track_id);this.child_tracks_container.append(a.container_div);sortable(a.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(a)},remove_track:function(a){a.container_div.fadeOut("slow",function(){$(this).remove()})}});var LabelTrack=function(a,b){this.track_type="LabelTrack";this.hidden=true;Track.call(this,null,a,b);this.container_div.addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.view.container.width(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var ReferenceTrack=function(a){this.track_type="ReferenceTrack";this.hidden=true;Track.call(this,null,a,a.top_labeltrack);TiledTrack.call(this);this.left_offset=200;this.height_px=12;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_queue={};this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE)};$.extend(ReferenceTrack.prototype,TiledTrack.prototype,{get_data:function(d,b){var c=this,a=b*DENSITY*d,f=(b+1)*DENSITY*d,e=d+"_"+b;if(!c.data_queue[e]){c.data_queue[e]=true;$.ajax({url:reference_url,dataType:"json",data:{chrom:this.view.chrom,low:a,high:f,dbkey:this.view.dbkey},success:function(g){c.data_cache.set(e,g);delete c.data_queue[e];c.draw()},error:function(h,g,i){console.log(h,g,i)}})}},draw_tile:function(f,b,k,o){var g=b*DENSITY*f,d=DENSITY*f,j=f+"_"+b;var e=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(e)}e=$(e);var n=e.get(0).getContext("2d");if(o>CHAR_WIDTH_PX){if(this.data_cache.get(j)===undefined){this.get_data(f,b);return}var m=this.data_cache.get(j);if(m===null){this.content_div.css("height","0px");return}e.get(0).width=Math.ceil(d*o+this.left_offset);e.get(0).height=this.height_px;for(var h=0,l=m.length;h<l;h++){var a=Math.round(h*o),i=Math.round(o/2);n.fillText(m[h],a+this.left_offset+i,10)}k.append(e);return e}this.content_div.css("height","0px")}});var LineTrack=function(e,c,f,a,d){var b=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";Track.call(this,e,c,c.viewport_container);TiledTrack.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=f;this.dataset_id=a;this.original_dataset_id=a;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE);this.track_config=new TrackConfig({track:this,params:[{key:"color",label:"Color",type:"color",default_value:"black"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.height_px,hidden:true}],saved_values:d,onchange:function(){b.vertical_range=b.prefs.max_value-b.prefs.min_value;$("#linetrack_"+b.track_id+"_minval").text(b.prefs.min_value);$("#linetrack_"+b.track_id+"_maxval").text(b.prefs.max_value);b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;this.height_px=this.track_config.values.height;this.vertical_range=this.track_config.values.max_value-this.track_config.values.min_value;(function(g){var j=false;var i=false;var h=$("<div class='track-resize'>");$(g.container_div).hover(function(){j=true;h.show()},function(){j=false;if(!i){h.hide()}});h.hide().bind("dragstart",function(k,l){i=true;l.original_height=$(g.content_div).height()}).bind("drag",function(l,m){var k=Math.min(Math.max(m.original_height+m.deltaY,g.min_height_px),g.max_height_px);$(g.content_div).css("height",k);g.height_px=k;g.draw(true)}).bind("dragend",function(k,l){g.tile_cache.clear();i=false;if(!j){h.hide()}g.track_config.values.height=g.height_px}).appendTo(g.container_div)})(this)};$.extend(LineTrack.prototype,TiledTrack.prototype,{predraw_init:function(){var a=this,b=a.view.tracks.indexOf(a);a.vertical_range=undefined;return $.getJSON(a.data_url,{stats:true,chrom:a.view.chrom,low:null,high:null,hda_ldda:a.hda_ldda,dataset_id:a.dataset_id},function(c){a.container_div.addClass("line-track");var e=c.data;if(isNaN(parseFloat(a.prefs.min_value))||isNaN(parseFloat(a.prefs.max_value))){a.prefs.min_value=e.min;a.prefs.max_value=e.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;a.total_frequency=e.total_frequency;a.container_div.find(".yaxislabel").remove();var f=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(round_1000(a.prefs.min_value));var d=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(round_1000(a.prefs.max_value));d.css({position:"absolute",top:"24px",left:"10px"});d.prependTo(a.container_div);f.css({position:"absolute",bottom:"2px",left:"10px"});f.prependTo(a.container_div)})},get_data:function(d,b){var c=this,a=b*DENSITY*d,f=(b+1)*DENSITY*d,e=d+"_"+b;if(!c.data_queue[e]){c.data_queue[e]=true;$.ajax({url:this.data_url,dataType:"json",data:{chrom:this.view.chrom,low:a,high:f,hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,resolution:this.view.resolution},success:function(g){var h=g.data;c.data_cache.set(e,h);delete c.data_queue[e];c.draw()},error:function(h,g,i){console.log(h,g,i)}})}},draw_tile:function(o,r,c,e){if(this.vertical_range===undefined){return}var s=r*DENSITY*o,a=DENSITY*o,x=o+"_"+r;var b=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(b)}b=$(b);if(this.data_cache.get(x)===undefined){this.get_data(o,r);return}var v=this.data_cache.get(x);if(!v){return}b.get(0).width=Math.ceil(a*e);b.get(0).height=this.height_px;var n=b.get(0).getContext("2d"),j=false,k=this.prefs.min_value,g=this.prefs.max_value,m=this.vertical_range,t=this.total_frequency,d=this.height_px,l=this.mode;var w=Math.round(d+k/m*d);n.beginPath();n.moveTo(0,w);n.lineTo(a*e,w);n.fillStyle="#aaa";n.stroke();n.beginPath();n.fillStyle=this.prefs.color;var u,h,f;if(v.length>1){f=Math.ceil((v[1][0]-v[0][0])*e)}else{f=10}for(var p=0,q=v.length;p<q;p++){u=Math.round((v[p][0]-s)*e);h=v[p][1];if(h===null){if(j&&l==="Filled"){n.lineTo(u,d)}j=false;continue}if(h<k){h=k}else{if(h>g){h=g}}if(l==="Histogram"){h=Math.round(h/m*d);n.fillRect(u,w,f,-h)}else{if(l==="Intensity"){h=255-Math.floor((h-k)/m*255);n.fillStyle="rgb("+h+","+h+","+h+")";n.fillRect(u,0,f,d)}else{h=Math.round(d-(h-k)/m*d);if(j){n.lineTo(u,h)}else{j=true;if(l==="Filled"){n.moveTo(u,d);n.lineTo(u,h)}else{n.moveTo(u,h)}}}}}if(l==="Filled"){if(j){n.lineTo(u,w);n.lineTo(0,w)}n.fill()}else{n.stroke()}return b}});var FeatureTrack=function(a,f,e,i,h,c,d,g){var b=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];Track.call(this,a,f,f.viewport_container);TiledTrack.call(this,c,d,g);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=e;this.dataset_id=i;this.original_dataset_id=i;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.default_font=DEFAULT_FONT;this.inc_slots={};this.data_queue={};this.start_end_dct={};this.tile_cache=new Cache(CACHED_TILES_FEATURE);this.data_cache=new DataCache(20);this.left_offset=200;this.track_config=new TrackConfig({track:this,params:[{key:"block_color",label:"Block color",type:"color",default_value:"#444"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true}],saved_values:h,onchange:function(){b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{get_data:function(a,d){var b=this,c=a+"_"+d;if(!b.data_queue[c]){b.data_queue[c]=true;$.getJSON(b.data_url,{chrom:b.view.chrom,low:a,high:d,hda_ldda:b.hda_ldda,dataset_id:b.dataset_id,resolution:this.view.resolution,mode:this.mode},function(e){b.data_cache.set_data(a,d,b.mode,e);delete b.data_queue[c];b.draw()})}},incremental_slots:function(a,j,d,q){var r=this.inc_slots[a];if(!r||(r.mode!==q)){r={};r.w_scale=a;r.mode=q;this.inc_slots[a]=r;this.start_end_dct[a]={}}var m=r.w_scale,x=[],y=[],k=0,o=this.view.max_low;for(var v=0,w=j.length;v<w;v++){var h=j[v],l=h[0];if(r[l]!==undefined){k=Math.max(k,r[l]);y.push(r[l])}else{x.push(v)}}var e=this.start_end_dct[a];var n=function(D,E){for(var C=0;C<=MAX_FEATURE_DEPTH;C++){var A=false,F=e[C];if(F!==undefined){for(var z=0,B=F.length;z<B;z++){var i=F[z];if(E>i[0]&&D<i[1]){A=true;break}}}if(!A){return C}}return -1};for(var v=0,w=x.length;v<w;v++){var h=j[x[v]],l=h[0],t=h[1],b=h[2],p=h[3],c=Math.floor((t-o)*m),g=Math.ceil((b-o)*m),u=CONTEXT.measureText(p).width,f;if(p!==undefined&&!d){u+=(LABEL_SPACING+PACK_SPACING);if(c-u>=0){c-=u;f="left"}else{g+=u;f="right"}}var s=n(c,g);if(s>=0){if(e[s]===undefined){e[s]=[]}e[s].push([c,g]);r[l]=s;k=Math.max(k,s)}else{}}return k},rect_or_text:function(r,l,u,b,q,j,g,f){r.textAlign="center";var d=0,s=0,p=Math.round(l/2);for(var m=0,t=j.length;m<t;m++){var k=j[m],e="MIDNSHP=X"[k[0]],n=k[1];if(e==="H"||e==="S"){d-=n}var h=q+d,x=Math.floor(Math.max(0,(h-u)*l)),i=Math.floor(Math.max(0,(h+n-u)*l));switch(e){case"H":break;case"S":case"M":case"=":var o=g.slice(s,s+n);if((this.mode==="Pack"||this.mode==="Auto")&&g!==undefined&&l>CHAR_WIDTH_PX){r.fillStyle=this.prefs.block_color;r.fillRect(x+this.left_offset,f+1,i-x,9);r.fillStyle=CONNECTOR_COLOR;for(var v=0,a=o.length;v<a;v++){if(h+v>=u&&h+v<=b){var w=Math.floor(Math.max(0,(h+v-u)*l));r.fillText(o[v],w+this.left_offset+p,f+9)}}}else{r.fillStyle=this.prefs.block_color;r.fillRect(x+this.left_offset,f+(this.mode!="Dense"?4:5),i-x,(this.mode!="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}s+=n;break;case"N":r.fillStyle=CONNECTOR_COLOR;r.fillRect(x+this.left_offset,f+5,i-x,1);break;case"D":r.fillStyle="red";r.fillRect(x+this.left_offset,f+4,i-x,3);break;case"P":break;case"I":s+=n;break;case"X":s+=n;break}d+=n}},draw_tile:function(ae,m,q,au){var K=m*DENSITY*ae,aj=(m+1)*DENSITY*ae,J=aj-K;var G=this.data_cache.get_data(K,aj,this.mode);if(G===undefined||G==="pending"||(this.mode!=="Auto"&&G.dataset_type==="summary_tree")){this.data_queue[[K,aj]]=true;this.get_data(K,aj);return}var a=Math.ceil(J*au),ag=this.prefs.label_color,g=this.prefs.block_color,p=this.mode,u=25,aa,V=this.left_offset,at,B,av;var o=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(o)}o=$(o);if(G.dataset_type==="summary_tree"){B=this.summary_draw_height}else{if(p==="Dense"){B=u;av=DENSE_TRACK_HEIGHT}else{if(p==="Squish"){av=SQUISH_TRACK_HEIGHT;aa=true}else{if(p==="Pack"){av=PACK_TRACK_HEIGHT;aa=false}else{if(G.extra_info==="no_detail"){av=(G.track_type==="bai"?SQUISH_TRACK_HEIGHT:NO_DETAIL_TRACK_HEIGHT);aa=true}else{av=PACK_TRACK_HEIGHT;aa=false}}}B=this.incremental_slots(au,G.data,aa,p)*av+u;at=this.inc_slots[au]}}o.get(0).width=a+V;o.get(0).height=B;if(G.dataset_type=="summary_tree"){o.get(0).height+=LABEL_SPACING+CHAR_HEIGHT_PX}q.parent().css("height",Math.max(this.height_px,B)+"px");var H=o.get(0).getContext("2d");H.fillStyle=g;H.font=this.default_font;H.textAlign="right";this.container_div.find(".yaxislabel").remove();if(G.dataset_type=="summary_tree"){var v=B+LABEL_SPACING+CHAR_HEIGHT_PX;points=G.data,max=G.max,delta_x_px=Math.ceil(G.delta*au);var n=$("<div />").addClass("yaxislabel");n.text(max);n.css({position:"absolute",top:"22px",left:"10px"});n.prependTo(this.container_div);for(var an=0,F=points.length;an<F;an++){var Z=Math.floor((points[an][0]-K)*au);var Y=points[an][1];if(!Y){continue}var ak=Y/max*B;H.fillStyle="black";H.fillRect(Z+V,v-ak,delta_x_px,ak);var X=4;if(this.prefs.show_counts&&(H.measureText(Y).width+X)<delta_x_px){H.fillStyle="#666";H.textAlign="center";H.fillText(Y,Z+V+(delta_x_px/2),10)}}return o}if(G.message){o.css({"border-color":"red"});H.fillStyle="red";H.textAlign="left";H.fillText(G.message,100+V,av);if(!G.data){return o}}for(var aq=0;aq<this.filters.length;aq++){if(G.data.length&&this.filters[aq].applies_to(G.data[0])){o.addClass(FILTERABLE_CLASS);break}}var ar=G.data;var am=0;for(var an=0,F=ar.length;an<F;an++){var R=ar[an],O=R[0],ap=R[1],ac=R[2],L=R[3];if(this.mode!="Dense"&&at[O]===undefined){continue}var ab=false;var T;for(var aq=0;aq<this.filters.length;aq++){T=this.filters[aq];T.update_attrs(R);if(!T.keep(R)){ab=true;break}}if(ab){continue}if(ap<=aj&&ac>=K){if(G.dataset_type=="interval_index"){ac-=1}var ad=Math.floor(Math.max(0,(ap-K)*au)),I=Math.ceil(Math.min(a,Math.max(0,(ac-K)*au))),W=(p==="Dense"?1:(1+at[O]))*av;var E,ah,M=null,aw=null;if(G.dataset_type==="bai"){H.fillStyle=g;if(R[5] instanceof Array){var C=Math.floor(Math.max(0,(R[4][0]-K)*au)),N=Math.ceil(Math.min(a,Math.max(0,(R[4][1]-K)*au))),A=Math.floor(Math.max(0,(R[5][0]-K)*au)),t=Math.ceil(Math.min(a,Math.max(0,(R[5][1]-K)*au)));if(R[4][1]>=K&&R[4][0]<=aj&&R[4][2]){this.rect_or_text(H,au,K,aj,R[4][0],R[4][2],R[4][3],W)}if(R[5][1]>=K&&R[5][0]<=aj&&R[5][2]){this.rect_or_text(H,au,K,aj,R[5][0],R[5][2],R[5][3],W)}if(A>N){H.fillStyle=CONNECTOR_COLOR;H.dashedLine(N+V,W+5,V+A,W+5)}}else{H.fillStyle=g;this.rect_or_text(H,au,K,aj,ap,R[4],R[5],W)}if(p!=="Dense"&&!aa&&ap>K){H.fillStyle=this.prefs.label_color;if(m===0&&ad-H.measureText(L).width<0){H.textAlign="left";H.fillText(L,I+V+LABEL_SPACING,W+8)}else{H.textAlign="right";H.fillText(L,ad+V-LABEL_SPACING,W+8)}H.fillStyle=g}}else{if(G.dataset_type==="interval_index"){if(p=="Auto"){if(R.length<=4){p="Squish"}else{p="Pack"}}if(p=="Dense"){H.fillStyle=g;H.fillRect(ad+V,W+5,I-ad,DENSE_FEATURE_HEIGHT)}else{if(R.length<=4){H.fillStyle=g;H.fillRect(ad+V,W+5,I-ad,DENSE_FEATURE_HEIGHT)}else{var D=R[5],U=R[6],af=R[7],e=R[8];if(U&&af){M=Math.floor(Math.max(0,(U-K)*au));aw=Math.ceil(Math.min(a,Math.max(0,(af-K)*au)))}var ao,P;if(p=="Squish"){ao=1;P=SQUISH_FEATURE_HEIGHT}else{ao=5;P=PACK_FEATURE_HEIGHT}if(!e){if(R.strand){if(R.strand=="+"){H.fillStyle=RIGHT_STRAND_INV}else{if(R.strand=="-"){H.fillStyle=LEFT_STRAND_INV}}}else{H.fillStyle=CONNECTOR_COLOR}H.fillRect(ad+V,W+(P-ao)/2+1,I-ad,P)}else{var z,Q;if(p=="Squish"){H.fillStyle=CONNECTOR_COLOR;z=W+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;Q=1}else{if(D){var z=W;var Q=P;if(D=="+"){H.fillStyle=RIGHT_STRAND}else{if(D=="-"){H.fillStyle=LEFT_STRAND}}}else{H.fillStyle=CONNECTOR_COLOR;z+=(SQUISH_FEATURE_HEIGHT/2)+1;Q=1}}H.fillRect(ad+V,z,I-ad,Q);for(var al=0,d=e.length;al<d;al++){var s=e[al],c=Math.floor(Math.max(0,(s[0]-K)*au)),S=Math.ceil(Math.min(a,Math.max((s[1]-K)*au)));if(c>S){continue}H.fillStyle=g;H.fillRect(c+V,W+(P-ao)/2+1,S-c,ao);if(M!==undefined&&!(c>aw||S<M)){var ai=Math.max(c,M),w=Math.min(S,aw-1);H.fillRect(ai+V,W+1,w-ai,P)}}}if(p=="Pack"&&ap>K){H.fillStyle=ag;if(m===0&&ad-H.measureText(L).width<0){H.textAlign="left";H.fillText(L,I+V+LABEL_SPACING,W+8)}else{H.textAlign="right";H.fillText(L,ad+V-LABEL_SPACING,W+8)}H.fillStyle=g}}}}else{if(G.dataset_type==="vcf"){if(aa){H.fillStyle=g;H.fillRect(ad+V,W+5,I-ad,1)}else{var r=R[4],l=R[5],b=R[6];E=9;ah=1;H.fillRect(ad+V,W,I-ad,E);if(p!=="Dense"&&L!==undefined&&ap>K){H.fillStyle=ag;if(m===0&&ad-H.measureText(L).width<0){H.textAlign="left";H.fillText(L,I+2+V,W+8)}else{H.textAlign="right";H.fillText(L,ad-2+V,W+8)}H.fillStyle=g}var h=r+" / "+l;if(ap>K&&H.measureText(h).width<(I-ad)){H.fillStyle="white";H.textAlign="center";H.fillText(h,V+ad+(I-ad)/2,W+8);H.fillStyle=g}}}}}am++}}return o}});var ReadTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="ReadTrack"};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{});var ToolDataFeatureTrack=function(e,c,g,a,d,f,b){FeatureTrack.call(this,e,c,g,a,d,f,{},b);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};$.extend(ToolDataFeatureTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{predraw_init:function(){var b=this;var a=function(){if(b.data_cache.size()==0){setTimeout(a,300)}else{b.data_url=default_data_url;b.data_query_wait=DEFAULT_DATA_QUERY_WAIT;b.dataset_state_url=converted_datasets_state_url;$.getJSON(b.dataset_state_url,{dataset_id:b.dataset_id},function(c){})}};a()}});
\ No newline at end of file
+CanvasRenderingContext2D.prototype.dashedLine=function(c,i,b,h,f){if(f==undefined){f=4}var e=b-c;var d=h-i;var g=Math.floor(Math.sqrt(e*e+d*d)/f);var k=e/g;var j=d/g;for(var a=0;a<g;a++,c+=k,i+=j){if(a%2!=0){continue}this.fillRect(c,i,f,1)}};CanvasRenderingContext2D.prototype.drawDownwardEquilateralTriangle=function(b,a,e){var d=b-e/2,c=b+e/2,f=a-Math.sqrt(e*3/2);this.beginPath();this.moveTo(d,f);this.lineTo(c,f);this.lineTo(b,a);this.lineTo(d,f);this.strokeStyle=this.fillStyle;this.fill();this.stroke();this.closePath()};function sortable(a,b){a.bind("drag",{handle:b,relative:true},function(h,j){var g=$(this).parent();var f=g.children();for(var c=0;c<f.length;c++){if(j.offsetY<$(f.get(c)).position().top){break}}if(c==f.length){if(this!=f.get(c-1)){g.append(this)}}else{if(this!=f.get(c)){$(this).insertBefore(f.get(c))}}})}var NO_OVERLAP=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005;function compute_overlap(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=NO_OVERLAP}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=NO_OVERLAP}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a}function is_overlap(b,a){return(compute_overlap(b,a)!=NO_OVERLAP)}var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=DENSE_FEATURE_HEIGHT=1,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,PACK_SPACING=5,DEFAULT_FONT="9px Monaco, Lucida Console, monospace",DENSITY=200,FEATURE_LEVELS=10,MAX_FEATURE_DEPTH=100,DEFAULT_DATA_QUERY_WAIT=5000,MAX_CHROMS_SELECTABLE=100,CONNECTOR_COLOR="#ccc",DATA_ERROR="There was an error in indexing this dataset. ",DATA_NOCONVERTER="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",DATA_NONE="No data for this chrom/contig.",DATA_PENDING="Currently indexing... please wait",DATA_CANNOT_RUN_TOOL="Tool cannot be rerun: ",DATA_LOADING="Loading data...",DATA_OK="Ready for display",FILTERABLE_CLASS="filterable",CACHED_TILES_FEATURE=10,CACHED_TILES_LINE=5,CACHED_DATA=5,DUMMY_CANVAS=document.createElement("canvas"),RIGHT_STRAND,LEFT_STRAND;if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(DUMMY_CANVAS)}var CONTEXT=DUMMY_CANVAS.getContext("2d");CONTEXT.font=DEFAULT_FONT;var CHAR_WIDTH_PX=CONTEXT.measureText("A").width,CHAR_HEIGHT_PX=9;var right_img=new Image();right_img.src=image_path+"/visualization/strand_right.png";right_img.onload=function(){RIGHT_STRAND=CONTEXT.createPattern(right_img,"repeat")};var left_img=new Image();left_img.src=image_path+"/visualization/strand_left.png";left_img.onload=function(){LEFT_STRAND=CONTEXT.createPattern(left_img,"repeat")};var right_img_inv=new Image();right_img_inv.src=image_path+"/visualization/strand_right_inv.png";right_img_inv.onload=function(){RIGHT_STRAND_INV=CONTEXT.createPattern(right_img_inv,"repeat")};var left_img_inv=new Image();left_img_inv.src=image_path+"/visualization/strand_left_inv.png";left_img_inv.onload=function(){LEFT_STRAND_INV=CONTEXT.createPattern(left_img_inv,"repeat")};function round_1000(a){return Math.round(a*1000)/1000}var Cache=function(a){this.num_elements=a;this.clear()};$.extend(Cache.prototype,{get:function(b){var a=this.key_ary.indexOf(b);if(a!=-1){this.move_key_to_end(b,a)}return this.obj_cache[b]},set:function(b,c){if(!this.obj_cache[b]){if(this.key_ary.length>=this.num_elements){var a=this.key_ary.shift();delete this.obj_cache[a]}this.key_ary.push(b)}this.obj_cache[b]=c;return c},move_key_to_end:function(b,a){this.key_ary.splice(a,1);this.key_ary.push(b)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var DataCache=function(a){Cache.call(this,a)};$.extend(DataCache.prototype,Cache.prototype,{get_data:function(g,b,e){var h=this.get(this.gen_key(g,b,e));if(h){return h}var j,f,a,d,e,h;for(var c=0;c<this.key_ary.length;c++){j=this.key_ary[c];f=this.split_key(j);a=f[0];d=f[1];if(g>=a&&b<=d){h=this.obj_cache[j];if(h.dataset_type!=="summary_tree"&&h.extra_info!=="no_detail"){this.move_key_to_end(j,c);return h}}}return undefined},set_data:function(b,c,d,a){return this.set(this.gen_key(b,c,d),a)},gen_key:function(a,c,d){var b=a+"_"+c+"_"+d;return b},split_key:function(a){return a.split("_")}});var View=function(a,d,c,b,e){this.container=a;this.chrom=null;this.vis_id=c;this.dbkey=b;this.title=d;this.tracks=[];this.label_tracks=[];this.max_low=0;this.max_high=0;this.num_tracks=0;this.track_id_counter=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.init(e);this.reset()};$.extend(View.prototype,{init:function(d){var c=this.container,a=this;this.top_container=$("<div/>").addClass("top-container").appendTo(c);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(c);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(c);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").addClass("viewport-container").appendTo(this.content_div);this.intro_div=$("<div/>").addClass("intro").text("Select a chrom from the dropdown below").hide();this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a href='javascript:void(0);'>Close Overview</a>").addClass("overview-close").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_form=$("<form/>").attr("action",function(){}).appendTo(this.nav_controls);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.chrom_form);var b=function(f){if(f.type==="focusout"||(f.keyCode||f.which)===13||(f.keyCode||f.which)===27){if((f.keyCode||f.which)!==27){a.go_to($(this).val())}$(this).hide();a.location_span.show();a.chrom_select.show();return false}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keypress focusout",b).appendTo(this.chrom_form);this.location_span=$("<span/>").addClass("location").appendTo(this.chrom_form);this.location_span.bind("click",function(){a.location_span.hide();a.chrom_select.hide();a.nav_input.css("display","inline-block");a.nav_input.select();a.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.chrom_form)}this.zo_link=$("<a id='zoom-out' />").click(function(){a.zoom_out();a.redraw()}).appendTo(this.chrom_form);this.zi_link=$("<a id='zoom-in' />").click(function(){a.zoom_in();a.redraw()}).appendTo(this.chrom_form);this.load_chroms({low:0},d);this.chrom_select.bind("change",function(){a.change_chrom(a.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(f){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(f){a.zoom_in(f.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(f,g){this.current_x=g.offsetX}).bind("drag",function(f,h){var i=h.offsetX-this.current_x;this.current_x=h.offsetX;var g=Math.round(i/a.viewport_container.width()*(a.max_high-a.max_low));a.move_delta(-g)});this.overview_close.bind("click",function(){for(var f=0,e=a.tracks.length;f<e;f++){a.tracks[f].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",a.overview_box.height());a.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(f,g){if(f.clientX>a.viewport_container.width()-16){return false}}).bind("dragstart",function(f,g){g.original_low=a.low;g.current_height=f.clientY;g.current_x=g.offsetX}).bind("drag",function(h,j){var f=$(this);var k=j.offsetX-j.current_x;var g=f.scrollTop()-(h.clientY-j.current_height);f.scrollTop(g);j.current_height=h.clientY;j.current_x=j.offsetX;var i=Math.round(k/a.viewport_container.width()*(a.high-a.low));a.move_delta(i)}).bind("mousewheel",function(h,j,g,f){if(g){var i=Math.round(-g/a.viewport_container.width()*(a.high-a.low));a.move_delta(i)}});this.top_labeltrack.bind("dragstart",function(f,g){return $("<div />").css({height:a.content_div.height()+a.top_labeltrack.height()+a.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(j,k){$(k.proxy).css({left:Math.min(j.pageX,k.startX),width:Math.abs(j.pageX-k.startX)});var g=Math.min(j.pageX,k.startX)-a.container.offset().left,f=Math.max(j.pageX,k.startX)-a.container.offset().left,i=(a.high-a.low),h=a.viewport_container.width();a.update_location(Math.round(g/h*i)+a.low,Math.round(f/h*i)+a.low)}).bind("dragend",function(k,l){var g=Math.min(k.pageX,l.startX),f=Math.max(k.pageX,l.startX),i=(a.high-a.low),h=a.viewport_container.width(),j=a.low;a.low=Math.round(g/h*i)+j;a.high=Math.round(f/h*i)+j;$(l.proxy).remove();a.redraw()});this.add_label_track(new LabelTrack(this,this.top_labeltrack));this.add_label_track(new LabelTrack(this,this.nav_labeltrack));$(window).bind("resize",function(){a.resize_window()});$(document).bind("redraw",function(){a.redraw()});this.reset();$(window).trigger("resize")},update_location:function(a,b){this.location_span.text(commatize(a)+" - "+commatize(b));this.nav_input.val(this.chrom+":"+commatize(a)+"-"+commatize(b))},load_chroms:function(b,c){b.num=MAX_CHROMS_SELECTABLE;$.extend(b,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var a=this;$.ajax({url:chrom_url,data:b,dataType:"json",success:function(e){if(e.reference){a.add_label_track(new ReferenceTrack(a))}a.chrom_data=e.chrom_info;var h='<option value="">Select Chrom/Contig</option>';for(var g=0,d=a.chrom_data.length;g<d;g++){var f=a.chrom_data[g].chrom;h+='<option value="'+f+'">'+f+"</option>"}if(e.prev_chroms){h+='<option value="previous">Previous '+MAX_CHROMS_SELECTABLE+"</option>"}if(e.next_chroms){h+='<option value="next">Next '+MAX_CHROMS_SELECTABLE+"</option>"}a.chrom_select.html(h);if(c){c()}a.chrom_start_index=e.start_index},error:function(){alert("Could not load chroms for this dbkey:",a.dbkey)}})},change_chrom:function(e,b,g){if(!e||e==="None"){return}var d=this;if(e=="previous"){d.load_chroms({low:this.chrom_start_index-MAX_CHROMS_SELECTABLE});return}if(e=="next"){d.load_chroms({low:this.chrom_start_index+MAX_CHROMS_SELECTABLE});return}var f=$.grep(d.chrom_data,function(j,k){return j.chrom===e})[0];if(f===undefined){d.load_chroms({chrom:e},function(){d.change_chrom(e,b,g)});return}else{if(e!==d.chrom){d.chrom=e;if(!d.chrom){d.intro_div.show()}else{d.intro_div.hide()}d.chrom_select.val(d.chrom);d.max_high=f.len-1;d.reset();d.redraw(true);for(var h=0,a=d.tracks.length;h<a;h++){var c=d.tracks[h];if(c.init){c.init()}}}if(b!==undefined&&g!==undefined){d.low=Math.max(b,0);d.high=Math.min(g,d.max_high)}d.reset_overview();d.redraw()}},go_to:function(f){var j=this,a,d,b=f.split(":"),h=b[0],i=b[1];if(i!==undefined){try{var g=i.split("-");a=parseInt(g[0].replace(/,/g,""),10);d=parseInt(g[1].replace(/,/g,""),10)}catch(c){return false}}j.change_chrom(h,a,d)},move_fraction:function(c){var a=this;var b=a.high-a.low;this.move_delta(c*b)},move_delta:function(c){var a=this;var b=a.high-a.low;if(a.low-c<a.max_low){a.low=a.max_low;a.high=a.max_low+b}else{if(a.high-c>a.max_high){a.high=a.max_high;a.low=a.max_high-b}else{a.high-=c;a.low-=c}}a.redraw()},add_track:function(a){a.view=this;a.track_id=this.track_id_counter;this.tracks.push(a);if(a.init){a.init()}a.container_div.attr("id","track_"+a.track_id);sortable(a.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(a){a.view=this;this.label_tracks.push(a)},remove_track:function(a){this.has_changes=true;a.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(a)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(h){var g=this.high-this.low,f=this.low,b=this.high;if(f<this.max_low){f=this.max_low}if(b>this.max_high){b=this.max_high}if(this.high!==0&&g<this.min_separation){b=f+this.min_separation}this.low=Math.floor(f);this.high=Math.ceil(b);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/200)/Math.LN10));this.zoom_res=Math.pow(FEATURE_LEVELS,Math.max(0,Math.ceil(Math.log(this.resolution,FEATURE_LEVELS)/Math.log(FEATURE_LEVELS))));var a=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var e=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var j=13;this.overview_box.css({left:a,width:Math.max(j,e)}).show();if(e<j){this.overview_box.css("left",a-(j-e)/2)}if(this.overview_highlight){this.overview_highlight.css({left:a,width:e})}this.update_location(this.low,this.high);if(!h){for(var c=0,d=this.tracks.length;c<d;c++){if(this.tracks[c]&&this.tracks[c].enabled){this.tracks[c].draw()}}for(c=0,d=this.label_tracks.length;c<d;c++){this.label_tracks[c].draw()}}},zoom_in:function(b,c){if(this.max_high===0||this.high-this.low<this.min_separation){return}var d=this.high-this.low,e=d/2+this.low,a=(d/this.zoom_factor)/2;if(b){e=b/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(e-a);this.high=Math.round(e+a);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var b=this.high-this.low,c=b/2+this.low,a=(b*this.zoom_factor)/2;this.low=Math.round(c-a);this.high=Math.round(c+a);this.redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.nav_container.width(this.container.width());this.redraw()},reset_overview:function(){this.overview_viewport.find("canvas").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide()}});var Tool=function(a,b){this.name=a;this.params=b};$.extend(Tool.prototype,{get_param_values_dict:function(){var b={};for(var a=0;a<this.params.length;a++){var c=this.params[a];b[c.name]=c.value}return b},get_param_values:function(){var b=[];for(var a=0;a<this.params.length;a++){b[a]=this.params[a].value}return b}});var NumberToolParameter=function(c,b,e,a,d){this.name=c;this.label=b;this.min=e;this.max=a;this.value=d};var get_tool_from_dict=function(f){if(obj_length(f)==0){return undefined}var b=f.name;var l=f.params;var c=Array();for(var e=0;e<l.length;e++){var g=l[e];var a=g.name,k=g.label,h=g.type,d=g.min,j=g.max,m=g.value;c[c.length]=new NumberToolParameter(a,k,d,j,m)}return new Tool(b,c)};var Filter=function(b,a,c){this.name=b;this.index=a;this.value=c};var NumberFilter=function(b,a){this.name=b;this.index=a;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.slider_min=Number.MAX_VALUE;this.slider_max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};$.extend(NumberFilter.prototype,{applies_to:function(a){if(a.length>this.index){return true}return false},keep:function(a){if(!this.applies_to(a)){return true}return(a[this.index]>=this.low&&a[this.index]<=this.high)},update_attrs:function(b){var a=false;if(!this.applies_to(b)){return a}if(b[this.index]<this.slider_min){this.slider_min=b[this.index];a=true}if(b[this.index]>this.slider_max){this.slider_max=b[this.index];a=false}return a},update_ui_elt:function(){var b=this.slider.slider("option","min"),a=this.slider.slider("option","max");if(this.slider_min<b||this.slider_max>a){this.slider.slider("option","min",this.slider_min);this.slider.slider("option","max",this.slider_max);this.slider.slider("option","values",[this.slider_min,this.slider_max])}}});var get_filters_from_dict=function(a){var g=[];for(var d=0;d<a.length;d++){var f=a[d];var c=f.name,e=f.type,b=f.index;if(e=="int"||e=="float"){g[d]=new NumberFilter(c,b)}else{g[d]=new Filter(c,b,e)}}return g};var TrackConfig=function(a){this.track=a.track;this.params=a.params;this.values={};if(a.saved_values){this.restore_values(a.saved_values)}this.onchange=a.onchange};$.extend(TrackConfig.prototype,{restore_values:function(a){var b=this;$.each(this.params,function(c,d){if(a[d.key]!==undefined){b.values[d.key]=a[d.key]}else{b.values[d.key]=d.default_value}})},build_form:function(){var b=this;var a=$("<div />");$.each(this.params,function(f,d){if(!d.hidden){var c="param_"+f;var k=$("<div class='form-row' />").appendTo(a);k.append($("<label />").attr("for",c).text(d.label+":"));if(d.type=="bool"){k.append($('<input type="checkbox" />').attr("id",c).attr("name",c).attr("checked",b.values[d.key]))}else{if(d.type=="color"){var h=b.values[d.key];var g=$("<input />").attr("id",c).attr("name",c).val(h);var i=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var e=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(i);var j=$("<div/>").appendTo(e).farbtastic({width:100,height:100,callback:g,color:h});$("<div />").append(g).append(i).appendTo(k).bind("click",function(l){i.css({left:$(this).position().left+($(g).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){i.hide();$(document).unbind("click.color-picker")});l.stopPropagation()})}else{k.append($("<input />").attr("id",c).attr("name",c).val(b.values[d.key]))}}}});return a},update_from_form:function(a){var c=this;var b=false;$.each(this.params,function(d,f){if(!f.hidden){var g="param_"+d;var e=a.find("#"+g).val();if(f.type=="float"){e=parseFloat(e)}else{if(f.type=="int"){e=parseInt(e)}else{if(f.type=="bool"){e=a.find("#"+g).is(":checked")}}}if(e!==c.values[f.key]){c.values[f.key]=e;b=true}}});if(b){this.onchange()}}});var Track=function(b,a,e,c,d){this.name=b;this.view=a;this.parent_element=e;this.data_url=(c?c:default_data_url);this.data_query_wait=(d?d:DEFAULT_DATA_QUERY_WAIT);this.dataset_check_url=converted_datasets_state_url;this.container_div=$("<div />").addClass("track").css("position","relative");if(!this.hidden){this.header_div=$("<div class='track-header' />").appendTo(this.container_div);if(this.view.editor){this.drag_div=$("<div class='draghandle' />").appendTo(this.header_div)}this.name_div=$("<div class='menubutton popup' />").appendTo(this.header_div);this.name_div.text(this.name);this.name_div.attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase())}this.content_div=$("<div class='track-content'>").appendTo(this.container_div);this.parent_element.append(this.container_div)};$.extend(Track.prototype,{init:function(){var a=this;a.enabled=false;a.data_queue={};a.tile_cache.clear();a.data_cache.clear();a.initial_canvas=undefined;a.content_div.css("height","auto");a.container_div.removeClass("nodata error pending");if(!a.dataset_id){return}if(a.view.chrom!=null){$.getJSON(converted_datasets_state_url,{hda_ldda:a.hda_ldda,dataset_id:a.dataset_id,chrom:a.view.chrom},function(b){if(!b||b==="error"||b.kind==="error"){a.container_div.addClass("error");a.content_div.text(DATA_ERROR);if(b.message){var d=a.view.tracks.indexOf(a);var c=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+b.message+"</pre>",{Close:hide_modal})});a.content_div.append(c)}}else{if(b==="no converter"){a.container_div.addClass("error");a.content_div.text(DATA_NOCONVERTER)}else{if(b==="no data"||(b.data!==undefined&&(b.data===null||b.data.length===0))){a.container_div.addClass("nodata");a.content_div.text(DATA_NONE)}else{if(b==="pending"){a.container_div.addClass("pending");a.content_div.text(DATA_PENDING);setTimeout(function(){a.init()},a.data_query_wait)}else{if(b.status==="data"){if(b.valid_chroms){a.valid_chroms=b.valid_chroms;a.name_div.data("menu_options")["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+a.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}a.content_div.text(DATA_OK);if(a.view.chrom){a.content_div.text("");a.content_div.css("height",a.height_px+"px");a.enabled=true;$.when(a.predraw_init()).done(function(){a.draw()})}}}}}}})}},predraw_init:function(){},update_name:function(a){this.old_name=this.name;this.name=a;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var TiledTrack=function(g,d,s){var o=this,j=o.view;this.filters=(g!==undefined?get_filters_from_dict(g):[]);this.tool=(d!==undefined?get_tool_from_dict(d):undefined);this.parent_track=s;this.child_tracks=[];if(o.hidden){return}if(this.parent_track){this.header_div.find(".draghandle").removeClass("draghandle").addClass("child-track-icon").addClass("icon-button");this.parent_element.addClass("child-track");this.tool=undefined}this.filtering_div=$("<div/>").addClass("track-filters").hide();this.header_div.after(this.filtering_div);this.filtering_div.bind("drag",function(i){i.stopPropagation()}).bind("dblclick",function(i){i.stopPropagation()});var t=$("<table class='filters'>").appendTo(this.filtering_div);$.each(this.filters,function(w,z){var v=$("<tr>").appendTo(t);var y=$("<th class='filter-info'>").appendTo(v);var u=$("<span class='name'>").appendTo(y);u.text(z.name+" ");var i=$("<span class='values'>").appendTo(y);var x=$("<td>").appendTo(v);z.control_element=$("<div id='"+z.name+"-filter-control' style='width: 200px; position: relative'>").appendTo(x);z.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(B,C){var A=C.values;i.text("["+A[0]+"-"+A[1]+"]");z.low=A[0];z.high=A[1];o.draw(true)},change:function(A,B){z.control_element.slider("option","slide").call(z.control_element,A,B)}});z.slider=z.control_element;z.slider_label=i});if(this.tool){this.dynamic_tool_div=$("<div/>").addClass("dynamic-tool").hide();this.header_div.after(this.dynamic_tool_div);this.dynamic_tool_div.bind("drag",function(i){i.stopPropagation()}).bind("click",function(i){i.stopPropagation()}).bind("dblclick",function(i){i.stopPropagation()});var l=$("<div class='tool-name'>").appendTo(this.dynamic_tool_div).text(this.tool.name);var e=this.tool.params;var o=this;$.each(this.tool.params,function(A,v){var y=$("<div>").addClass("param-row").appendTo(o.dynamic_tool_div);var x=$("<div>").addClass("slider-label").appendTo(y);var C=$("<span class='param-name'>").text(v.label+" ").appendTo(x);var w=$("<span/>").text(v.value);var z=$("<span class='param-value'>").appendTo(x).append("[").append(w).append("]");var B=$("<div/>").addClass("slider").appendTo(y);var i=$("<div id='"+v.name+"-param-control'>").appendTo(B);var u=(v.max<=1?0.01:(v.max<=1000?1:5));i.slider({min:v.min,max:v.max,step:u,value:v.value,slide:function(D,F){var E=F.value;v.value=E;if(0<E&&E<1){E=parseFloat(E).toFixed(2)}w.text(E)},change:function(D,E){v.value=E.value}});z.click(function(){var F=w,E=F.text(),D=(v.max<=1?4:v.max.length);F.text("");$("<input type='text'/>").attr("size",D).attr("maxlength",D).attr("value",E).appendTo(F).focus().select().click(function(G){G.stopPropagation()}).blur(function(){$(this).remove();F.text(E)}).keyup(function(I){if(I.keyCode===27){$(this).trigger("blur")}else{if(I.keyCode===13){var G=$(this),H=parseFloat(G.val());if(isNaN(H)||H>v.max||H<v.min){alert("Parameter value must be in the range ["+v.min+"-"+v.max+"]");return $(this)}F.text(H);i.slider("value",H);v.value=H}}})});$("<div style='clear: both;'/>").appendTo(y)});var b=$("<div>").addClass("param-row").appendTo(this.dynamic_tool_div);var n=$("<input type='submit'>").attr("value","Run").appendTo(b);var o=this;n.click(function(){o.run_tool()})}o.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();o.container_div.append(o.child_tracks_container);if(o.display_modes!==undefined){if(o.mode_div===undefined){o.mode_div=$("<div class='right-float menubutton popup' />").appendTo(o.header_div);var m=o.display_modes[0];o.mode=m;o.mode_div.text(m);var a=function(i){o.mode_div.text(i);o.mode=i;o.tile_cache.clear();o.draw()};var f={};for(var q=0,r=o.display_modes.length;q<r;q++){var k=o.display_modes[q];f[k]=function(i){return function(){a(i)}}(k)}make_popupmenu(o.mode_div,f)}else{o.mode_div.hide()}}var h={};h["Edit configuration"]=function(){var v=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},i=function(){o.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},u=function(w){if((w.keyCode||w.which)===27){v()}else{if((w.keyCode||w.which)===13){i()}}};$(window).bind("keypress.check_enter_esc",u);show_modal("Configure Track",o.track_config.build_form(),{Cancel:v,OK:i})};if(o.filters.length>0){h["Show filters"]=function(){var i;if(!o.filtering_div.is(":visible")){i="Hide filters";o.filters_visible=true}else{i="Show filters";o.filters_visible=false}o.filtering_div.toggle()}}if(o.tool){h["Toggle Tool"]=function(){var i;if(!o.dynamic_tool_div.is(":visible")){i="Hide dynamic tool";o.update_name(o.name+o.tool_region_and_parameters_str())}else{i="Show dynamic tool";o.revert_name()}o.dynamic_tool_div.toggle()}}var c=j;var p=function(){$("#no-tracks").show()};if(this.parent_track){c=this.parent_track;p=function(){}}h.Remove=function(){c.remove_track(o);if(c.num_tracks===0){p()}};o.popup_menu=make_popupmenu(o.name_div,h)};$.extend(TiledTrack.prototype,Track.prototype,{draw:function(b){var m=this.view.low,g=this.view.high,j=g-m,c=this.view.container.width(),f=this.view.resolution;var p=$("<div style='position: relative;'></div>"),r=c/j;this.content_div.append(p);this.max_height=0;var a=Math.floor(m/f/DENSITY);var l=0;while((a*DENSITY*f)<g){var n=c+"_"+r+"_"+a;var e=this.tile_cache.get(n);var k=a*DENSITY*this.view.resolution;var q=k+DENSITY*this.view.resolution;if(!b&&e){this.show_tile(e,p,k,r)}else{this.delayed_draw(b,n,k,q,a,f,p,r)}a+=1}var d=this;var o=setInterval(function(){if(l===0){var u=d.content_div.children();var t=false;for(var v=u.length-1,s=0;v>=s;v--){var x=$(u[v]);if(t){x.remove()}else{if(x.children().length!==0){t=true}}}for(var w=0;w<d.filters.length;w++){d.filters[w].update_ui_elt()}clearInterval(o)}},50);for(var h=0;h<this.child_tracks.length;h++){this.child_tracks[h].draw(b)}},delayed_draw:function(b,g,f,i,c,e,h,j){var d=this;var a=setTimeout(function(){if(f<=d.view.high&&i>=d.view.low){var k;if(!b){k=d.tile_cache.get(g)}if(!k){k=d.draw_tile(e,c,h,j);if(k){var l=$("<div class='track-tile'>").prepend(k);if(k.hasClass(FILTERABLE_CLASS)){l.addClass(FILTERABLE_CLASS)}k=l}}if(k){d.tile_cache.set(g,k);d.show_tile(k,h,f,j)}}},50)},show_tile:function(a,f,d,g){var b=this;var c=this.view.high-this.view.low,e=(d-this.view.low)*g;if(this.left_offset){e-=this.left_offset}a.css({position:"absolute",top:0,left:e,height:""});f.append(a);b.max_height=Math.max(b.max_height,a.height());b.content_div.css("height",b.max_height+"px");f.children().css("height",b.max_height+"px");if(b.hidden){return}if(a.hasClass(FILTERABLE_CLASS)){show_hide_popupmenu_options(b.popup_menu,"(Show|Hide) filters");if(b.filters_visible){b.filtering_div.show()}}else{show_hide_popupmenu_options(b.popup_menu,"(Show|Hide) filters",false);b.filtering_div.hide()}},set_overview:function(){var a=this.view;if(this.initial_canvas&&this.is_overview){a.overview_close.show();a.overview_viewport.append(this.initial_canvas);a.overview_highlight.show().height(this.initial_canvas.height());a.overview_viewport.height(this.initial_canvas.height()+a.overview_box.height())}$(window).trigger("resize")},run_tool:function(){var b={dataset_id:this.original_dataset_id,chrom:this.view.chrom,low:this.view.low,high:this.view.high,tool_id:this.tool.name};$.extend(b,this.tool.get_param_values_dict());var d=this,c=b.tool_id+d.tool_region_and_parameters_str(b.chrom,b.low,b.high),e;if(d.track_type=="FeatureTrack"){e=new ToolDataFeatureTrack(c,view,undefined,{},{},d)}this.add_track(e);e.content_div.text("Starting job.");view.has_changes=true;var a=function(){$.getJSON(run_tool_url,b,function(f){if(f=="no converter"){e.container_div.addClass("error");e.content_div.text(DATA_NOCONVERTER)}else{if(f.error){e.container_div.addClass("error");e.content_div.text(DATA_CANNOT_RUN_TOOL+f.message)}else{if(f=="pending"){e.container_div.addClass("pending");e.content_div.text("Converting input data so that it can be easily reused.");setTimeout(a,2000)}else{e.dataset_id=f.dataset_id;e.content_div.text("Running job.");e.init()}}}})};a()},tool_region_and_parameters_str:function(c,a,d){var b=this,e=(c!==undefined&&a!==undefined&&d!==undefined?c+":"+a+"-"+d:"all");return" - region=["+e+"], parameters=["+b.tool.get_param_values().join(", ")+"]"},add_track:function(a){a.track_id=this.track_id+"_"+this.child_tracks.length;a.container_div.attr("id","track_"+a.track_id);this.child_tracks_container.append(a.container_div);sortable(a.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(a)},remove_track:function(a){a.container_div.fadeOut("slow",function(){$(this).remove()})}});var LabelTrack=function(a,b){this.track_type="LabelTrack";this.hidden=true;Track.call(this,null,a,b);this.container_div.addClass("label-track")};$.extend(LabelTrack.prototype,Track.prototype,{draw:function(){var c=this.view,d=c.high-c.low,g=Math.floor(Math.pow(10,Math.floor(Math.log(d)/Math.log(10)))),a=Math.floor(c.low/g)*g,e=this.view.container.width(),b=$("<div style='position: relative; height: 1.3em;'></div>");while(a<c.high){var f=(a-c.low)/d*e;b.append($("<div class='label'>"+commatize(a)+"</div>").css({position:"absolute",left:f-1}));a+=g}this.content_div.children(":first").remove();this.content_div.append(b)}});var ReferenceTrack=function(a){this.track_type="ReferenceTrack";this.hidden=true;Track.call(this,null,a,a.top_labeltrack);TiledTrack.call(this);this.left_offset=200;this.height_px=12;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_queue={};this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE)};$.extend(ReferenceTrack.prototype,TiledTrack.prototype,{get_data:function(d,b){var c=this,a=b*DENSITY*d,f=(b+1)*DENSITY*d,e=d+"_"+b;if(!c.data_queue[e]){c.data_queue[e]=true;$.ajax({url:reference_url,dataType:"json",data:{chrom:this.view.chrom,low:a,high:f,dbkey:this.view.dbkey},success:function(g){c.data_cache.set(e,g);delete c.data_queue[e];c.draw()},error:function(h,g,i){console.log(h,g,i)}})}},draw_tile:function(f,b,k,o){var g=b*DENSITY*f,d=DENSITY*f,j=f+"_"+b;var e=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(e)}e=$(e);var n=e.get(0).getContext("2d");if(o>CHAR_WIDTH_PX){if(this.data_cache.get(j)===undefined){this.get_data(f,b);return}var m=this.data_cache.get(j);if(m===null){this.content_div.css("height","0px");return}e.get(0).width=Math.ceil(d*o+this.left_offset);e.get(0).height=this.height_px;for(var h=0,l=m.length;h<l;h++){var a=Math.round(h*o),i=Math.round(o/2);n.fillText(m[h],a+this.left_offset+i,10)}k.append(e);return e}this.content_div.css("height","0px")}});var LineTrack=function(e,c,f,a,d){var b=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";Track.call(this,e,c,c.viewport_container);TiledTrack.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=f;this.dataset_id=a;this.original_dataset_id=a;this.data_cache=new DataCache(CACHED_DATA);this.tile_cache=new Cache(CACHED_TILES_LINE);this.track_config=new TrackConfig({track:this,params:[{key:"color",label:"Color",type:"color",default_value:"black"},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.height_px,hidden:true}],saved_values:d,onchange:function(){b.vertical_range=b.prefs.max_value-b.prefs.min_value;$("#linetrack_"+b.track_id+"_minval").text(b.prefs.min_value);$("#linetrack_"+b.track_id+"_maxval").text(b.prefs.max_value);b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values;this.height_px=this.track_config.values.height;this.vertical_range=this.track_config.values.max_value-this.track_config.values.min_value;(function(g){var j=false;var i=false;var h=$("<div class='track-resize'>");$(g.container_div).hover(function(){j=true;h.show()},function(){j=false;if(!i){h.hide()}});h.hide().bind("dragstart",function(k,l){i=true;l.original_height=$(g.content_div).height()}).bind("drag",function(l,m){var k=Math.min(Math.max(m.original_height+m.deltaY,g.min_height_px),g.max_height_px);$(g.content_div).css("height",k);g.height_px=k;g.draw(true)}).bind("dragend",function(k,l){g.tile_cache.clear();i=false;if(!j){h.hide()}g.track_config.values.height=g.height_px}).appendTo(g.container_div)})(this)};$.extend(LineTrack.prototype,TiledTrack.prototype,{predraw_init:function(){var a=this,b=a.view.tracks.indexOf(a);a.vertical_range=undefined;return $.getJSON(a.data_url,{stats:true,chrom:a.view.chrom,low:null,high:null,hda_ldda:a.hda_ldda,dataset_id:a.dataset_id},function(c){a.container_div.addClass("line-track");var e=c.data;if(isNaN(parseFloat(a.prefs.min_value))||isNaN(parseFloat(a.prefs.max_value))){a.prefs.min_value=e.min;a.prefs.max_value=e.max;$("#track_"+b+"_minval").val(a.prefs.min_value);$("#track_"+b+"_maxval").val(a.prefs.max_value)}a.vertical_range=a.prefs.max_value-a.prefs.min_value;a.total_frequency=e.total_frequency;a.container_div.find(".yaxislabel").remove();var f=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_minval").text(round_1000(a.prefs.min_value));var d=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+b+"_maxval").text(round_1000(a.prefs.max_value));d.css({position:"absolute",top:"24px",left:"10px"});d.prependTo(a.container_div);f.css({position:"absolute",bottom:"2px",left:"10px"});f.prependTo(a.container_div)})},get_data:function(d,b){var c=this,a=b*DENSITY*d,f=(b+1)*DENSITY*d,e=d+"_"+b;if(!c.data_queue[e]){c.data_queue[e]=true;$.ajax({url:this.data_url,dataType:"json",data:{chrom:this.view.chrom,low:a,high:f,hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,resolution:this.view.resolution},success:function(g){var h=g.data;c.data_cache.set(e,h);delete c.data_queue[e];c.draw()},error:function(h,g,i){console.log(h,g,i)}})}},draw_tile:function(o,r,c,e){if(this.vertical_range===undefined){return}var s=r*DENSITY*o,a=DENSITY*o,x=o+"_"+r;var b=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(b)}b=$(b);if(this.data_cache.get(x)===undefined){this.get_data(o,r);return}var v=this.data_cache.get(x);if(!v){return}b.get(0).width=Math.ceil(a*e);b.get(0).height=this.height_px;var n=b.get(0).getContext("2d"),j=false,k=this.prefs.min_value,g=this.prefs.max_value,m=this.vertical_range,t=this.total_frequency,d=this.height_px,l=this.mode;var w=Math.round(d+k/m*d);n.beginPath();n.moveTo(0,w);n.lineTo(a*e,w);n.fillStyle="#aaa";n.stroke();n.beginPath();n.fillStyle=this.prefs.color;var u,h,f;if(v.length>1){f=Math.ceil((v[1][0]-v[0][0])*e)}else{f=10}for(var p=0,q=v.length;p<q;p++){u=Math.round((v[p][0]-s)*e);h=v[p][1];if(h===null){if(j&&l==="Filled"){n.lineTo(u,d)}j=false;continue}if(h<k){h=k}else{if(h>g){h=g}}if(l==="Histogram"){h=Math.round(h/m*d);n.fillRect(u,w,f,-h)}else{if(l==="Intensity"){h=255-Math.floor((h-k)/m*255);n.fillStyle="rgb("+h+","+h+","+h+")";n.fillRect(u,0,f,d)}else{h=Math.round(d-(h-k)/m*d);if(j){n.lineTo(u,h)}else{j=true;if(l==="Filled"){n.moveTo(u,d);n.lineTo(u,h)}else{n.moveTo(u,h)}}}}}if(l==="Filled"){if(j){n.lineTo(u,w);n.lineTo(0,w)}n.fill()}else{n.stroke()}return b}});var FeatureTrack=function(a,f,e,i,h,c,d,g){var b=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];Track.call(this,a,f,f.viewport_container);TiledTrack.call(this,c,d,g);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=e;this.dataset_id=i;this.original_dataset_id=i;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.default_font=DEFAULT_FONT;this.inc_slots={};this.data_queue={};this.start_end_dct={};this.tile_cache=new Cache(CACHED_TILES_FEATURE);this.data_cache=new DataCache(20);this.left_offset=200;this.track_config=new TrackConfig({track:this,params:[{key:"block_color",label:"Block color",type:"color",default_value:"#444"},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true}],saved_values:h,onchange:function(){b.tile_cache.clear();b.draw()}});this.prefs=this.track_config.values};$.extend(FeatureTrack.prototype,TiledTrack.prototype,{get_data:function(a,d){var b=this,c=a+"_"+d;if(!b.data_queue[c]){b.data_queue[c]=true;$.getJSON(b.data_url,{chrom:b.view.chrom,low:a,high:d,hda_ldda:b.hda_ldda,dataset_id:b.dataset_id,resolution:this.view.resolution,mode:this.mode},function(e){b.data_cache.set_data(a,d,b.mode,e);delete b.data_queue[c];b.draw()})}},incremental_slots:function(a,j,d,q){var r=this.inc_slots[a];if(!r||(r.mode!==q)){r={};r.w_scale=a;r.mode=q;this.inc_slots[a]=r;this.start_end_dct[a]={}}var m=r.w_scale,x=[],y=[],k=0,o=this.view.max_low;for(var v=0,w=j.length;v<w;v++){var h=j[v],l=h[0];if(r[l]!==undefined){k=Math.max(k,r[l]);y.push(r[l])}else{x.push(v)}}var e=this.start_end_dct[a];var n=function(D,E){for(var C=0;C<=MAX_FEATURE_DEPTH;C++){var A=false,F=e[C];if(F!==undefined){for(var z=0,B=F.length;z<B;z++){var i=F[z];if(E>i[0]&&D<i[1]){A=true;break}}}if(!A){return C}}return -1};for(var v=0,w=x.length;v<w;v++){var h=j[x[v]],l=h[0],t=h[1],b=h[2],p=h[3],c=Math.floor((t-o)*m),g=Math.ceil((b-o)*m),u=CONTEXT.measureText(p).width,f;if(p!==undefined&&!d){u+=(LABEL_SPACING+PACK_SPACING);if(c-u>=0){c-=u;f="left"}else{g+=u;f="right"}}var s=n(c,g);if(s>=0){if(e[s]===undefined){e[s]=[]}e[s].push([c,g]);r[l]=s;k=Math.max(k,s)}else{}}return k},rect_or_text:function(v,n,z,d,u,l,h,g){v.textAlign="center";var b=[z,d],q=0,w=0,t=Math.round(n/2);var E=[];for(var o=0,y=l.length;o<y;o++){var m=l[o],e="MIDNSHP=X"[m[0]],p=m[1];if(e==="H"||e==="S"){q-=p}var j=u+q,D=Math.floor(Math.max(0,(j-z)*n)),k=Math.floor(Math.max(0,(j+p-z)*n));switch(e){case"H":break;case"S":case"M":case"=":var r=compute_overlap([j,j+p],b);if(r!=NO_OVERLAP){var s=h.slice(w,w+p);if((this.mode==="Pack"||this.mode==="Auto")&&h!==undefined&&n>CHAR_WIDTH_PX){v.fillStyle=this.prefs.block_color;v.fillRect(D+this.left_offset,g+1,k-D,9);v.fillStyle=CONNECTOR_COLOR;for(var B=0,a=s.length;B<a;B++){if(j+B>=z&&j+B<=d){var C=Math.floor(Math.max(0,(j+B-z)*n));v.fillText(s[B],C+this.left_offset+t,g+9)}}}else{v.fillStyle=this.prefs.block_color;v.fillRect(D+this.left_offset,g+(this.mode!="Dense"?4:5),k-D,(this.mode!="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}w+=p;q+=p;break;case"N":v.fillStyle=CONNECTOR_COLOR;v.fillRect(D+this.left_offset,g+5,k-D,1);q+=p;break;case"D":v.fillStyle="red";v.fillRect(D+this.left_offset,g+4,k-D,3);q+=p;break;case"P":break;case"I":var r=compute_overlap([j,j+p],b);if(r!=NO_OVERLAP){var s=h.slice(w,w+p);var f=this.left_offset+D-(k-D)/2;if((this.mode==="Pack"||this.mode==="Auto")&&h!==undefined&&n>CHAR_WIDTH_PX){v.fillStyle="yellow";v.fillRect(f,g-9,k-D,9);E[E.length]=[f+(k-D)/2,g+4,5];v.fillStyle=CONNECTOR_COLOR;switch(r){case (OVERLAP_START):s=s.slice(z-j);break;case (OVERLAP_END):s=s.slice(0,j-d);break;case (CONTAINED_BY):break;case (CONTAINS):s=s.slice(z-j,j-d);break}for(var B=0,a=s.length;B<a;B++){var C=Math.floor(Math.max(0,(j+B-z)*n));v.fillText(s[B],C+this.left_offset+t-(k-D)/2,g)}}else{v.fillStyle="yellow";v.fillRect(f,g+(this.mode!="Dense"?2:5),k-D,(this.mode!="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}w+=p;break;case"X":w+=p;break}}var A;for(var x=0;x<E.length;x++){A=E[x];v.fillStyle="yellow";v.drawDownwardEquilateralTriangle(A[0],A[1],A[2])}},draw_tile:function(ae,m,q,au){var K=m*DENSITY*ae,aj=(m+1)*DENSITY*ae,J=aj-K;var G=this.data_cache.get_data(K,aj,this.mode);if(G===undefined||G==="pending"||(this.mode!=="Auto"&&G.dataset_type==="summary_tree")){this.data_queue[[K,aj]]=true;this.get_data(K,aj);return}var a=Math.ceil(J*au),ag=this.prefs.label_color,g=this.prefs.block_color,p=this.mode,u=25,aa,V=this.left_offset,at,B,av;var o=document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(o)}o=$(o);if(G.dataset_type==="summary_tree"){B=this.summary_draw_height}else{if(p==="Dense"){B=u;av=DENSE_TRACK_HEIGHT}else{if(p==="Squish"){av=SQUISH_TRACK_HEIGHT;aa=true}else{if(p==="Pack"){av=PACK_TRACK_HEIGHT;aa=false}else{if(G.extra_info==="no_detail"){av=(G.track_type==="bai"?SQUISH_TRACK_HEIGHT:NO_DETAIL_TRACK_HEIGHT);aa=true}else{av=PACK_TRACK_HEIGHT;aa=false}}}B=this.incremental_slots(au,G.data,aa,p)*av+u;at=this.inc_slots[au]}}o.get(0).width=a+V;o.get(0).height=B;if(G.dataset_type=="summary_tree"){o.get(0).height+=LABEL_SPACING+CHAR_HEIGHT_PX}q.parent().css("height",Math.max(this.height_px,B)+"px");var H=o.get(0).getContext("2d");H.fillStyle=g;H.font=this.default_font;H.textAlign="right";this.container_div.find(".yaxislabel").remove();if(G.dataset_type=="summary_tree"){var v=B+LABEL_SPACING+CHAR_HEIGHT_PX;points=G.data,max=G.max,delta_x_px=Math.ceil(G.delta*au);var n=$("<div />").addClass("yaxislabel");n.text(max);n.css({position:"absolute",top:"22px",left:"10px"});n.prependTo(this.container_div);for(var an=0,F=points.length;an<F;an++){var Z=Math.floor((points[an][0]-K)*au);var Y=points[an][1];if(!Y){continue}var ak=Y/max*B;H.fillStyle="black";H.fillRect(Z+V,v-ak,delta_x_px,ak);var X=4;if(this.prefs.show_counts&&(H.measureText(Y).width+X)<delta_x_px){H.fillStyle="#666";H.textAlign="center";H.fillText(Y,Z+V+(delta_x_px/2),10)}}return o}if(G.message){o.css({"border-color":"red"});H.fillStyle="red";H.textAlign="left";H.fillText(G.message,100+V,av);if(!G.data){return o}}for(var aq=0;aq<this.filters.length;aq++){if(G.data.length&&this.filters[aq].applies_to(G.data[0])){o.addClass(FILTERABLE_CLASS);break}}var ar=G.data;var am=0;for(var an=0,F=ar.length;an<F;an++){var R=ar[an],O=R[0],ap=R[1],ac=R[2],L=R[3];if(this.mode!="Dense"&&at[O]===undefined){continue}var ab=false;var T;for(var aq=0;aq<this.filters.length;aq++){T=this.filters[aq];T.update_attrs(R);if(!T.keep(R)){ab=true;break}}if(ab){continue}if(ap<=aj&&ac>=K){if(G.dataset_type=="interval_index"){ac-=1}var ad=Math.floor(Math.max(0,(ap-K)*au)),I=Math.ceil(Math.min(a,Math.max(0,(ac-K)*au))),W=(p==="Dense"?1:(1+at[O]))*av;var E,ah,M=null,aw=null;if(G.dataset_type==="bai"){H.fillStyle=g;if(R[5] instanceof Array){var C=Math.floor(Math.max(0,(R[4][0]-K)*au)),N=Math.ceil(Math.min(a,Math.max(0,(R[4][1]-K)*au))),A=Math.floor(Math.max(0,(R[5][0]-K)*au)),t=Math.ceil(Math.min(a,Math.max(0,(R[5][1]-K)*au)));if(R[4][1]>=K&&R[4][0]<=aj&&R[4][2]){this.rect_or_text(H,au,K,aj,R[4][0],R[4][2],R[4][3],W)}if(R[5][1]>=K&&R[5][0]<=aj&&R[5][2]){this.rect_or_text(H,au,K,aj,R[5][0],R[5][2],R[5][3],W)}if(A>N){H.fillStyle=CONNECTOR_COLOR;H.dashedLine(N+V,W+5,V+A,W+5)}}else{H.fillStyle=g;this.rect_or_text(H,au,K,aj,ap,R[4],R[5],W)}if(p!=="Dense"&&!aa&&ap>K){H.fillStyle=this.prefs.label_color;if(m===0&&ad-H.measureText(L).width<0){H.textAlign="left";H.fillText(L,I+V+LABEL_SPACING,W+8)}else{H.textAlign="right";H.fillText(L,ad+V-LABEL_SPACING,W+8)}H.fillStyle=g}}else{if(G.dataset_type==="interval_index"){if(p=="Auto"){if(R.length<=4){p="Squish"}else{p="Pack"}}if(p=="Dense"){H.fillStyle=g;H.fillRect(ad+V,W+5,I-ad,DENSE_FEATURE_HEIGHT)}else{if(R.length<=4){H.fillStyle=g;H.fillRect(ad+V,W+5,I-ad,DENSE_FEATURE_HEIGHT)}else{var D=R[5],U=R[6],af=R[7],e=R[8];if(U&&af){M=Math.floor(Math.max(0,(U-K)*au));aw=Math.ceil(Math.min(a,Math.max(0,(af-K)*au)))}var ao,P;if(p=="Squish"){ao=1;P=SQUISH_FEATURE_HEIGHT}else{ao=5;P=PACK_FEATURE_HEIGHT}if(!e){if(R.strand){if(R.strand=="+"){H.fillStyle=RIGHT_STRAND_INV}else{if(R.strand=="-"){H.fillStyle=LEFT_STRAND_INV}}}else{H.fillStyle=CONNECTOR_COLOR}H.fillRect(ad+V,W+(P-ao)/2+1,I-ad,P)}else{var z,Q;if(p=="Squish"){H.fillStyle=CONNECTOR_COLOR;z=W+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;Q=1}else{if(D){var z=W;var Q=P;if(D=="+"){H.fillStyle=RIGHT_STRAND}else{if(D=="-"){H.fillStyle=LEFT_STRAND}}}else{H.fillStyle=CONNECTOR_COLOR;z+=(SQUISH_FEATURE_HEIGHT/2)+1;Q=1}}H.fillRect(ad+V,z,I-ad,Q);for(var al=0,d=e.length;al<d;al++){var s=e[al],c=Math.floor(Math.max(0,(s[0]-K)*au)),S=Math.ceil(Math.min(a,Math.max((s[1]-K)*au)));if(c>S){continue}H.fillStyle=g;H.fillRect(c+V,W+(P-ao)/2+1,S-c,ao);if(M!==undefined&&!(c>aw||S<M)){var ai=Math.max(c,M),w=Math.min(S,aw-1);H.fillRect(ai+V,W+1,w-ai,P)}}}if(p=="Pack"&&ap>K){H.fillStyle=ag;if(m===0&&ad-H.measureText(L).width<0){H.textAlign="left";H.fillText(L,I+V+LABEL_SPACING,W+8)}else{H.textAlign="right";H.fillText(L,ad+V-LABEL_SPACING,W+8)}H.fillStyle=g}}}}else{if(G.dataset_type==="vcf"){if(aa){H.fillStyle=g;H.fillRect(ad+V,W+5,I-ad,1)}else{var r=R[4],l=R[5],b=R[6];E=9;ah=1;H.fillRect(ad+V,W,I-ad,E);if(p!=="Dense"&&L!==undefined&&ap>K){H.fillStyle=ag;if(m===0&&ad-H.measureText(L).width<0){H.textAlign="left";H.fillText(L,I+2+V,W+8)}else{H.textAlign="right";H.fillText(L,ad-2+V,W+8)}H.fillStyle=g}var h=r+" / "+l;if(ap>K&&H.measureText(h).width<(I-ad)){H.fillStyle="white";H.textAlign="center";H.fillText(h,V+ad+(I-ad)/2,W+8);H.fillStyle=g}}}}}am++}}return o}});var ReadTrack=function(d,b,f,a,c,e){FeatureTrack.call(this,d,b,f,a,c,e);this.track_type="ReadTrack"};$.extend(ReadTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{});var ToolDataFeatureTrack=function(e,c,g,a,d,f,b){FeatureTrack.call(this,e,c,g,a,d,f,{},b);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};$.extend(ToolDataFeatureTrack.prototype,TiledTrack.prototype,FeatureTrack.prototype,{predraw_init:function(){var b=this;var a=function(){if(b.data_cache.size()==0){setTimeout(a,300)}else{b.data_url=default_data_url;b.data_query_wait=DEFAULT_DATA_QUERY_WAIT;b.dataset_state_url=converted_datasets_state_url;$.getJSON(b.dataset_state_url,{dataset_id:b.dataset_id},function(c){})}};a()}});
\ No newline at end of file
--- a/static/scripts/trackster.js Mon Feb 21 09:46:54 2011 -0500
+++ b/static/scripts/trackster.js Mon Feb 21 11:49:24 2011 -0500
@@ -24,6 +24,29 @@
}
};
+/**
+ * Draw an isosceles triangle that points down.
+ */
+CanvasRenderingContext2D.prototype.drawDownwardEquilateralTriangle = function(down_vertex_x, down_vertex_y, side_len) {
+ // Compute other two points of triangle.
+ var
+ x1 = down_vertex_x - side_len/2,
+ x2 = down_vertex_x + side_len/2,
+ y = down_vertex_y - Math.sqrt( side_len*3/2 );
+
+ // Draw and fill.
+ this.beginPath();
+ this.moveTo(x1, y);
+ this.lineTo(x2, y);
+ this.lineTo(down_vertex_x, down_vertex_y);
+ this.lineTo(x1, y);
+
+ this.strokeStyle = this.fillStyle;
+ this.fill();
+ this.stroke();
+ this.closePath();
+}
+
/**
* Make `element` sortable in parent by dragging `handle` (a selector)
*/
@@ -51,7 +74,49 @@
});
}
+/**
+ * Compute the type of overlap between two regions. They are assumed to be on the same chrom/contig.
+ * The overlap is computed relative to the second region; hence, OVERLAP_START indicates that the first
+ * region overlaps the start (but not the end) of the second region.
+ */
+var NO_OVERLAP = 1001, CONTAINS = 1002, OVERLAP_START = 1003, OVERLAP_END = 1004, CONTAINED_BY = 1005;
+function compute_overlap(first_region, second_region) {
+ var
+ first_start = first_region[0], first_end = first_region[1],
+ second_start = second_region[0], second_end = second_region[1],
+ overlap;
+ if (first_start < second_start) {
+ if (first_end < second_start) {
+ overlap = NO_OVERLAP;
+ }
+ else if (first_end <= second_end) {
+ overlap = OVERLAP_START;
+ }
+ else { // first_end > second_end
+ overlap = CONTAINS;
+ }
+ }
+ else { // first_start >= second_start
+ if (first_start > second_end) {
+ overlap = NO_OVERLAP;
+ }
+ else if (first_end <= second_end) {
+ overlap = CONTAINED_BY;
+ }
+ else {
+ overlap = OVERLAP_END;
+ }
+ }
+
+ return overlap;
+}
+/**
+ * Returns true if there is any overlap between regions.
+ */
+function is_overlap(first_region, second_region) {
+ return (compute_overlap(first_region, second_region) != NO_OVERLAP);
+}
/**
* Init constants & functions used throughout trackster.
@@ -2192,11 +2257,18 @@
return highest_slot;
},
// Right now this function is used only for rendering BAM reads.
- rect_or_text: function( ctx, w_scale, tile_low, tile_high, feature_start, cigar, orig_seq, y_center ) {
+ rect_or_text: function(ctx, w_scale, tile_low, tile_high, feature_start, cigar, orig_seq, y_center) {
ctx.textAlign = "center";
- var draw_offset = 0,
+ var
+ tile_region = [tile_low, tile_high],
+ base_offset = 0,
seq_offset = 0,
gap = Math.round(w_scale / 2);
+
+ // Keep list of triangles that need to be drawn on top of initial drawing layer.
+ // TODO: Eventually, we'll probably want to keep an ordered list of items to draw and then draw all
+ // items at once.
+ var draw_last = [];
for (var cig_id = 0, len = cigar.length; cig_id < len; cig_id++) {
var cig = cigar[cig_id],
@@ -2205,69 +2277,135 @@
if (cig_op === "H" || cig_op === "S") {
// Go left if it clips
- draw_offset -= cig_len;
+ base_offset -= cig_len;
}
- var seq_start = feature_start + draw_offset,
+ var seq_start = feature_start + base_offset,
s_start = Math.floor( Math.max(0, (seq_start - tile_low) * w_scale) ),
s_end = Math.floor( Math.max(0, (seq_start + cig_len - tile_low) * w_scale) );
switch (cig_op) {
- case "H": // Hard clipping
+ case "H": // Hard clipping.
// TODO: draw anything?
// Sequence not present, so do not increment seq_offset.
break;
- case "S": // Soft clipping
- case "M": // Match
- case "=":
- var seq = orig_seq.slice(seq_offset, seq_offset + cig_len);
- if ( (this.mode === "Pack" || this.mode === "Auto") && orig_seq !== undefined && w_scale > CHAR_WIDTH_PX) {
- ctx.fillStyle = this.prefs.block_color;
- ctx.fillRect(s_start + this.left_offset, y_center + 1, s_end - s_start, 9);
- ctx.fillStyle = CONNECTOR_COLOR;
- for (var c = 0, str_len = seq.length; c < str_len; c++) {
- if (seq_start + c >= tile_low && seq_start + c <= tile_high) {
- var c_start = Math.floor( Math.max(0, (seq_start + c - tile_low) * w_scale) );
- ctx.fillText(seq[c], c_start + this.left_offset + gap, y_center + 9);
+ case "S": // Soft clipping.
+ case "M": // Match.
+ case "=": // Equals.
+ var seq_tile_overlap = compute_overlap([seq_start, seq_start + cig_len], tile_region);
+ if (seq_tile_overlap != NO_OVERLAP) {
+ // Draw.
+ var seq = orig_seq.slice(seq_offset, seq_offset + cig_len);
+ if ( (this.mode === "Pack" || this.mode === "Auto") && orig_seq !== undefined && w_scale > CHAR_WIDTH_PX) {
+ ctx.fillStyle = this.prefs.block_color;
+ ctx.fillRect(s_start + this.left_offset, y_center + 1, s_end - s_start, 9);
+ ctx.fillStyle = CONNECTOR_COLOR;
+ // TODO: this can be made much more efficient by computing the complete sequence
+ // to draw and then drawing it.
+ for (var c = 0, str_len = seq.length; c < str_len; c++) {
+ if (seq_start + c >= tile_low && seq_start + c <= tile_high) {
+ var c_start = Math.floor( Math.max(0, (seq_start + c - tile_low) * w_scale) );
+ ctx.fillText(seq[c], c_start + this.left_offset + gap, y_center + 9);
+ }
}
+ } else {
+ ctx.fillStyle = this.prefs.block_color;
+ // TODO: This is a pretty hack-ish way to fill rectangle based on mode.
+ ctx.fillRect(s_start + this.left_offset,
+ y_center + (this.mode != "Dense" ? 4 : 5),
+ s_end - s_start,
+ (this.mode != "Dense" ? SQUISH_FEATURE_HEIGHT : DENSE_FEATURE_HEIGHT) );
}
- } else {
- ctx.fillStyle = this.prefs.block_color;
- // TODO: This is a pretty hack-ish way to fill rectangle based on mode.
- ctx.fillRect(s_start + this.left_offset,
- y_center + (this.mode != "Dense" ? 4 : 5),
- s_end - s_start,
- (this.mode != "Dense" ? SQUISH_FEATURE_HEIGHT : DENSE_FEATURE_HEIGHT) );
}
seq_offset += cig_len;
+ base_offset += cig_len;
break;
- case "N": // Skipped bases
+ case "N": // Skipped bases.
ctx.fillStyle = CONNECTOR_COLOR;
ctx.fillRect(s_start + this.left_offset, y_center + 5, s_end - s_start, 1);
//ctx.dashedLine(s_start + this.left_offset, y_center + 5, this.left_offset + s_end, y_center + 5);
+ // No change in seq_offset because sequence not used when skipping.
+ base_offset += cig_len;
break;
- case "D": // Deletion
+ case "D": // Deletion.
ctx.fillStyle = "red";
ctx.fillRect(s_start + this.left_offset, y_center + 4, s_end - s_start, 3);
+ // TODO: is this true? No change in seq_offset because sequence not used when skipping.
+ base_offset += cig_len;
break;
case "P": // TODO: No good way to draw insertions/padding right now, so ignore
// Sequences not present, so do not increment seq_offset.
break;
- case "I":
+ case "I": // Insertion.
+ //
+ // Show insertion above, centered on insertion point.
+ //
+
+ // Check to see if sequence should be drawn at all by looking at the overlap between
+ // the sequence region and the tile region.
+ var seq_tile_overlap = compute_overlap([seq_start, seq_start + cig_len], tile_region);
+ if (seq_tile_overlap != NO_OVERLAP) {
+ // Draw sequence.
+ var seq = orig_seq.slice(seq_offset, seq_offset + cig_len);
+ // X center is offset + start - <half_sequence_length>
+ var x_center = this.left_offset + s_start - (s_end - s_start)/2;
+ if ( (this.mode === "Pack" || this.mode === "Auto") && orig_seq !== undefined && w_scale > CHAR_WIDTH_PX) {
+ // Draw sequence container.
+ ctx.fillStyle = "yellow";
+ ctx.fillRect(x_center, y_center - 9, s_end - s_start, 9);
+ draw_last[draw_last.length] = [x_center + (s_end - s_start)/2, y_center + 4, 5];
+ ctx.fillStyle = CONNECTOR_COLOR;
+ // Based on overlap b/t sequence and tile, get sequence to be drawn.
+ switch(seq_tile_overlap) {
+ case(OVERLAP_START):
+ seq = seq.slice(tile_low-seq_start);
+ break;
+ case(OVERLAP_END):
+ seq = seq.slice(0, seq_start-tile_high);
+ break;
+ case(CONTAINED_BY):
+ // All of sequence drawn.
+ break;
+ case(CONTAINS):
+ seq = seq.slice(tile_low-seq_start, seq_start-tile_high);
+ break;
+ }
+ // Draw sequence.
+ for (var c = 0, str_len = seq.length; c < str_len; c++) {
+ var c_start = Math.floor( Math.max(0, (seq_start + c - tile_low) * w_scale) );
+ ctx.fillText(seq[c], c_start + this.left_offset + gap - (s_end - s_start)/2, y_center);
+ }
+ }
+ else {
+ // Draw block.
+ ctx.fillStyle = "yellow";
+ // TODO: This is a pretty hack-ish way to fill rectangle based on mode.
+ ctx.fillRect(x_center, y_center + (this.mode != "Dense" ? 2 : 5),
+ s_end - s_start, (this.mode != "Dense" ? SQUISH_FEATURE_HEIGHT : DENSE_FEATURE_HEIGHT));
+ }
+ }
seq_offset += cig_len;
+ // No change to base offset because insertions are drawn above sequence/read.
break;
case "X":
// TODO: draw something?
seq_offset += cig_len;
break;
}
- draw_offset += cig_len;
+ }
+
+ // Draw last items.
+ var item;
+ for (var i = 0; i < draw_last.length; i++) {
+ item = draw_last[i];
+ ctx.fillStyle = "yellow";
+ ctx.drawDownwardEquilateralTriangle(item[0], item[1], item[2]);
}
},
draw_tile: function(resolution, tile_index, parent_element, w_scale) {
var tile_low = tile_index * DENSITY * resolution,
tile_high = ( tile_index + 1 ) * DENSITY * resolution,
tile_span = tile_high - tile_low;
- // console.log("drawing " + tile_low + " to " + tile_high);
+ //console.log("drawing " + tile_low + " to " + tile_high);
/*for (var k in this.data_cache.obj_cache) {
var k_split = k.split("_"), k_low = k_split[0], k_high = k_split[1];
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Don't use 'python -ES' when scrambling eggs due to '-S' breaking virtualenv.
by Bitbucket 21 Feb '11
by Bitbucket 21 Feb '11
21 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/2c9ce797953d/
changeset: r5096:2c9ce797953d
user: natefoo
date: 2011-02-21 15:46:54
summary: Don't use 'python -ES' when scrambling eggs due to '-S' breaking virtualenv.
affected #: 1 file (4 bytes)
--- a/lib/galaxy/eggs/scramble.py Fri Feb 18 17:47:07 2011 -0500
+++ b/lib/galaxy/eggs/scramble.py Mon Feb 21 09:46:54 2011 -0500
@@ -193,7 +193,7 @@
def run_scramble_script( self ):
log.warning( "%s(): Beginning build" % sys._getframe().f_code.co_name )
# subprocessed to sterilize the env
- cmd = "%s -ES %s" % ( self.python, "scramble.py" )
+ cmd = "%s %s" % ( self.python, "scramble.py" )
log.debug( '%s(): Executing in %s:' % ( sys._getframe().f_code.co_name, self.buildpath ) )
log.debug( ' %s' % cmd )
p = subprocess.Popen( args = cmd, shell = True, cwd = self.buildpath )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/040d6f59f464/
changeset: r5095:040d6f59f464
user: kanwei
date: 2011-02-18 23:47:07
summary: Update distutils egg to 0.7, and use the provided HTML output writer to do rst->html conversion. Remove old code that previously did this. This fixes a bug where an extra "</div>" was appended after every output, resulting in the tool config not showing in workflows, in IE.
affected #: 5 files (115 bytes)
--- a/eggs.ini Fri Feb 18 16:21:11 2011 -0500
+++ b/eggs.ini Fri Feb 18 17:47:07 2011 -0500
@@ -32,7 +32,7 @@
amqplib = 0.6.1
Beaker = 1.4
decorator = 3.1.2
-docutils = 0.4
+docutils = 0.7
drmaa = 0.4b3
elementtree = 1.2.6_20050316
GeneTrack = 2.0.0_beta_1
--- a/lib/galaxy/util/__init__.py Fri Feb 18 16:21:11 2011 -0500
+++ b/lib/galaxy/util/__init__.py Fri Feb 18 17:47:07 2011 -0500
@@ -19,7 +19,7 @@
pkg_resources.require( 'docutils' )
import docutils.core
-from galaxy.util.docutils_ext.htmlfrag import Writer as HTMLFragWriter
+import docutils.writers.html4css1
pkg_resources.require( 'elementtree' )
from elementtree import ElementTree, ElementInclude
@@ -252,7 +252,9 @@
def write( self, str ):
if len( str ) > 0 and not str.isspace():
log.warn( str )
- return docutils.core.publish_string( s, writer=HTMLFragWriter(), settings_overrides=dict( warning_stream=FakeStream() ) )
+ return docutils.core.publish_string(s,
+ writer=docutils.writers.html4css1.Writer(),
+ settings_overrides={"embed_stylesheet": False, "template": os.path.join(os.path.dirname(__file__), "docutils_template.txt"), "warning_stream": FakeStream()})
def xml_text(root, name=None):
"""Returns the text inside an element"""
--- a/lib/galaxy/util/docutils_ext/htmlfrag.py Fri Feb 18 16:21:11 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,137 +0,0 @@
-# Author: Ollie Rutherfurd
-# Contact: oliver(a)rutherfurd.net
-# Revision: $Revision: 2884 $
-# Date: $Date: 2004-12-08 20:49:05 +0100 (Wed, 08 Dec 2004) $
-# Copyright: This module has been placed in the public domain.
-
-"""
-Simple .ht (HyperText Template) document tree Writer.
-
-.ht tmeplate files are essentially normal HTML, with
-an option set of RFC 2822-like headers at the top of
-the file. There must be at least one blank line between
-the last header and the start of the body HTML.
-
-See http://ht2html.sf.net/ for more information on
-.ht files and ht2html..
-"""
-
-__docformat__ = 'reStructuredText'
-
-import os
-from docutils import nodes
-from docutils import writers
-from docutils import frontend
-from docutils.writers.html4css1 import HTMLTranslator, utils
-
-
-class Writer(writers.Writer):
-
- supported = ('htmlfrag',)
- """Formats this writer supports."""
-
- settings_spec = (
- 'HTML-Specific Options',
- None,
- (('Specify a stylesheet URL, used verbatim. Default is '
- '"default.css". Overrides --stylesheet-path.',
- ['--stylesheet'],
- {'default': 'default.css', 'metavar': '<URL>',
- 'overrides': 'stylesheet_path'}),
- ('Specify a stylesheet file, relative to the current working '
- 'directory. The path is adjusted relative to the output HTML '
- 'file. Overrides --stylesheet.',
- ['--stylesheet-path'],
- {'metavar': '<file>', 'overrides': 'stylesheet'}),
- ('Link to the stylesheet in the output HTML file. This is the '
- 'default.',
- ['--link-stylesheet'],
- {'dest': 'embed_stylesheet', 'action': 'store_false',
- 'validator': frontend.validate_boolean}),
- ('Embed the stylesheet in the output HTML file. The stylesheet '
- 'file must be accessible during processing (--stylesheet-path is '
- 'recommended). Default: link the stylesheet, do not embed it.',
- ['--embed-stylesheet'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),
- ('Specify the initial header level. Default is 1 for "<h1>". '
- 'Does not affect document title & subtitle (see --no-doc-title).',
- ['--initial-header-level'],
- {'choices': '1 2 3 4 5 6'.split(), 'default': '3',
- 'metavar': '<level>'}),
- ('Specify the maximum width (in characters) for one-column field '
- 'names. Longer field names will span an entire row of the table '
- 'used to render the field list. Default is 14 characters. '
- 'Use 0 for "no limit".',
- ['--field-name-limit'],
- {'default': 14, 'metavar': '<level>',
- 'validator': frontend.validate_nonnegative_int}),
- ('Specify the maximum width (in characters) for options in option '
- 'lists. Longer options will span an entire row of the table used '
- 'to render the option list. Default is 14 characters. '
- 'Use 0 for "no limit".',
- ['--option-limit'],
- {'default': 14, 'metavar': '<level>',
- 'validator': frontend.validate_nonnegative_int}),
- ('Format for footnote references: one of "superscript" or '
- '"brackets". Default is "brackets".',
- ['--footnote-references'],
- {'choices': ['superscript', 'brackets'], 'default': 'brackets',
- 'metavar': '<format>',
- 'overrides': 'trim_footnote_reference_space'}),
- ('Format for block quote attributions: one of "dash" (em-dash '
- 'prefix), "parentheses"/"parens", or "none". Default is "dash".',
- ['--attribution'],
- {'choices': ['dash', 'parentheses', 'parens', 'none'],
- 'default': 'dash', 'metavar': '<format>'}),
- ('Remove extra vertical whitespace between items of bullet lists '
- 'and enumerated lists, when list items are "simple" (i.e., all '
- 'items each contain one paragraph and/or one "simple" sublist '
- 'only). Default: enabled.',
- ['--compact-lists'],
- {'default': 1, 'action': 'store_true',
- 'validator': frontend.validate_boolean}),
- ('Disable compact simple bullet and enumerated lists.',
- ['--no-compact-lists'],
- {'dest': 'compact_lists', 'action': 'store_false'}),
- ('Omit the XML declaration. Use with caution.',
- ['--no-xml-declaration'],
- {'dest': 'xml_declaration', 'default': 1, 'action': 'store_false',
- 'validator': frontend.validate_boolean}),
- ('Scramble email addresses to confuse harvesters. '
- 'For example, "abc(a)example.org" will become '
- '``<a href="mailto:%61%62%63%40...">abc at example dot org</a>``.',
- ['--cloak-email-addresses'],
- {'action': 'store_true', 'validator': frontend.validate_boolean}),))
-
-
- relative_path_settings = ('stylesheet_path',)
-
- output = None
-
- def __init__(self):
- writers.Writer.__init__(self)
- self.translator_class = HTMLFragTranslator
-
- def translate(self):
- visitor = self.translator_class(self.document)
- self.document.walkabout(visitor)
- self.output = visitor.astext()
- self.stylesheet = visitor.stylesheet
- self.body = visitor.body
-
-
-class HTMLFragTranslator(HTMLTranslator):
-
- def __init__(self, document):
- # I don't believe we can embed any style content
- # the header, so always link to the stylesheet.
- document.settings.embed_stylesheet = 0
- HTMLTranslator.__init__(self, document)
-
- def astext(self):
- # kludge! want footer, but not '</body></html>'
- body = self.body_pre_docinfo + self.docinfo + self.body + \
- self.body_suffix[:-1]
- return ''.join(body)
-
-# :indentSize=4:lineSeparator=\n:noTabs=true:tabSize=4:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/751b80f0bbf4/
changeset: r5094:751b80f0bbf4
user: natefoo
date: 2011-02-18 22:21:11
summary: Fix for 3 of the 4 failing upload tests.
affected #: 1 file (3 bytes)
--- a/test/functional/test_get_data.py Fri Feb 18 15:06:34 2011 -0500
+++ b/test/functional/test_get_data.py Fri Feb 18 16:21:11 2011 -0500
@@ -228,7 +228,7 @@
hda = get_latest_hda()
assert hda is not None, "Problem retrieving hda from database"
self.verify_dataset_correctness( 'qualscores.qualsolid', hid=str( hda.hid ) )
- self.check_history_for_string( '48 lines, format: <span class="qualsolid">qualsolid</span>, database: \? Info: uploaded file' )
+ self.check_history_for_string( '48 lines format: <span class="qualsolid">qualsolid</span>, database: \? Info: uploaded file' )
self.check_metadata_for_string( 'Change data type value="qualsolid" selected="yes">qualsolid' )
self.delete_history( id=self.security.encode_id( history.id ) )
def test_0090_upload_file( self ):
@@ -240,7 +240,7 @@
hda = get_latest_hda()
assert hda is not None, "Problem retrieving hda from database"
self.verify_dataset_correctness( 'qualscores.qual454', hid=str( hda.hid ) )
- self.check_history_for_string( '49 lines, format: <span class="qual454">qual454</span>, database: \?' )
+ self.check_history_for_string( '49 lines format: <span class="qual454">qual454</span>, database: \?' )
self.check_metadata_for_string( 'Change data type value="qual454" selected="yes">qual454' )
self.delete_history( id=self.security.encode_id( history.id ) )
def test_0095_upload_file( self ):
@@ -357,7 +357,7 @@
hda = get_latest_hda()
assert hda is not None, "Problem retrieving hda from database"
self.verify_dataset_correctness( 'shrimp_cs_test1.csfasta', hid=str( hda.hid ) )
- self.check_history_for_string( '2,500 sequences, format: <span class="csfasta">csfasta</span>, <td>>2_14_26_F3,-1282216.0</td>' )
+ self.check_history_for_string( '2,500 sequences format: <span class="csfasta">csfasta</span>, <td>>2_14_26_F3,-1282216.0</td>' )
self.check_metadata_for_string( 'value="shrimp_cs_test1.csfasta" value="\?" Change data type value="csfasta" selected="yes"' )
self.delete_history( id=self.security.encode_id( history.id ) )
def test_0140_upload_file( self ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Feb '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/1dfad17e81a8/
changeset: r5093:1dfad17e81a8
user: kanwei
date: 2011-02-18 21:06:34
summary: Use jStorage (http://www.jstorage.info/) instead of jStore. Tested to be working on IE7 and IE8, where the latter was failing. Fixes links not showing up in history pane to expand histories.
affected #: 15 files (779 bytes)
--- a/static/scripts/class.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,80 +0,0 @@
-/*!
- * Class definition
- *
- * Copyright (c) 2008 John Resig (http://ejohn.org/blog/simple-javascript-inheritance/)
- * Inspired by base2 and Prototype
- */
-
-//"use strict";
-
-(function () {
-
- var initializing = false,
-
- fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
-
- // The base Class implementation (does nothing)
- this.Class = function(){};
-
- // Create a new Class that inherits from this class
- Class.extend = function (prop)
- {
- var _super = this.prototype;
-
- // Instantiate a base class (but only create the instance, don't run the init constructor)
- initializing = true;
-
- var prototype = new this();
-
- initializing = false;
-
- // Copy the properties over onto the new prototype
- for (var name in prop)
- {
-
- // Check if we're overwriting an existing function
- prototype[name] = (typeof prop[name] === "function" && typeof _super[name] === "function" && fnTest.test(prop[name]) ?
-
- (function(name, fn)
- {
- return function()
- {
- var tmp = this._super;
-
- // Add a new ._super() method that is the same method
- // but on the super-class
- this._super = _super[name];
-
- // The method only need to be bound temporarily, so we
- // remove it when we're done executing
- var ret = fn.apply(this, arguments);
- this._super = tmp;
-
- return ret;
- };
- }(name, prop[name])) : prop[name]);
- }
-
- // The dummy class constructor
- function Class()
- {
- // All construction is actually done in the init method
- if (!initializing && this.init)
- {
- this.init.apply(this, arguments);
- }
- }
-
- // Populate our constructed prototype object
- Class.prototype = prototype;
-
- // Enforce the constructor to be what we expect
- Class.constructor = Class;
-
- // And make this class extendable
- Class.extend = arguments.callee;
-
- return Class;
- };
-
-}());
--- a/static/scripts/galaxy.base.js Fri Feb 18 14:53:35 2011 -0500
+++ b/static/scripts/galaxy.base.js Fri Feb 18 15:06:34 2011 -0500
@@ -424,7 +424,7 @@
var action = function() {
// Load saved state and show as necessary
try {
- var stored = $.jStore.store("history_expand_state");
+ var stored = $.jStorage.get("history_expand_state");
if (stored) {
for (var id in stored) {
$("#" + id + " div.historyItemBody" ).show();
@@ -432,7 +432,7 @@
}
} catch(err) {
// Something was wrong with values in storage, so clear storage
- $.jStore.remove("history_expand_state");
+ $.jStorage.deleteKey("history_expand_state");
}
// If Mozilla, hide scrollbars in hidden items since they cause animation bugs
@@ -455,10 +455,10 @@
if (!nochanges) { // Ignore embedded item actions
// Save setting
- prefs = $.jStore.store("history_expand_state");
+ prefs = $.jStorage.get("history_expand_state");
if (prefs) {
delete prefs[id];
- $.jStore.store("history_expand_state", prefs);
+ $.jStorage.set("history_expand_state", prefs);
}
}
} else {
@@ -469,10 +469,10 @@
if (!nochanges) {
// Save setting
- prefs = $.jStore.store("history_expand_state");
- if (prefs === undefined) { prefs = {}; }
+ prefs = $.jStorage.get("history_expand_state");
+ if (!prefs) { prefs = {}; }
prefs[id] = true;
- $.jStore.store("history_expand_state", prefs);
+ $.jStorage.set("history_expand_state", prefs);
}
}
return false;
@@ -481,8 +481,8 @@
// Generate 'collapse all' link
$("#top-links > a.toggle").click( function() {
- var prefs = $.jStore.store("history_expand_state");
- if (prefs === undefined) { prefs = {}; }
+ var prefs = $.jStorage.get("history_expand_state");
+ if (!prefs) { prefs = {}; }
$( "div.historyItemBody:visible" ).each( function() {
if ( $.browser.mozilla ) {
$(this).find( "pre.peek" ).css( "overflow", "hidden" );
@@ -492,19 +492,11 @@
delete prefs[$(this).parent().attr("id")];
}
});
- $.jStore.store("history_expand_state", prefs);
+ $.jStorage.set("history_expand_state", prefs);
}).show();
};
- if (noinit) {
- action();
- } else {
- // Load jStore for local storage
- $.jStore.init("galaxy"); // Auto-select best storage
- $.jStore.ready(function() {
- action();
- });
- }
+ action();
}
function commatize( number ) {
--- a/static/scripts/jquery.jstore.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1810 +0,0 @@
-/*!
- * jStore 2.0 - Persistent Client Side Storage
- *
- * Copyright (c) 2010 Eric Garside (http://eric.garside.name/)
- * Dual licensed under:
- * MIT: http://www.opensource.org/licenses/mit-license.php
- * GPLv3: http://www.opensource.org/licenses/gpl-3.0.html
- *
- * ---------------------------
- *
- * jStore Flash Storage Component
- *
- * Copyright (c) 2006 Jeff Lerman (jeff(a)blip.tv)
- * Licensed under the Creative Commons Attribution 3.0 United States License:
- * http://creativecommons.org/licenses/by/3.0/us
- */
-
-//"use strict";
-
-/*global Class, window, jQuery, ActiveXObject, google */
-
-/*jslint white: true, browser: true, onevar: true, undef: true, eqeqeq: true, bitwise: true, regexp: false, strict: true, newcap: true, immed: true, maxerr: 50, indent: 4 */
-
-(function ($, window) {
-
- //------------------------------
- //
- // Constants
- //
- //------------------------------
-
- //------------------------------
- // Exceptions
- //------------------------------
-
- /**
- * An exception thrown by the StorageEngine class whenever its data accessor methods
- * are called before the engine is ready to transact data.
- */
- var EX_UNSTABLE = 'JSTORE_ENGINE_UNSTABLE',
-
- /**
- * An exception thrown by jStore whenever an undefined storage engine is referenced for
- * some task by an invalid JRI (jStore Resource Identifier).
- */
- EX_UNKNOWN = 'JSTORE_UNKNOWN_ENGINE_REQUESTED',
-
- /**
- * An exception thrown by jStore whenever a given flavor of storage is double defined.
- */
- EX_COLLISION = 'JSTORE_ENGINE_NAMESPACE_COLLISION',
-
- /**
- * An exception thrown by jStore whenever a jri is double applied to a resource.
- */
- EX_DUPLICATE = 'JSTORE_RESOURCE_NAMESPACE_COLLISION',
-
- /**
- * An exception thrown by jStore whenever a given flavor of storage has no defined engine.
- */
- EX_UNAVAILABLE = 'JSTORE_ENGINE_UNAVAILABLE',
-
- /**
- * An exception thrown by jStore whenever an invalid flavor type is used.
- */
- EX_INVALID = 'JSTORE_INVALID_FLAVOR',
-
- //------------------------------
- // Regular Expressions
- //------------------------------
-
- /**
- * Regular expression to test property values for being JSON.
- */
- RX_JSON = (function ()
- {
- try
- {
- return new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$');
- }
- catch (e)
- {
- return (/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/);
- }
- }()),
-
- //------------------------------
- // Storage Flavors
- //------------------------------
-
- /**
- * The storage flavor identifier for HTML5 local storage.
- */
- FLAVOR_LOCAL = 'jstore-html5-local',
-
- /**
- * The storage flavor identifier for HTML5 database storage.
- */
- FLAVOR_SQL = 'jstore-html5-sql',
-
- /**
- * The storage flavor identifier for Adobe Flash SharedObject storage.
- */
- FLAVOR_FLASH = 'jstore-flash',
-
- /**
- * The storage flavor identifier for Google Gears storage.
- */
- FLAVOR_GEARS = 'jstore-google-gears',
-
- /**
- * The storage flavor identifier for Internet Explorer storage, available to IE7 and IE6.
- */
- FLAVOR_MSIE = 'jstore-msie',
-
- //------------------------------
- //
- // Property Declaration
- //
- //------------------------------
-
- /**
- * The base StorageEngine class which each "storage flavor" will extend to meet the
- * requirements for its specific implementation.
- */
- StorageEngine,
-
- /**
- * The jStore object. Internal to this closure, jStore is referenced by "_". It is
- * exposed to jQuery below, and made publicly accessible through jQuery.jStore
- */
- _ = {},
-
- /**
- * The engines available to jStore for use. These are the class definitions for flavored
- * storage engines.
- *
- * Signature:
- * {
- * <storageFlavor>: <flavoredStorageEngineDefinition>,
- *
- * ...
- * }
- */
- definitions = {},
-
- /**
- * Active engines instantiated by jStore, indexed by their JRI.
- *
- * Signature:
- * {
- * <engineJRI>: <engineInstance>,
- *
- * ...
- * }
- */
- engines = {},
-
- /**
- * If we are going to be using the flash storage engine, we want to postpone the jStore ready event until the jStore
- * isFlashReady flag is also true. This property is set whenever flash is determined to be the storage engine.
- */
- waitForFlash = false,
-
- /**
- * Storage for listeners, indexed by content and event type.
- *
- * Signature:
- * {
- * <context>:
- * {
- * <eventType>: [<listener>, ...],
- *
- * ...
- * },
- *
- * ...
- * }
- */
- events = {},
-
- /**
- * The configuration for this implementation.
- *
- * Signature:
- * {
- * project: <defaultProjectName>,
- *
- * flash: <pathToFlashBootloader>,
- *
- * json: <pathToJSONFile>,
- *
- * errorCallback: <listenerToNotifyOnError>
- * }
- */
- configurations =
- {
- project: undefined,
-
- flash: 'jStore.Flash.html',
-
- json: 'browser.json.js'
- },
-
- /**
- * The active storage engine, being used to satisfy the get/set/remove functions on the jStore and jQuery
- * objects.
- */
- active;
-
- //------------------------------
- //
- // Internal Methods
- //
- //------------------------------
-
- /**
- * Determine if the given flavor is valid.
- *
- * @param flavor The flavor to test.
- *
- * @return True if the flavor is valid, false otherwise.
- */
- function validFlavor(flavor)
- {
- switch (flavor)
- {
-
- case FLAVOR_LOCAL:
- case FLAVOR_SQL:
- case FLAVOR_FLASH:
- case FLAVOR_GEARS:
- case FLAVOR_MSIE:
- return true;
-
- default:
- return false;
-
- }
- }
-
- /**
- * Performs enhanced type comparison on an object. This is more reliable method
- * of type checking a variable than a simple typeof comparison. The reason is that,
- * typeof will reduce to the lowest common type.
- *
- * "typeof []" returns Object, and not Array.
- * "typeof {}" returns Object as well.
- *
- * typecheck( [], 'Array' ) : returns true;
- * typecheck( [], 'Object' ) : returns false;
- *
- * @param type The variable type to check.
- *
- * @param compare A string representing the literal type to check.
- *
- * @return True if the variable "type" matches the compare literal.
- */
- function typecheck(type, compare)
- {
- return !type ? false : type.constructor.toString().match(new RegExp(compare + '\\(\\)', 'i')) !== null;
- }
-
- /**
- * If the provided listener is a valid function, it will be triggered with the provided context
- * and parameters.
- *
- * @param listener The listener being triggered.
- *
- * @param context The context to provide to the listener.
- *
- * @param parameters The parameters to pass to the listener as arguments.
- *
- * @return The response of the notified listener.
- */
- function notify(listener, context, parameters)
- {
- if (typecheck(listener, 'Function'))
- {
- return listener.apply(context || _, typecheck(parameters, 'Array') ? parameters : [parameters]);
- }
- }
-
- /**
- * Load the given script.
- *
- * @param path The path to the file to include.
- *
- * @param listener The listener to notify when the file finishes loading.
- */
- function loadScript(path, listener)
- {
- $.ajax(
- {
- url: path,
- complete: listener || $.noop(),
- type: 'GET',
- dataType: 'script',
- cache: false
- });
- }
-
- /**
- * Checks the type of the value, and returns a value safe to persist in any client-side mechanism.
- *
- * @param value The value which should be prepared for storage.
- *
- * @return A value safe for storage.
- */
- function prepareForStorage(value)
- {
- if (value === undefined)
- {
- return '';
- }
-
- if (typecheck(value, 'Object') ||
- typecheck(value, 'Array') ||
- typecheck(value, 'Function'))
- {
- return JSON.stringify(value);
- }
-
- return value;
- }
-
- /**
- * Checks the type of the value, and returns a value safe for access in any client-side mechanism.
- *
- * @param value The value which should be prepared for use.
- *
- * @return A value safe for use.
- */
- function prepareForRevival(value)
- {
- return RX_JSON.test(value) ? JSON.parse(value) : value;
- }
-
- /**
- * Normalize a key before using it, to ensure it's valid.
- *
- * @param key The key to normalize.
- *
- * @return A normalized key, safe for storage.
- */
- function normalizeKey(key)
- {
- return key.replace(/^\s+|\s+$/g, "");
- }
-
- /**
- * Define a flavored storage engine.
- *
- * @throws EX_COLLISION, EX_INVALID
- *
- * @param flavor The flavor of engine being defined.
- *
- * @param definition An object containing the new properties and methods for the engine extension.
- *
- * @param availability A function to invoke which must return a boolean value indicating the
- * availability of the storage flavor on this browser.
- */
- function define(flavor, definition, availability)
- {
- if (!validFlavor(flavor))
- {
- throw EX_INVALID;
- }
-
- if (availability[flavor] !== undefined)
- {
- throw EX_COLLISION;
- }
-
- /**
- * The logic here has been reworked so unavailable flavors are discarded, so we don't needlessly
- * bloat the runtime size of jStore.
- */
- if (notify(availability) === true)
- {
- _.available[flavor] = true;
-
- definition.flavor = flavor;
-
- definitions[flavor] = StorageEngine.extend(definition);
- }
- else
- {
- _.available[flavor] = false;
-
- // Filter the invalid flavor out of the priority list.
- _.enginePriority = $.map(_.enginePriority, function (engine)
- {
- if (engine === flavor)
- {
- return null;
- }
- else
- {
- return engine;
- }
- });
- }
- }
-
- /**
- * Make the jStore library ready.
- */
- function makeReady()
- {
- if (_.isReady)
- {
- return;
- }
-
- if ((waitForFlash && _.isFlashReady) || !waitForFlash)
- {
- _.isReady = true;
- _.trigger('jstore-ready', [engines[active]]);
- }
- }
-
- /**
- * Create a best-fit engine.
- */
- function createBestFitEngine()
- {
- _.create(_.enginePriority[0], undefined, 'best-fit');
- }
-
- /**
- * Get the flash version currently supported in this browser.
- *
- * @return The flash version.
- */
- function flashVersion()
- {
- // MSIE
- try
- {
- // avoid fp6 minor version lookup issues
- // see: http://blog.deconcept.com/2006/01/11/getvariable-setvariable-crash-internet…
- var axo = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');
-
- try
- {
- axo.AllowScriptAccess = 'always';
- }
- catch (axo_e)
- {
- return '6,0,0';
- }
-
- return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version').replace(/\D+/g, ',').match(/^,?(.+),?$/)[1];
- }
-
- // Real browsers
- catch (e)
- {
- try
- {
- if (navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin)
- {
- return (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g, ",").match(/^,?(.+),?$/)[1];
- }
- }
- catch (flash_e)
- {}
- }
-
- return '0,0,0';
- }
-
- /**
- * Flash Detection functions copied from the jQuery Flash Plugin
- *
- * Copyright (c) 2006 Luke Lutman (http://jquery.lukelutman.com/plugins/flash)
- *
- * Dual licensed under the MIT and GPL licenses.
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.opensource.org/licenses/gpl-license.php
- *
- * @param version The version to compare to.
- *
- * @return True if the version is greater than or equal to the required version, false otherwise.
- */
- function hasFlashVersion(version)
- {
- var playerVersion = flashVersion().match(/\d+/g),
- requiredVersion = version.match(/\d+/g),
- index = 0,
- player,
- required;
-
- for (; index < 3; index++)
- {
- player = parseInt(playerVersion[index], 10);
- required = parseInt(requiredVersion[index], 10);
-
- // Player version is less than what is required.
- if (player < required)
- {
- return false;
- }
-
- // Player version is greater than what is required.
- else if (player > required)
- {
- return true;
- }
- }
-
- // Player and required version match exactly.
- return true;
- }
-
- //------------------------------
- //
- // Plugin Definition
- //
- //------------------------------
-
- //------------------------------
- // Error Declaration
- //------------------------------
-
- //------------------------------
- // Plugin Creation
- //------------------------------
-
- /**
- * The jStore object. Manages a collection of StorageEngines for particular "storage flavors", or the types
- * of storage solutions available to each browser.
- *
- * 2.0 Version Notes:
- *
- * - The user is now responsible for third-party script includes, with the exception of flash.
- *
- * - jStore has been given sole responsibility for testing engine availability.
- *
- * - For the sake of naming conventions, all property names now start with a lowercase, and are camel-cased.
- *
- * The following properties have been changed since the 1.2.x release:
- *
- * - EngineOrder: For the sake of naming conventions, renamed to enginePriority.
- *
- * The following properties and methods have been removed since the 1.2.x release:
- *
- * - Availability: jStore's engines would add their availability tests to this object, so jStore could test
- * them. With the changes to how availability testing works, this property has been removed.
- * A new property, "available" on jStore contains a set of available engines.
- *
- * - Engines: Formerly contained the definitions of storage engines. This property has been removed, and
- * storage of these definitions has been moved internal to the closure.
- *
- * - Instances: Formerly contained instantiated storage engines. This property has been removed, and storage
- * of instantiated engines has been moved internal to the closure.
- *
- * - CurrentEngine: Formerly contained the active storage engine being used for transacting data through the jStore
- * and/or jQuery objects. This property has been removed, and storage of the current engine has
- * been moved internal to the closure. A new method, "activeEngine" has been added to jQuery to
- * get and set the active engine to use.
- *
- * - defaults: Formerly used to set the implementation options for jStore. This property has been removed and
- * replaced with a new configuration metho on the jStore object.
- *
- * - delegate: The delegate class has been removed in favor of a much simpler bind/trigger accessor system, which
- * is accessible contextually through storage engines, or generically through jStore.
- *
- * + fail: This registration class bound events on the delegate for jstore-fail events. Instead, use:
- * jStore.bind('jstore-failure', listener);
- *
- * + flashReady: This registration class bound events on the delegate for flash-ready events. The jstore-ready method
- * now accounts for waiting for flash readyness, if and only if the flash engine is being used. Simply
- * call to jStore.ready().
- *
- * + load: Replaced with the init() method, which performs the same basic functions as the old load() method. Also,
- * the init function is now domready safe, meaning it wraps itself in a domready listener, so the end user
- * doesn't have to.
- *
- * + FindEngine: Removed entirely. The functionality provided by this method now implicitly occurs with the new define()
- * system implemented for engine flavors.
- *
- * + setCurrentEngine: Replaced by activeEngine(). Set the current active engine by passing in the JRI.
- *
- * + safeStore: Replaced by a method internal to this closure, "prepareForStorage".
- *
- * + safeResurrect: Replaced by a method internal to this closure, "prepareForRevival".
- *
- * + use: Replaced by "create".
- */
- $.extend(_, {
-
- //------------------------------
- // Properties
- //------------------------------
-
- /**
- * The priority order in which engines should be tested for use. The lower their index in the array, the higher
- * their priority for use.
- *
- * Be weary when reconfiguring the priority order of engines! jStore will use the first available engine it finds
- * based on its priority when autoloading.
- *
- * This array is filtered out as engines are defined, with invalid engines being removed.
- *
- * Signature:
- * [FLAVOR_<storageFlavor>, ...]
- */
- enginePriority: [FLAVOR_LOCAL, FLAVOR_SQL, FLAVOR_FLASH, FLAVOR_MSIE],
-
- /**
- * A collection of the availability states of engines, indexed by their flavor.
- *
- * Signature:
- * {
- * <storageFlavor>: true|false,
- *
- * ...
- * }
- */
- available: {},
-
- /**
- * Flag to determine if the jStore library is ready. jStore becomes ready once the dom is ready and all necessary
- * startup procedures required by jStore to function properly are completed.
- */
- isReady: false,
-
- /**
- * With the flash storage engine, we have to jump through a couple of hoops before the flash engine is ready to work.
- * This flag tracks whether or not the flash storage is available.
- */
- isFlashReady: false,
-
- /**
- * The available engine flavors.
- */
- flavors:
- {
- local: FLAVOR_LOCAL,
-
- sql: FLAVOR_SQL,
-
- flash: FLAVOR_FLASH,
-
- gears: FLAVOR_GEARS,
-
- msie: FLAVOR_MSIE
- },
-
- //------------------------------
- // Constructor
- //------------------------------
-
- /**
- * Constructor.
- *
- * @throws EX_INVALID
- *
- * @param project The name of the jStore project. Used to generate a JRI for the engine we create.
- *
- * @param configuration Optionally, an object containing configuration options for this implementation.
- *
- * @param flavor Optionally, the flavor of storage to use. If not provided, jStore will pick the
- * best flavor, based on the current browser.
- *
- * @return jStore
- */
- init: function (project, configuration, flavor)
- {
- // Extend our plugin configurations
- $.extend(configurations, {project: project}, configuration);
-
- $(function ()
- {
- // If JSON parsing isn't defined in this browser, include it.
- if (window.JSON === undefined)
- {
- loadScript(configurations.json);
- }
-
- // If we have an explicit flavor to use, use it.
- if (flavor !== undefined)
- {
- _.create(flavor, project, 'default');
- }
-
- // Otherwise, attempt to create a best-fit engine.
- else
- {
- createBestFitEngine();
- }
- });
-
- return _;
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- /**
- * Create an instance of a flavored engine.
- *
- * @throws EX_INVALID, EX_UNAVAILABLE, EX_DUPLICATE
- *
- * @param flavor The flavor to create the engine with.
- *
- * @param project The project identifier for this instance.
- *
- * @param identifier Some arbitrary identifier for this project instance of the engine.
- *
- * @return The created instance.
- */
- create: function (flavor, project, identifier)
- {
- project = project || configurations.project || location.hostname.replace(/\./g, '-') || 'unknown';
-
- if (!validFlavor(flavor))
- {
- throw EX_INVALID;
- }
-
- if (definitions[flavor] === undefined)
- {
- throw EX_UNAVAILABLE;
- }
-
- var jri = (identifier !== undefined ? identifier + '.' : '') + project + '.' + flavor,
- engine;
-
- if (engines[jri] !== undefined)
- {
- throw EX_DUPLICATE;
- }
-
- // Create our engine instance.
- engine = engines[jri] = new definitions[flavor](project, jri);
-
- // Set up a listener for our jstore-engine-ready event.
- engine.ready(function ()
- {
- _.trigger('jstore-engine-ready', [engine]);
- });
-
- if (flavor === FLAVOR_FLASH && !_.isFlashReady)
- {
- if (active === undefined)
- {
- waitForFlash = true;
- }
-
- // Define a window-accessible function for flash to call via ExternalInterface
- window.jstore_ready = function ()
- {
- _.isFlashReady = true;
- _.trigger('flash-ready');
-
- if (active === undefined)
- {
- makeReady();
- }
-
- // Remove the callback from the window scope, as it is no longer necessary
- window.flash_ready = undefined;
- };
-
- window.jstore_error = function (message)
- {
- _.trigger('jstore-error', ['JSTORE_FLASH_EXCEPTION', null, message]);
- };
-
- $('<iframe style="height:1px;width:1px;position:absolute;left:0;top:0;margin-left:-100px;" id="jStoreFlashFrame" src="' +
- configurations.flash + '"></iframe>').appendTo('body');
- }
- else if (active === undefined)
- {
- active = jri;
- makeReady();
- }
-
- return engine;
- },
-
- /**
- * Fetch an engine by it's JRI.
- *
- * @param jri The JRI of the engine to retrieve.
- *
- * @return The requested engine.
- */
- engine: function (jri)
- {
- return engines[jri];
- },
-
- /**
- * Returns the active storage engine being used. If a value is passed, sets that engine as the active engine.
- *
- * @throws EX_UNKNOWN
- *
- * @param jri Optionally, the JRI of the engine to make active, if it should be changed.
- *
- * @return The active storage engine.
- */
- activeEngine: function (jri)
- {
- if (jri !== undefined)
- {
- if (engines[jri] === undefined)
- {
- throw EX_UNKNOWN;
- }
- else
- {
- active = jri;
- }
- }
-
- return engines[active];
- },
-
- /**
- * Bind an event listener.
- *
- * @param event The event to bind a listener on.
- *
- * @param listener The listener to notify when the event occurs.
- *
- * @param context The context of the binding. A string representing the engine flavor
- * binding the event, or undefined to indicate it's a jStore event.
- *
- * @return jStore
- */
- bind: function (event, listener, context)
- {
- context = context || 'jstore';
-
- if (events[context] === undefined)
- {
- events[context] = {};
- }
-
- if (events[context][event] === undefined)
- {
- events[context][event] = [listener];
- }
- else
- {
- events[context][event].push(listener);
- }
-
- return _;
- },
-
- /**
- * Trigger an event, notifying any bound listeners.
- *
- * @param event The event to trigger.
- *
- * @param parameters Any additional parameters to pass to the listeners being notified.
- *
- * @param context The context of the binding. A string representing the engine flavor
- * binding the event, or undefined to indicate it's a jStore event.
- *
- * @return jStore
- */
- trigger: function (event, parameters, context)
- {
- context = context || 'jstore';
-
- if (events[context] !== undefined)
- {
- if (events[context][event] !== undefined)
- {
- $.each(events[context][event], function ()
- {
- notify(this, _, parameters);
- });
- }
- }
-
- return _;
- },
-
- /**
- * Bind a listener to be notified when jStore causes a non-fatal exception.
- *
- * @param listener The listener to notify when a failure occurs.
- */
- error: function (listener)
- {
- _.bind('jstore-error', listener);
- },
-
- /**
- * Bind a listener to be notified when jStore is ready.
- *
- * @param listener The listener to notify when jStore is ready.
- *
- * @return jStore
- */
- ready: function (listener)
- {
- if (_.isReady)
- {
- notify(listener);
- }
- else
- {
- _.bind('jstore-ready', listener);
- }
-
- return _;
- },
-
- /**
- * Bind a listener to be notified when jStore and the default engine are ready.
- *
- * @param listener The listener to notify when jStore and it's default engine are ready.
- *
- * @return jStore
- */
- engineReady: function (listener)
- {
- if (_.isReady)
- {
- notify(listener);
- }
- else
- {
- _.bind('jstore-engine-ready', listener);
- }
-
- return _;
- },
-
- /**
- * A combined getter/setter for the active engine.
- *
- * @param key The key of the property to get, or set.
- *
- * @param value If a valid value is provided, sets the engine.
- *
- * @return The requested property value.
- */
- store: function (key, value)
- {
- return value === undefined ? _.get(key) : _.set(key, value);
- },
-
- /**
- * Remove a property from the active engine.
- *
- * @param key The key of the property to remove.
- *
- * @return The value of the property before removal.
- */
- remove: function (key)
- {
- return _.activeEngine().remove(key);
- },
-
- /**
- * Get a property from the active engine.
- *
- * @param key The key of the property to get.
- *
- * @return The value of the property.
- */
- get: function (key)
- {
- return _.activeEngine().get(key);
- },
-
- /**
- * Set a property on the active engine.
- *
- * @param key The key of the property to set.
- *
- * @param value The value to set the property to.
- *
- * @return The new value of the property.
- */
- set: function (key, value)
- {
- return _.activeEngine().set(key, value);
- }
-
- });
-
- //------------------------------
- // Core Extension
- //------------------------------
-
- //------------------------------
- //
- // Class Definition
- //
- //------------------------------
-
- /**
- * The StorageEngine class is the unified API through which jStore accesses and manipulates
- * the various storage flavors available.
- *
- * 2.0 Version Notes:
- *
- * - All third-party loading is now the responsibility of the developer.
- *
- * - The delegate class has been removed entirely. Engines have been given "bind" and "trigger" methods
- * to interact directly with the delegate like-replacement that has been added to jStore.
- *
- * - Engine availability has been moved out of the engines themselves, and elevated to a jStore
- * responsibility.
- *
- * The following methods have changed since the 1.2.x release:
- *
- * - get: When "get"ting a non-stored property, the get function will now return "undefined"
- * instead of "null". "null" can now be used as a valid property value.
- *
- * - rem: Renamed to "remove". I always felt dirty about "rem" being vaguely explicit.
- *
- * The following properties have been removed since the 1.2.x release:
- *
- * - autoload: Part of the third-party loading logic.
- *
- * - hasIncluded: Part of the third-party loading logic.
- *
- * - includes: Part of the third-party loading logic.
- *
- * - isAvailable: Part of the availability logic elevated to jStore.
- *
- * @throws EX_UNSTABLE
- */
- StorageEngine = Class.extend({
-
- //------------------------------
- // Properties
- //------------------------------
-
- /**
- * The project which owns this storage engine.
- */
- project: undefined,
-
- /**
- * The JRI (jStore Resource Identifier) acts as a uuid for this specific instance
- * of the storage engine.
- */
- jri: undefined,
-
- /**
- * The flavor of this engine.
- */
- flavor: undefined,
-
- /**
- * The actual database object which data is transacted through.
- */
- database: undefined,
-
- /**
- * A StorageEngine should always respond to fetch requests synchronously. However, some
- * of the storage flavors require callback-based asynchronous access. To get around this,
- * we simlpy require all engines to function off a primary data cache, to allow for
- * synchronous access across all implementations.
- *
- * Signature:
- * {
- * <propertyKey>: <propertyValue>,
- *
- * ...
- * }
- */
- data: undefined,
-
- /**
- * A number of storage engines enforce a size limit as to what they will persist for a given site.
- * This limit is not monitored or computed by jStore currently, and this property will merely give
- * a static indication of the total size alloted to the engine, as defined by the storage flavor.
- */
- limit: undefined,
-
- /**
- * Each storage flavor has a different process to go through before it's "ready" to transact data. This
- * property stores the state of the engine's readyness, and uses it to notify listeners whenever jStore
- * is ready to function.
- */
- isReady: undefined,
-
- //------------------------------
- // Constructor
- //------------------------------
-
- /**
- * Constructor.
- *
- * @param project The project which instantiated this engine.
- *
- * @param jri The uuid assigned to this instance by jStore.
- */
- init: function (project, jri)
- {
- this.project = project;
- this.jri = jri;
- this.data = {};
- this.isReady = false;
- this.updateCache();
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- /**
- * Update the cache.
- */
- updateCache: function ()
- {
- this.isReady = true;
- this.trigger('engine-ready', [this]);
- },
-
- /**
- * Bind a listener to an event dispatched by this engine.
- *
- * @param event The event to bind on.
- *
- * @param listener The listener to notify when the event occurs.
- */
- bind: function (event, listener)
- {
- _.bind(event, listener, this.jri);
- },
-
- /**
- * Trigger an event, notifying all bound listeners.
- *
- * @param event The event to trigger.
- *
- * @param parameters An optional Array of parameters to pass to the listeners.
- */
- trigger: function (event, parameters)
- {
- _.trigger(event, parameters, this.jri);
- },
-
- /**
- * Bind a listener to the StorageEngine's ready event.
- *
- * @param listener The listener to notify whenever this engine is ready to transact data.
- */
- ready: function (listener)
- {
- if (this.isReady)
- {
- notify(listener, this);
- }
- else
- {
- this.bind('engine-ready', listener);
- }
- },
-
- /**
- * Get a property from the StorageEngine.
- *
- * @param key The property key of the data to retrieve.
- *
- * @return The property value, or "undefined" if the property isn't stored.
- */
- get: function (key)
- {
- this.__interruptAccess();
-
- return this.data[key];
- },
-
- /**
- * Sets a property in the StorageEngine.
- *
- * @param key The key of the property.
- *
- * @param value The value of the property.
- *
- * @return The new value of the property.
- */
- set: function (key, value)
- {
- this.__interruptAccess();
-
- key = normalizeKey(key);
-
- try
- {
- this.__set(key, value);
- }
- catch (e)
- {
- _.trigger('jstore-error', ['JSTORE_STORAGE_FAILURE', this.jri, e]);
- }
-
- this.data[key] = value;
-
- return value;
- },
-
- /**
- * Removes a property from the StorageEngine.
- *
- * @param key The property key of the data to remove.
- *
- * @return The value of the property, before it was removed.
- */
- remove: function (key)
- {
- this.__interruptAccess();
-
- key = normalizeKey(key);
-
- try
- {
- this.__remove(key);
- }
- catch (e)
- {
- _.trigger('jstore-error', ['JSTORE_REMOVE_FAILURE', this.jri, e]);
- }
-
- var buffer = this.data[key];
-
- this.data[key] = undefined;
-
- return buffer;
- },
-
- //------------------------------
- // Internal Methods
- //------------------------------
-
- /**
- * Ensures the engine is in a stable state for transacting data.
- *
- * @throws EX_UNSTABLE
- */
- __interruptAccess: function ()
- {
- if (!this.isReady)
- {
- throw EX_UNSTABLE;
- }
- },
-
- /**
- * Sets a property in the StorageEngine. This method should be overloaded to provide actual
- * storage flavor integration.
- *
- * @param key The key of the property.
- *
- * @param value The value of the property.
- *
- * @return The new value of the property.
- */
- __set: function (key, value)
- {
- return;
- },
-
- /**
- * Removes a property from the StorageEngine. This method should be overloaded to provide actual
- * storage flavor integration.
- *
- * @param key The property key of the data to remove.
- *
- * @return The value of the property, before it was removed.
- */
- __remove: function (key)
- {
- return;
- }
-
- });
-
- //------------------------------
- //
- // jQuery Hooks
- //
- //------------------------------
-
- $.extend($.fn, {
-
- //------------------------------
- // Methods
- //------------------------------
-
- /**
- * A combined getter/setter for the active engine.
- *
- * @param key The key of the property to get, or set.
- *
- * @param value If a valid value is provided, sets the engine.
- *
- * @return jQuery
- */
- store: function (key, value)
- {
- if (value === undefined)
- {
- _.get(key);
- }
- else
- {
- _.set(key, value);
- }
-
- return this;
- },
-
- /**
- * Remove a property from the active engine.
- *
- * @param key The key of the property to remove.
- *
- * @return jQuery
- */
- removeStore: function (key)
- {
- _.activeEngine().remove(key);
-
- return this;
- },
-
- /**
- * Get a property from the active engine.
- *
- * @param key The key of the property to get.
- *
- * @return The value of the property.
- */
- getStore: function (key)
- {
- return _.activeEngine().get(key);
- },
-
- /**
- * Set a property on the active engine.
- *
- * @param key The key of the property to set.
- *
- * @param value The value to set the property to.
- *
- * @return jQuery
- */
- setStore: function (key, value)
- {
- _.activeEngine().set(key, value);
-
- return this;
- }
-
- });
-
- //------------------------------
- //
- // Event Bindings
- //
- //------------------------------
-
- //------------------------------
- //
- // Startup Code
- //
- //------------------------------
-
- //------------------------------
- // Expose jStore through jQuery
- //------------------------------
-
- window.jStore = $.jStore = _;
-
- //------------------------------
- //
- // Engine Definitions
- //
- //------------------------------
-
- //------------------------------
- // Local
- //------------------------------
-
- define(FLAVOR_LOCAL,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: parseInt(5e5, 16),
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = window.globalStorage === undefined ? window.localStorage : window.globalStorage[location.hostname];
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- var key, value;
-
- for (key in this.database)
- {
- var has_key = false;
- if (this.database.hasOwnProperty) {
- if (this.database.hasOwnProperty(key)) {
- has_key = true;
- }
- } else { // IE 8
- if (this.database.getItem(key) !== null) {
- has_key = true;
- }
- }
-
- if (has_key) {
- value = this.database.getItem(key);
-
- // Gecko's getItem returns {value: 'the value'}, WebKit returns 'the value'
- this.data[key] = prepareForRevival(value && value.value ? value.value : value);
- }
- }
-
- this._super();
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.setItem(key, prepareForStorage(value));
- },
-
- __remove: function (key)
- {
- this.database.removeItem(key);
- }
- },
-
- function ()
- {
- return window.localStorage !== undefined || window.globalStorage !== undefined;
- });
-
- //------------------------------
- // SQL
- //------------------------------
-
- define(FLAVOR_SQL,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: parseInt(32e3, 16),
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = window.openDatabase('jstore-' + project, '1.0', project, this.limit);
-
- if (!this.database)
- {
- throw 'JSTORE_SQL_NO_DB';
- }
-
- this.database.transaction(function (database)
- {
- database.executeSql('CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)');
- });
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- var self = this,
- _super = this._super;
-
- this.database.transaction(function (database)
- {
- database.executeSql('SELECT k,v FROM jstore', [], function (database, result)
- {
- var rows = result.rows,
- index = 0,
- row;
-
- for (; index < rows.length; ++index)
- {
- row = rows.item(index);
- self.data[row.k] = prepareForRevival(row.v);
- }
-
- _super.apply(self);
- });
- });
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.transaction(function (database)
- {
- database.executeSql('INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)', [key, prepareForStorage(value)]);
- });
- },
-
- __remove: function (key)
- {
- this.database.transaction(function (database)
- {
- database.executeSql('DELETE FROM jstore WHERE k = ?', [key]);
- });
- }
- },
-
- function ()
- {
- return window.openDatabase !== undefined;
- });
-
- //------------------------------
- // Flash
- //------------------------------
-
- define(FLAVOR_FLASH,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: -1,
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- var self = this;
-
- _.bind('flash-ready', function ()
- {
- self.__flashReadyListener();
- });
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function (enable)
- {
- /**
- * The default call to updateCache passes no variable, so we can short circuit the
- * ready state until we explictly call this after flash ready.
- */
- if (enable === true)
- {
- var key,
- dataset = this.database.jstore_get_all();
-
- for (key in dataset)
- {
- if (dataset.hasOwnProperty(key))
- {
- this.data[key] = prepareForRevival(this.database.jstore_get(key));
- }
- }
-
- this._super();
- }
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- if (!this.database.jstore_set(key, prepareForStorage(value)))
- {
- _.trigger('jstore-error', ['JSTORE_STORAGE_FAILURE', this.jri, 'Flash Exception']);
- }
- },
-
- __remove: function (key)
- {
- this.database.jstore_remove(key);
- },
-
- /**
- * Triggered whenever flash is ready.
- */
- __flashReadyListener: function ()
- {
- var iFrame = $('#jStoreFlashFrame')[0],
- frameDocument;
-
- // MSIE
- if (iFrame.Document !== undefined && typecheck(iFrame.Document.jStoreFlash.jstore_get, 'Function'))
- {
- this.database = iFrame.Document.jStoreFlash;
- }
-
- // Real Browsers
- else if (iFrame.contentWindow && iFrame.contentWindow.document)
- {
- frameDocument = $(iFrame.contentWindow.document);
-
- // Webkit
- if (typecheck($('object', frameDocument)[0].jstore_get, 'Function'))
- {
- this.database = $('object', frameDocument)[0];
- }
-
- // Gecko
- else if (typecheck($('embed', frameDocument)[0].jstore_get, 'Function'))
- {
- this.database = $('embed', frameDocument)[0];
- }
- }
-
- if (this.database === undefined)
- {
- throw 'JSTORE_FLASH_REFERENCE_ISSUE';
- }
- else
- {
- this.updateCache(true);
- }
- }
- },
-
- function ()
- {
- return hasFlashVersion('9.0.0');
- });
-
- //------------------------------
- // Gears
- //------------------------------
-
- define(FLAVOR_GEARS,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: -1,
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = google.gears.factory.create('beta.database');
- this.database.open('jstore-' + project);
- this.database.execute('CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)');
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- var result = this.database.execute('SELECT k,v FROM jstore');
-
- while (result.isValidRow())
- {
- this.data[result.field(0)] = prepareForRevival(result.field(1));
- result.next();
- }
-
- result.close();
-
- this._super();
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.execute('BEGIN');
- this.database.execute('INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)', [key, prepareForStorage(value)]);
- this.database.execute('COMMIT');
- },
-
- __remove: function (key)
- {
- this.database.execute('BEGIN');
- this.database.execute('DELETE FROM jstore WHERE k = ?', [key]);
- this.database.execute('COMMIT');
- }
- },
-
- function ()
- {
- return window.google !== undefined && window.google.gears !== undefined;
- });
-
- //------------------------------
- // MSIE
- //------------------------------
-
- define(FLAVOR_MSIE,
- {
- //------------------------------
- // Properties
- //------------------------------
-
- limit: parseInt(1e4, 16),
-
- //------------------------------
- // Constructor
- //------------------------------
-
- init: function (project, name)
- {
- this.database = $('<div style="display:none;behavior:url(\'#default#userData\')" id="jstore-' + project + '"></div>')
- .appendTo(document.body).get(0);
-
- this._super(project, name);
- },
-
- //------------------------------
- // Methods
- //------------------------------
-
- updateCache: function ()
- {
- this.database.load(this.project);
-
- var node = document.getElementById('jstore-' + this.project),
- xmlDoc = node.XMLDocument,
- root,
- index = 0;
-
- if (xmlDoc && xmlDoc.documentElement && xmlDoc.documentElement.attributes)
- {
- root = xmlDoc.documentElement;
-
- for (; index < root.attributes.length; ++index)
- {
- this.data[root.attributes.item(index).nodeName] = prepareForRevival(root.attributes.item(index).nodeValue);
- }
- }
-
- this._super();
- },
-
- //------------------------------
- // Internal methods
- //------------------------------
-
- __set: function (key, value)
- {
- this.database.setAttribute(key, prepareForStorage(value));
- this.database.save(this.project);
- },
-
- __remove: function (key)
- {
- this.database.removeAttribute(key);
- this.database.save(this.project);
- }
- },
-
- function ()
- {
- return window.ActiveXObject !== undefined;
- });
-
-}(jQuery, window));
--- a/static/scripts/packed/class.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,7 +0,0 @@
-/*
- * Class definition
- *
- * Copyright (c) 2008 John Resig (http://ejohn.org/blog/simple-javascript-inheritance/)
- * Inspired by base2 and Prototype
- */
-(function(){var a=false,b=/xyz/.test(function(){xyz})?/\b_super\b/:/.*/;this.Class=function(){};Class.extend=function(g){var f=this.prototype;a=true;var e=new this();a=false;for(var d in g){e[d]=(typeof g[d]==="function"&&typeof f[d]==="function"&&b.test(g[d])?(function(h,i){return function(){var k=this._super;this._super=f[h];var j=i.apply(this,arguments);this._super=k;return j}}(d,g[d])):g[d])}function c(){if(!a&&this.init){this.init.apply(this,arguments)}}c.prototype=e;c.constructor=c;c.extend=arguments.callee;return c}}());
\ No newline at end of file
--- a/static/scripts/packed/galaxy.base.js Fri Feb 18 14:53:35 2011 -0500
+++ b/static/scripts/packed/galaxy.base.js Fri Feb 18 15:06:34 2011 -0500
@@ -1,1 +1,1 @@
-if(!Array.indexOf){Array.prototype.indexOf=function(c){for(var b=0,a=this.length;b<a;b++){if(this[b]==c){return b}}return -1}}function obj_length(c){if(c.length!==undefined){return c.length}var b=0;for(var a in c){b++}return b}$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};function show_hide_popupmenu_options(d,c,a){a=(a===undefined?true:a);var b=new RegExp(c);$(d).find("li").each(function(){if(b.exec($(this).text())){if(a){$(this).show()}else{$(this).hide()}}})}function make_popupmenu(a,b){a.data("menu_options",b);a.bind("click.show_popup",function(c){$(".popmenu-wrapper").remove();setTimeout(function(){var f=$("<ul id='"+a.attr("id")+"-menu'></ul>");var e=a.data("menu_options");if(obj_length(e)<=0){$("<li>No Options.</li>").appendTo(f)}$.each(e,function(i,h){if(h){$("<li/>").html(i).click(h).appendTo(f)}else{$("<li class='head'/>").html(i).appendTo(f)}});var g=$("<div class='popmenu-wrapper' style='position: absolute;left: 0; top: -1000;'>");g.append(f).append("<div class='overlay-border'>").appendTo("body");var d=c.pageX-g.width()/2;d=Math.min(d,$(document).scrollLeft()+$(window).width()-$(g).width()-20);d=Math.max(d,$(document).scrollLeft()+20);g.css({top:c.pageY-5,left:d})},10);setTimeout(function(){var e=function(g){$(g).bind("click.close_popup",function(){$(".popmenu-wrapper").remove();g.unbind("click.close_popup")})};e($(window.document));e($(window.top.document));for(var d=window.top.frames.length;d--;){var f=$(window.top.frames[d].document);e(f)}},50);return false})}function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var a={};var c=$(this);c.find("a").each(function(){var f=$(this),h=f.get(0);var d=h.getAttribute("confirm"),e=h.getAttribute("href"),g=h.getAttribute("target");if(!e){a[f.text()]=null}else{a[f.text()]=function(){if(!d||confirm(d)){var i;if(g=="_parent"){window.parent.location=e}else{if(g=="_top"){window.top.location=e}else{if(g=="demo"){if(i==undefined||i.closed){i=window.open(e,g);i.creator=self}}else{window.location=e}}}}}}});var b=$("#"+c.attr("popupmenu"));b.find("a").bind("click",function(d){d.stopPropagation();return true});make_popupmenu(b,a);b.addClass("popup");c.remove()})}function naturalSort(j,h){var p=/(-?[0-9\.]+)/g,k=j.toString().toLowerCase()||"",g=h.toString().toLowerCase()||"",l=String.fromCharCode(0),n=k.replace(p,l+"$1"+l).split(l),e=g.replace(p,l+"$1"+l).split(l),d=(new Date(k)).getTime(),o=d?(new Date(g)).getTime():null;if(o){if(d<o){return -1}else{if(d>o){return 1}}}var m,f;for(var i=0,c=Math.max(n.length,e.length);i<c;i++){m=parseFloat(n[i])||n[i];f=parseFloat(e[i])||e[i];if(m<f){return -1}else{if(m>f){return 1}}}return 0}function replace_big_select_inputs(a,b){if(!jQuery().autocomplete){return}if(a===undefined){a=20}if(b===undefined){b=3000}$("select").each(function(){var d=$(this);var g=d.find("option").length;if((g<a)||(g>b)){return}if(d.attr("multiple")===true){return}if(d.hasClass("no-autocomplete")){return}var m=d.attr("value");var c=$("<input type='text' class='text-and-autocomplete-select'></input>");c.attr("size",40);c.attr("name",d.attr("name"));c.attr("id",d.attr("id"));c.click(function(){var n=$(this).val();$(this).val("Loading...");$(this).showAllInCache();$(this).val(n);$(this).select()});var e=[];var i={};d.children("option").each(function(){var o=$(this).text();var n=$(this).attr("value");e.push(o);i[o]=n;i[n]=n;if(n==m){c.attr("value",o)}});if(m===""||m==="?"){c.attr("value","Click to Search or Select")}if(d.attr("name")=="dbkey"){e=e.sort(naturalSort)}var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:b,minChars:0,hideForLessThanMinChars:false};c.autocomplete(e,f);d.replaceWith(c);var k=function(){var o=c.attr("value");var n=i[o];if(n!==null&&n!==undefined){c.attr("value",n)}else{if(m!==""){c.attr("value",m)}else{c.attr("value","?")}}};c.parents("form").submit(function(){k()});$(document).bind("convert_to_values",function(){k()});if(d.attr("refresh_on_change")=="true"){var h=d.attr("refresh_on_change_values"),l=d.attr("last_selected_value");if(h!==undefined){h=h.split(",")}var j=function(){var n=i[c.attr("value")];if(l!==n&&n!==null&&n!==undefined){if(h!==undefined&&$.inArray(n,h)===-1&&$.inArray(l,h)===-1){return}c.attr("value",n);$(window).trigger("refresh_on_change");c.parents("form").submit()}};c.bind("result",j);c.keyup(function(n){if(n.keyCode===13){j()}});c.keydown(function(n){if(n.keyCode===13){return false}})}})}function async_save_text(d,f,e,a,c,h,i,g,b){if(c===undefined){c=30}if(i===undefined){i=4}$("#"+d).live("click",function(){if($("#renaming-active").length>0){return}var l=$("#"+f),k=l.text(),j;if(h){j=$("<textarea></textarea>").attr({rows:i,cols:c}).text($.trim(k))}else{j=$("<input type='text'></input>").attr({value:$.trim(k),size:c})}j.attr("id","renaming-active");j.blur(function(){$(this).remove();l.show();if(b){b(j)}});j.keyup(function(n){if(n.keyCode===27){$(this).trigger("blur")}else{if(n.keyCode===13){var m={};m[a]=$(this).val();$(this).trigger("blur");$.ajax({url:e,data:m,error:function(){alert("Text editing for elt "+f+" failed")},success:function(o){if(o!==""){l.text(o)}else{l.html("<em>None</em>")}if(b){b(j)}}})}}});if(g){g(j)}l.hide();j.insertAfter(l);j.focus();j.select();return})}function init_history_items(d,a,c){var b=function(){try{var e=$.jStore.store("history_expand_state");if(e){for(var g in e){$("#"+g+" div.historyItemBody").show()}}}catch(f){$.jStore.remove("history_expand_state")}if($.browser.mozilla){$("div.historyItemBody").each(function(){if(!$(this).is(":visible")){$(this).find("pre.peek").css("overflow","hidden")}})}d.each(function(){var j=this.id,h=$(this).children("div.historyItemBody"),i=h.find("pre.peek");$(this).find(".historyItemTitleBar > .historyItemTitle").wrap("<a href='javascript:void(0);'></a>").click(function(){var k;if(h.is(":visible")){if($.browser.mozilla){i.css("overflow","hidden")}h.slideUp("fast");if(!c){k=$.jStore.store("history_expand_state");if(k){delete k[j];$.jStore.store("history_expand_state",k)}}}else{h.slideDown("fast",function(){if($.browser.mozilla){i.css("overflow","auto")}});if(!c){k=$.jStore.store("history_expand_state");if(k===undefined){k={}}k[j]=true;$.jStore.store("history_expand_state",k)}}return false})});$("#top-links > a.toggle").click(function(){var h=$.jStore.store("history_expand_state");if(h===undefined){h={}}$("div.historyItemBody:visible").each(function(){if($.browser.mozilla){$(this).find("pre.peek").css("overflow","hidden")}$(this).slideUp("fast");if(h){delete h[$(this).parent().attr("id")]}});$.jStore.store("history_expand_state",h)}).show()};if(a){b()}else{$.jStore.init("galaxy");$.jStore.ready(function(){b()})}}function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}function reset_tool_search(a){var c=$("#galaxy_tools").contents();if(c.length===0){c=$(document)}$(this).removeClass("search_active");c.find(".toolTitle").removeClass("search_match");c.find(".toolSectionBody").hide();c.find(".toolTitle").show();c.find(".toolPanelLabel").show();c.find(".toolSectionWrapper").each(function(){if($(this).attr("id")!="recently_used_wrapper"){$(this).show()}else{if($(this).hasClass("user_pref_visible")){$(this).show()}}});c.find("#search-no-results").hide();c.find("#search-spinner").hide();if(a){var b=c.find("#tool-search-query");b.val("search tools");b.css("font-style","italic")}}var GalaxyAsync=function(a){this.url_dict={};this.log_action=(a===undefined?false:a)};GalaxyAsync.prototype.set_func_url=function(a,b){this.url_dict[a]=b};GalaxyAsync.prototype.set_user_pref=function(a,b){var c=this.url_dict[arguments.callee];if(c===undefined){return false}$.ajax({url:c,data:{pref_name:a,pref_value:b},error:function(){return false},success:function(){return true}})};GalaxyAsync.prototype.log_user_action=function(c,b,d){if(!this.log_action){return}var a=this.url_dict[arguments.callee];if(a===undefined){return false}$.ajax({url:a,data:{action:c,context:b,params:d},error:function(){return false},success:function(){return true}})};$(document).ready(function(){$("select[refresh_on_change='true']").change(function(){var a=$(this),e=a.val(),d=false,c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var b=a.attr("last_selected_value");if($.inArray(e,c)===-1&&$.inArray(b,c)===-1){return}}$(window).trigger("refresh_on_change");$(document).trigger("convert_to_values");a.get(0).form.submit()});$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus();replace_big_select_inputs(20,1500);$("a").click(function(){var b=$(this);var c=(parent.frames&&parent.frames.galaxy_main);if((b.attr("target")=="galaxy_main")&&(!c)){var a=b.attr("href");if(a.indexOf("?")==-1){a+="?"}else{a+="&"}a+="use_panels=True";b.attr("href",a);b.attr("target","_self")}return b})});
\ No newline at end of file
+if(!Array.indexOf){Array.prototype.indexOf=function(c){for(var b=0,a=this.length;b<a;b++){if(this[b]==c){return b}}return -1}}function obj_length(c){if(c.length!==undefined){return c.length}var b=0;for(var a in c){b++}return b}$.fn.makeAbsolute=function(a){return this.each(function(){var b=$(this);var c=b.position();b.css({position:"absolute",marginLeft:0,marginTop:0,top:c.top,left:c.left,right:$(window).width()-(c.left+b.width())});if(a){b.remove().appendTo("body")}})};function show_hide_popupmenu_options(d,c,a){a=(a===undefined?true:a);var b=new RegExp(c);$(d).find("li").each(function(){if(b.exec($(this).text())){if(a){$(this).show()}else{$(this).hide()}}})}function make_popupmenu(a,b){a.data("menu_options",b);a.bind("click.show_popup",function(c){$(".popmenu-wrapper").remove();setTimeout(function(){var f=$("<ul id='"+a.attr("id")+"-menu'></ul>");var e=a.data("menu_options");if(obj_length(e)<=0){$("<li>No Options.</li>").appendTo(f)}$.each(e,function(i,h){if(h){$("<li/>").html(i).click(h).appendTo(f)}else{$("<li class='head'/>").html(i).appendTo(f)}});var g=$("<div class='popmenu-wrapper' style='position: absolute;left: 0; top: -1000;'>");g.append(f).append("<div class='overlay-border'>").appendTo("body");var d=c.pageX-g.width()/2;d=Math.min(d,$(document).scrollLeft()+$(window).width()-$(g).width()-20);d=Math.max(d,$(document).scrollLeft()+20);g.css({top:c.pageY-5,left:d})},10);setTimeout(function(){var e=function(g){$(g).bind("click.close_popup",function(){$(".popmenu-wrapper").remove();g.unbind("click.close_popup")})};e($(window.document));e($(window.top.document));for(var d=window.top.frames.length;d--;){var f=$(window.top.frames[d].document);e(f)}},50);return false})}function make_popup_menus(){jQuery("div[popupmenu]").each(function(){var a={};var c=$(this);c.find("a").each(function(){var f=$(this),h=f.get(0);var d=h.getAttribute("confirm"),e=h.getAttribute("href"),g=h.getAttribute("target");if(!e){a[f.text()]=null}else{a[f.text()]=function(){if(!d||confirm(d)){var i;if(g=="_parent"){window.parent.location=e}else{if(g=="_top"){window.top.location=e}else{if(g=="demo"){if(i==undefined||i.closed){i=window.open(e,g);i.creator=self}}else{window.location=e}}}}}}});var b=$("#"+c.attr("popupmenu"));b.find("a").bind("click",function(d){d.stopPropagation();return true});make_popupmenu(b,a);b.addClass("popup");c.remove()})}function naturalSort(j,h){var p=/(-?[0-9\.]+)/g,k=j.toString().toLowerCase()||"",g=h.toString().toLowerCase()||"",l=String.fromCharCode(0),n=k.replace(p,l+"$1"+l).split(l),e=g.replace(p,l+"$1"+l).split(l),d=(new Date(k)).getTime(),o=d?(new Date(g)).getTime():null;if(o){if(d<o){return -1}else{if(d>o){return 1}}}var m,f;for(var i=0,c=Math.max(n.length,e.length);i<c;i++){m=parseFloat(n[i])||n[i];f=parseFloat(e[i])||e[i];if(m<f){return -1}else{if(m>f){return 1}}}return 0}function replace_big_select_inputs(a,b){if(!jQuery().autocomplete){return}if(a===undefined){a=20}if(b===undefined){b=3000}$("select").each(function(){var d=$(this);var g=d.find("option").length;if((g<a)||(g>b)){return}if(d.attr("multiple")===true){return}if(d.hasClass("no-autocomplete")){return}var m=d.attr("value");var c=$("<input type='text' class='text-and-autocomplete-select'></input>");c.attr("size",40);c.attr("name",d.attr("name"));c.attr("id",d.attr("id"));c.click(function(){var n=$(this).val();$(this).val("Loading...");$(this).showAllInCache();$(this).val(n);$(this).select()});var e=[];var i={};d.children("option").each(function(){var o=$(this).text();var n=$(this).attr("value");e.push(o);i[o]=n;i[n]=n;if(n==m){c.attr("value",o)}});if(m===""||m==="?"){c.attr("value","Click to Search or Select")}if(d.attr("name")=="dbkey"){e=e.sort(naturalSort)}var f={selectFirst:false,autoFill:false,mustMatch:false,matchContains:true,max:b,minChars:0,hideForLessThanMinChars:false};c.autocomplete(e,f);d.replaceWith(c);var k=function(){var o=c.attr("value");var n=i[o];if(n!==null&&n!==undefined){c.attr("value",n)}else{if(m!==""){c.attr("value",m)}else{c.attr("value","?")}}};c.parents("form").submit(function(){k()});$(document).bind("convert_to_values",function(){k()});if(d.attr("refresh_on_change")=="true"){var h=d.attr("refresh_on_change_values"),l=d.attr("last_selected_value");if(h!==undefined){h=h.split(",")}var j=function(){var n=i[c.attr("value")];if(l!==n&&n!==null&&n!==undefined){if(h!==undefined&&$.inArray(n,h)===-1&&$.inArray(l,h)===-1){return}c.attr("value",n);$(window).trigger("refresh_on_change");c.parents("form").submit()}};c.bind("result",j);c.keyup(function(n){if(n.keyCode===13){j()}});c.keydown(function(n){if(n.keyCode===13){return false}})}})}function async_save_text(d,f,e,a,c,h,i,g,b){if(c===undefined){c=30}if(i===undefined){i=4}$("#"+d).live("click",function(){if($("#renaming-active").length>0){return}var l=$("#"+f),k=l.text(),j;if(h){j=$("<textarea></textarea>").attr({rows:i,cols:c}).text($.trim(k))}else{j=$("<input type='text'></input>").attr({value:$.trim(k),size:c})}j.attr("id","renaming-active");j.blur(function(){$(this).remove();l.show();if(b){b(j)}});j.keyup(function(n){if(n.keyCode===27){$(this).trigger("blur")}else{if(n.keyCode===13){var m={};m[a]=$(this).val();$(this).trigger("blur");$.ajax({url:e,data:m,error:function(){alert("Text editing for elt "+f+" failed")},success:function(o){if(o!==""){l.text(o)}else{l.html("<em>None</em>")}if(b){b(j)}}})}}});if(g){g(j)}l.hide();j.insertAfter(l);j.focus();j.select();return})}function init_history_items(d,a,c){var b=function(){try{var e=$.jStorage.get("history_expand_state");if(e){for(var g in e){$("#"+g+" div.historyItemBody").show()}}}catch(f){$.jStorage.deleteKey("history_expand_state")}if($.browser.mozilla){$("div.historyItemBody").each(function(){if(!$(this).is(":visible")){$(this).find("pre.peek").css("overflow","hidden")}})}d.each(function(){var j=this.id,h=$(this).children("div.historyItemBody"),i=h.find("pre.peek");$(this).find(".historyItemTitleBar > .historyItemTitle").wrap("<a href='javascript:void(0);'></a>").click(function(){var k;if(h.is(":visible")){if($.browser.mozilla){i.css("overflow","hidden")}h.slideUp("fast");if(!c){k=$.jStorage.get("history_expand_state");if(k){delete k[j];$.jStorage.set("history_expand_state",k)}}}else{h.slideDown("fast",function(){if($.browser.mozilla){i.css("overflow","auto")}});if(!c){k=$.jStorage.get("history_expand_state");if(!k){k={}}k[j]=true;$.jStorage.set("history_expand_state",k)}}return false})});$("#top-links > a.toggle").click(function(){var h=$.jStorage.get("history_expand_state");if(!h){h={}}$("div.historyItemBody:visible").each(function(){if($.browser.mozilla){$(this).find("pre.peek").css("overflow","hidden")}$(this).slideUp("fast");if(h){delete h[$(this).parent().attr("id")]}});$.jStorage.set("history_expand_state",h)}).show()};b()}function commatize(b){b+="";var a=/(\d+)(\d{3})/;while(a.test(b)){b=b.replace(a,"$1,$2")}return b}function reset_tool_search(a){var c=$("#galaxy_tools").contents();if(c.length===0){c=$(document)}$(this).removeClass("search_active");c.find(".toolTitle").removeClass("search_match");c.find(".toolSectionBody").hide();c.find(".toolTitle").show();c.find(".toolPanelLabel").show();c.find(".toolSectionWrapper").each(function(){if($(this).attr("id")!="recently_used_wrapper"){$(this).show()}else{if($(this).hasClass("user_pref_visible")){$(this).show()}}});c.find("#search-no-results").hide();c.find("#search-spinner").hide();if(a){var b=c.find("#tool-search-query");b.val("search tools");b.css("font-style","italic")}}var GalaxyAsync=function(a){this.url_dict={};this.log_action=(a===undefined?false:a)};GalaxyAsync.prototype.set_func_url=function(a,b){this.url_dict[a]=b};GalaxyAsync.prototype.set_user_pref=function(a,b){var c=this.url_dict[arguments.callee];if(c===undefined){return false}$.ajax({url:c,data:{pref_name:a,pref_value:b},error:function(){return false},success:function(){return true}})};GalaxyAsync.prototype.log_user_action=function(c,b,d){if(!this.log_action){return}var a=this.url_dict[arguments.callee];if(a===undefined){return false}$.ajax({url:a,data:{action:c,context:b,params:d},error:function(){return false},success:function(){return true}})};$(document).ready(function(){$("select[refresh_on_change='true']").change(function(){var a=$(this),e=a.val(),d=false,c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var b=a.attr("last_selected_value");if($.inArray(e,c)===-1&&$.inArray(b,c)===-1){return}}$(window).trigger("refresh_on_change");$(document).trigger("convert_to_values");a.get(0).form.submit()});$("a[confirm]").click(function(){return confirm($(this).attr("confirm"))});if($.fn.tipsy){$(".tooltip").tipsy({gravity:"s"})}make_popup_menus();replace_big_select_inputs(20,1500);$("a").click(function(){var b=$(this);var c=(parent.frames&&parent.frames.galaxy_main);if((b.attr("target")=="galaxy_main")&&(!c)){var a=b.attr("href");if(a.indexOf("?")==-1){a+="?"}else{a+="&"}a+="use_panels=True";b.attr("href",a);b.attr("target","_self")}return b})});
\ No newline at end of file
--- a/static/scripts/packed/jquery.jstore.js Fri Feb 18 14:53:35 2011 -0500
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,17 +0,0 @@
-/*
- * jStore 2.0 - Persistent Client Side Storage
- *
- * Copyright (c) 2010 Eric Garside (http://eric.garside.name/)
- * Dual licensed under:
- * MIT: http://www.opensource.org/licenses/mit-license.php
- * GPLv3: http://www.opensource.org/licenses/gpl-3.0.html
- *
- * ---------------------------
- *
- * jStore Flash Storage Component
- *
- * Copyright (c) 2006 Jeff Lerman (jeff(a)blip.tv)
- * Licensed under the Creative Commons Attribution 3.0 United States License:
- * http://creativecommons.org/licenses/by/3.0/us
- */
-(function(i,n){var h="JSTORE_ENGINE_UNSTABLE",t="JSTORE_UNKNOWN_ENGINE_REQUESTED",r="JSTORE_ENGINE_NAMESPACE_COLLISION",j="JSTORE_RESOURCE_NAMESPACE_COLLISION",m="JSTORE_ENGINE_UNAVAILABLE",o="JSTORE_INVALID_FLAVOR",f=(function(){try{return new RegExp('^("(\\\\.|[^"\\\\\\n\\r])*?"|[,:{}\\[\\]0-9.\\-+Eaeflnr-u \\n\\r\\t])+?$')}catch(I){return(/^(true|false|null|\[.*\]|\{.*\}|".*"|\d+|\d+\.\d+)$/)}}()),b="jstore-html5-local",y="jstore-html5-sql",F="jstore-flash",G="jstore-google-gears",A="jstore-msie",u,E={},D={},C={},c=false,d={},q={project:undefined,flash:"jStore.Flash.html",json:"browser.json.js"},l;function z(I){switch(I){case b:case y:case F:case G:case A:return true;default:return false}}function g(I,J){return !I?false:I.constructor.toString().match(new RegExp(J+"\\(\\)","i"))!==null}function s(K,I,J){if(g(K,"Function")){return K.apply(I||E,g(J,"Array")?J:[J])}}function p(J,I){i.ajax({url:J,complete:I||i.noop(),type:"GET",dataType:"script",cache:false})}function x(I){if(I===undefined){return""}if(g(I,"Object")||g(I,"Array")||g(I,"Function")){return JSON.stringify(I)}return I}function k(I){return f.test(I)?JSON.parse(I):I}function w(I){return I.replace(/^\s+|\s+$/g,"")}function e(I,J,K){if(!z(I)){throw o}if(K[I]!==undefined){throw r}if(s(K)===true){E.available[I]=true;J.flavor=I;D[I]=u.extend(J)}else{E.available[I]=false;E.enginePriority=i.map(E.enginePriority,function(L){if(L===I){return null}else{return L}})}}function v(){if(E.isReady){return}if((c&&E.isFlashReady)||!c){E.isReady=true;E.trigger("jstore-ready",[C[l]])}}function a(){E.create(E.enginePriority[0],undefined,"best-fit")}function H(){try{var J=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");try{J.AllowScriptAccess="always"}catch(L){return"6,0,0"}return new ActiveXObject("ShockwaveFlash.ShockwaveFlash").GetVariable("$version").replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}catch(K){try{if(navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin){return(navigator.plugins["Shockwave Flash 2.0"]||navigator.plugins["Shockwave Flash"]).description.replace(/\D+/g,",").match(/^,?(.+),?$/)[1]}}catch(I){}}return"0,0,0"}function B(I){var N=H().match(/\d+/g),L=I.match(/\d+/g),J=0,K,M;for(;J<3;J++){K=parseInt(N[J],10);M=parseInt(L[J],10);if(K<M){return false}else{if(K>M){return true}}}return true}i.extend(E,{enginePriority:[b,y,F,A],available:{},isReady:false,isFlashReady:false,flavors:{local:b,sql:y,flash:F,gears:G,msie:A},init:function(J,K,I){i.extend(q,{project:J},K);i(function(){if(n.JSON===undefined){p(q.json)}if(I!==undefined){E.create(I,J,"default")}else{a()}});return E},create:function(I,M,J){M=M||q.project||location.hostname.replace(/\./g,"-")||"unknown";if(!z(I)){throw o}if(D[I]===undefined){throw m}var L=(J!==undefined?J+".":"")+M+"."+I,K;if(C[L]!==undefined){throw j}K=C[L]=new D[I](M,L);K.ready(function(){E.trigger("jstore-engine-ready",[K])});if(I===F&&!E.isFlashReady){if(l===undefined){c=true}n.jstore_ready=function(){E.isFlashReady=true;E.trigger("flash-ready");if(l===undefined){v()}n.flash_ready=undefined};n.jstore_error=function(N){E.trigger("jstore-error",["JSTORE_FLASH_EXCEPTION",null,N])};i('<iframe style="height:1px;width:1px;position:absolute;left:0;top:0;margin-left:-100px;" id="jStoreFlashFrame" src="'+q.flash+'"></iframe>').appendTo("body")}else{if(l===undefined){l=L;v()}}return K},engine:function(I){return C[I]},activeEngine:function(I){if(I!==undefined){if(C[I]===undefined){throw t}else{l=I}}return C[l]},bind:function(J,K,I){I=I||"jstore";if(d[I]===undefined){d[I]={}}if(d[I][J]===undefined){d[I][J]=[K]}else{d[I][J].push(K)}return E},trigger:function(K,J,I){I=I||"jstore";if(d[I]!==undefined){if(d[I][K]!==undefined){i.each(d[I][K],function(){s(this,E,J)})}}return E},error:function(I){E.bind("jstore-error",I)},ready:function(I){if(E.isReady){s(I)}else{E.bind("jstore-ready",I)}return E},engineReady:function(I){if(E.isReady){s(I)}else{E.bind("jstore-engine-ready",I)}return E},store:function(I,J){return J===undefined?E.get(I):E.set(I,J)},remove:function(I){return E.activeEngine().remove(I)},get:function(I){return E.activeEngine().get(I)},set:function(I,J){return E.activeEngine().set(I,J)}});u=Class.extend({project:undefined,jri:undefined,flavor:undefined,database:undefined,data:undefined,limit:undefined,isReady:undefined,init:function(J,I){this.project=J;this.jri=I;this.data={};this.isReady=false;this.updateCache()},updateCache:function(){this.isReady=true;this.trigger("engine-ready",[this])},bind:function(I,J){E.bind(I,J,this.jri)},trigger:function(J,I){E.trigger(J,I,this.jri)},ready:function(I){if(this.isReady){s(I,this)}else{this.bind("engine-ready",I)}},get:function(I){this.__interruptAccess();return this.data[I]},set:function(I,J){this.__interruptAccess();I=w(I);try{this.__set(I,J)}catch(K){E.trigger("jstore-error",["JSTORE_STORAGE_FAILURE",this.jri,K])}this.data[I]=J;return J},remove:function(J){this.__interruptAccess();J=w(J);try{this.__remove(J)}catch(K){E.trigger("jstore-error",["JSTORE_REMOVE_FAILURE",this.jri,K])}var I=this.data[J];this.data[J]=undefined;return I},__interruptAccess:function(){if(!this.isReady){throw h}},__set:function(I,J){return},__remove:function(I){return}});i.extend(i.fn,{store:function(I,J){if(J===undefined){E.get(I)}else{E.set(I,J)}return this},removeStore:function(I){E.activeEngine().remove(I);return this},getStore:function(I){return E.activeEngine().get(I)},setStore:function(I,J){E.activeEngine().set(I,J);return this}});n.jStore=i.jStore=E;e(b,{limit:parseInt(500000,16),init:function(J,I){this.database=n.globalStorage===undefined?n.localStorage:n.globalStorage[location.hostname];this._super(J,I)},updateCache:function(){var J,K;for(J in this.database){var I=false;if(this.database.hasOwnProperty){if(this.database.hasOwnProperty(J)){I=true}}else{if(this.database.getItem(J)!==null){I=true}}if(I){K=this.database.getItem(J);this.data[J]=k(K&&K.value?K.value:K)}}this._super()},__set:function(I,J){this.database.setItem(I,x(J))},__remove:function(I){this.database.removeItem(I)}},function(){return n.localStorage!==undefined||n.globalStorage!==undefined});e(y,{limit:parseInt(32000,16),init:function(J,I){this.database=n.openDatabase("jstore-"+J,"1.0",J,this.limit);if(!this.database){throw"JSTORE_SQL_NO_DB"}this.database.transaction(function(K){K.executeSql("CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)")});this._super(J,I)},updateCache:function(){var I=this,J=this._super;this.database.transaction(function(K){K.executeSql("SELECT k,v FROM jstore",[],function(O,L){var N=L.rows,M=0,P;for(;M<N.length;++M){P=N.item(M);I.data[P.k]=k(P.v)}J.apply(I)})})},__set:function(I,J){this.database.transaction(function(K){K.executeSql("INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)",[I,x(J)])})},__remove:function(I){this.database.transaction(function(J){J.executeSql("DELETE FROM jstore WHERE k = ?",[I])})}},function(){return n.openDatabase!==undefined});e(F,{limit:-1,init:function(K,J){var I=this;E.bind("flash-ready",function(){I.__flashReadyListener()});this._super(K,J)},updateCache:function(I){if(I===true){var J,K=this.database.jstore_get_all();for(J in K){if(K.hasOwnProperty(J)){this.data[J]=k(this.database.jstore_get(J))}}this._super()}},__set:function(I,J){if(!this.database.jstore_set(I,x(J))){E.trigger("jstore-error",["JSTORE_STORAGE_FAILURE",this.jri,"Flash Exception"])}},__remove:function(I){this.database.jstore_remove(I)},__flashReadyListener:function(){var I=i("#jStoreFlashFrame")[0],J;if(I.Document!==undefined&&g(I.Document.jStoreFlash.jstore_get,"Function")){this.database=I.Document.jStoreFlash}else{if(I.contentWindow&&I.contentWindow.document){J=i(I.contentWindow.document);if(g(i("object",J)[0].jstore_get,"Function")){this.database=i("object",J)[0]}else{if(g(i("embed",J)[0].jstore_get,"Function")){this.database=i("embed",J)[0]}}}}if(this.database===undefined){throw"JSTORE_FLASH_REFERENCE_ISSUE"}else{this.updateCache(true)}}},function(){return B("9.0.0")});e(G,{limit:-1,init:function(J,I){this.database=google.gears.factory.create("beta.database");this.database.open("jstore-"+J);this.database.execute("CREATE TABLE IF NOT EXISTS jstore (k TEXT UNIQUE NOT NULL PRIMARY KEY, v TEXT NOT NULL)");this._super(J,I)},updateCache:function(){var I=this.database.execute("SELECT k,v FROM jstore");while(I.isValidRow()){this.data[I.field(0)]=k(I.field(1));I.next()}I.close();this._super()},__set:function(I,J){this.database.execute("BEGIN");this.database.execute("INSERT OR REPLACE INTO jstore(k, v) VALUES (?, ?)",[I,x(J)]);this.database.execute("COMMIT")},__remove:function(I){this.database.execute("BEGIN");this.database.execute("DELETE FROM jstore WHERE k = ?",[I]);this.database.execute("COMMIT")}},function(){return n.google!==undefined&&n.google.gears!==undefined});e(A,{limit:parseInt(10000,16),init:function(J,I){this.database=i('<div style="display:none;behavior:url(\'#default#userData\')" id="jstore-'+J+'"></div>').appendTo(document.body).get(0);this._super(J,I)},updateCache:function(){this.database.load(this.project);var K=document.getElementById("jstore-"+this.project),L=K.XMLDocument,I,J=0;if(L&&L.documentElement&&L.documentElement.attributes){I=L.documentElement;for(;J<I.attributes.length;++J){this.data[I.attributes.item(J).nodeName]=k(I.attributes.item(J).nodeValue)}}this._super()},__set:function(I,J){this.database.setAttribute(I,x(J));this.database.save(this.project)},__remove:function(I){this.database.removeAttribute(I);this.database.save(this.project)}},function(){return n.ActiveXObject!==undefined})}(jQuery,window));
\ No newline at end of file
--- a/templates/display_base.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/display_base.mako Fri Feb 18 15:06:34 2011 -0500
@@ -32,7 +32,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "class", "jquery.jstore", "jquery.autocomplete", "jquery.rating", "autocomplete_tagging", "trackster" )}
+ ${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "jstorage", "jquery.autocomplete", "jquery.rating", "autocomplete_tagging", "trackster" )}
<script type="text/javascript">
--- a/templates/history/view.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/history/view.mako Fri Feb 18 15:06:34 2011 -0500
@@ -5,7 +5,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "galaxy.base", "jquery", "json2", "class", "jquery.jstore" )}
+ ${h.js( "galaxy.base", "jquery", "json2", "jstorage" )}
<script type="text/javascript">
$(function() {
init_history_items( $("div.historyItemWrapper"), false, "nochanges" );
--- a/templates/library/common/browse_library.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/library/common/browse_library.mako Fri Feb 18 15:06:34 2011 -0500
@@ -48,7 +48,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js("class", "jquery.jstore")}
+ ${h.js("json2", "jstorage")}
${common_javascripts()}
${self.grid_javascripts()}
</%def>
@@ -56,11 +56,10 @@
<%def name="grid_javascripts()"><script type="text/javascript">
$(function() {
- $.jStore.init("galaxy"); // Auto-select best storage
var storage_id = "library-expand-state-${trans.security.encode_id(library.id)}";
var restore_folder_state = function() {
- var state = $.jStore.store(storage_id);
+ var state = $.jStorage.get(storage_id);
if (state) {
for (var id in state) {
if (state[id] === true) {
@@ -79,7 +78,7 @@
var folder = $(this);
state[folder.attr("id")] = folder.hasClass("expanded");
});
- $.jStore.store(storage_id, state);
+ $.jStorage.set(storage_id, state);
};
$("#library-grid").each(function() {
@@ -131,10 +130,10 @@
// Initialize dict[parent_id] = rows_which_have_that_parent_id_as_parent_attr
var par_child_dict = {},
no_parent = [];
-
+
$(this).find("tbody tr").each( function() {
- if (this.hasAttribute("parent")) {
- var parent = this.getAttribute("parent");
+ if ( $(this).attr("parent")) {
+ var parent = $(this).attr("parent");
if (par_child_dict[parent] !== undefined) {
par_child_dict[parent].push(this);
} else {
@@ -151,9 +150,7 @@
});
});
- $.jStore.engineReady(function() {
- restore_folder_state();
- });
+ restore_folder_state();
});
// Looks for changes in dataset state using an async request. Keeps
--- a/templates/library/common/library_dataset_search_results.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/library/common/library_dataset_search_results.mako Fri Feb 18 15:06:34 2011 -0500
@@ -46,7 +46,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js("class", "jquery.jstore")}
+ ${h.js("jstorage")}
${common_javascripts()}
</%def>
--- a/templates/page/editor.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/page/editor.mako Fri Feb 18 15:06:34 2011 -0500
@@ -21,7 +21,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "jquery.event.drag", "jquery.event.drop", "jquery.event.hover", "jquery.form", "class", "jquery.jstore", "json2",
+ ${h.js( "jquery.event.drag", "jquery.event.drop", "jquery.event.hover", "jquery.form", "json2", "jstorage"
"galaxy.base", "jquery.wymeditor", "jquery.autocomplete", "autocomplete_tagging")}
<script type="text/javascript">
--- a/templates/root/history.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/root/history.mako Fri Feb 18 15:06:34 2011 -0500
@@ -15,7 +15,7 @@
<meta http-equiv="Pragma" content="no-cache">
${h.css( "base", "history", "autocomplete_tagging" )}
-${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "class", "jquery.jstore", "jquery.autocomplete", "autocomplete_tagging" )}
+${h.js( "jquery", "jquery.tipsy", "galaxy.base", "json2", "jstorage", "jquery.autocomplete", "autocomplete_tagging" )}
<script type="text/javascript">
--- a/templates/workflow/editor.mako Fri Feb 18 14:53:35 2011 -0500
+++ b/templates/workflow/editor.mako Fri Feb 18 15:06:34 2011 -0500
@@ -31,9 +31,8 @@
"jquery.event.drop",
"jquery.event.hover",
"jquery.form",
- "class",
"json2",
- "jquery.jstore",
+ "jstorage",
"galaxy.base",
"galaxy.workflow_editor.canvas",
"jquery.autocomplete",
@@ -177,9 +176,6 @@
});
%endif
- // Load jStore for local storage
- $.jStore.init("galaxy"); // Auto-select best storage
-
// Canvas overview management
canvas_manager = new CanvasManager( $("#canvas-viewport"), $("#overview") );
@@ -309,23 +305,21 @@
}
- $.jStore.ready(function() {
- // On load, set the size to the pref stored in local storage if it exists
- overview_size = $.jStore.store("overview-size");
- if (overview_size !== undefined) {
- $("#overview-border").css( {
- width: overview_size,
- height: overview_size
- });
- }
-
- // Show viewport on load unless pref says it's off
- if ($.jStore.store("overview-off")) {
- hide_overview();
- } else {
- show_overview();
- }
- });
+ // On load, set the size to the pref stored in local storage if it exists
+ overview_size = $.jStorage.get("overview-size");
+ if (overview_size !== undefined) {
+ $("#overview-border").css( {
+ width: overview_size,
+ height: overview_size
+ });
+ }
+
+ // Show viewport on load unless pref says it's off
+ if ($.jStorage.get("overview-off")) {
+ hide_overview();
+ } else {
+ show_overview();
+ }
// Stores the size of the overview into local storage when it's resized
$("#overview-border").bind( "dragend", function( e, d ) {
@@ -333,17 +327,17 @@
var opo = op.offset();
var new_size = Math.max( op.width() - ( d.offsetX - opo.left ),
op.height() - ( d.offsetY - opo.top ) );
- $.jStore.store("overview-size", new_size + "px");
+ $.jStorage.set("overview-size", new_size + "px");
});
function show_overview() {
- $.jStore.remove("overview-off");
+ $.jStorage.set("overview-off", false);
$("#overview-border").css("right", "0px");
$("#close-viewport").css("background-position", "0px 0px");
}
function hide_overview() {
- $.jStore.store("overview-off", true);
+ $.jStorage.set("overview-off", true);
$("#overview-border").css("right", "20000px");
$("#close-viewport").css("background-position", "12px 0px");
}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0