galaxy-commits
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 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
commit/galaxy-central: dannon: Workflow Parameter bugfix for the case when a parameter isn't used in
by Bitbucket 15 Apr '11
by Bitbucket 15 Apr '11
15 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/6cacf178a129/
changeset: r5400:6cacf178a129
user: dannon
date: 2011-04-15 05:40:19
summary: Workflow Parameter bugfix for the case when a parameter isn't used in
any workflow step, but should still be available for PJAs.
affected #: 1 file (62 bytes)
--- a/templates/workflow/run.mako Thu Apr 14 20:25:54 2011 -0400
+++ b/templates/workflow/run.mako Thu Apr 14 23:40:19 2011 -0400
@@ -165,7 +165,7 @@
wf_parms = {}
for step in steps:
- for v in step.state.inputs.itervalues():
+ for v in [ActionBox.get_short_str(pja) for pja in step.post_job_actions] + step.state.inputs.values():
if isinstance(v, basestring):
for rematch in re.findall('\$\{.+?\}', v):
if rematch[2:-1] not in wf_parms:
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/92ac18adbdc5/
changeset: r5399:92ac18adbdc5
user: kanwei
date: 2011-04-15 02:25:54
summary: trackster:
- UI support for adding datasets from Data Libraries
- Cleaner, more consistent "Add Tracks" dialog that implements above
Sync .css changes with their corresponding .css.tmpl template
affected #: 12 files (3.1 KB)
--- a/lib/galaxy/web/controllers/tracks.py Thu Apr 14 16:51:40 2011 -0400
+++ b/lib/galaxy/web/controllers/tracks.py Thu Apr 14 20:25:54 2011 -0400
@@ -60,7 +60,6 @@
datasets_param = "f-history"
columns = [
NameColumn( "History Name", key="name", filterable="standard" ),
- grids.GridColumn( "Last Updated", key="update_time", format=time_ago ),
DbKeyPlaceholderColumn( "Dbkey", key="dbkey", model_class=model.HistoryDatasetAssociation, visible=False )
]
num_rows_per_page = 10
@@ -80,8 +79,7 @@
datasets_action = 'list_library_datasets'
datasets_param = "f-library"
columns = [
- NameColumn( "Library Name", key="name", filterable="standard" ),
- grids.GridColumn( "Description", key="description" )
+ NameColumn( "Library Name", key="name", filterable="standard" )
]
num_rows_per_page = 10
use_async = True
@@ -601,7 +599,7 @@
"""List a library's datasets that can be added to a visualization."""
library = trans.sa_session.query( trans.app.model.Library ).get( trans.security.decode_id( kwargs.get('f-library') ) )
- return trans.fill_template( '/library/common/browse_library.mako',
+ return trans.fill_template( '/tracks/library_datasets_select_grid.mako',
cntrller="library",
use_panels=False,
library=library,
--- a/static/june_2007_style/base.css.tmpl Thu Apr 14 16:51:40 2011 -0400
+++ b/static/june_2007_style/base.css.tmpl Thu Apr 14 20:25:54 2011 -0400
@@ -947,4 +947,21 @@
-sprite-image: fugue/control-270.png;
-sprite-horiz-position: right;
}
+.icon-button.multiinput{
+ background:url(../images/documents-stack.png) no-repeat;
+ cursor:pointer;
+ float:none;
+ display:inline-block;
+ margin-left:10px;
+}
+.icon-button.multiinput.disabled{
+ background:url(../images/documents-stack-faded.png) no-repeat;
+ cursor:auto;
+}
+.workflow-invocation-complete{
+ border:solid 1px #6A6;
+ border-left-width:5px;
+ margin:10px 0;
+ padding-left:5px;
+}
--- a/static/june_2007_style/blue/panel_layout.css Thu Apr 14 16:51:40 2011 -0400
+++ b/static/june_2007_style/blue/panel_layout.css Thu Apr 14 20:25:54 2011 -0400
@@ -27,7 +27,7 @@
.dialog-box-container{position:relative;margin-top:80px;margin-right:auto;margin-left:auto;}
.dialog-box-wrapper{position:relative;padding:1em;background-color:rgba(0,0,0,0.5);-moz-border-radius:1em;-webkit-border-radius:1em;}
.dialog-box{border:solid #999 1px;background:white;z-index:80000;}
-.dialog-box .body{padding:5px;overflow:auto;max-height:500px;}
+.dialog-box .body{padding:5px;overflow:auto;max-height:500px;min-width:300px;}
.dialog-box .buttons{padding:5px;}
.panel-error-message,.panel-warning-message,.panel-done-message,.panel-info-message{height:24px;line-height:24px;color:#303030;padding:0px;padding-left:26px;background-color:#FFCCCC;background-image:url(error_small.png);background-repeat:no-repeat;background-position:6px 50%;}
.panel-warning-message{background-image:url(warn_small.png);background-color:#FFFFCC;}
--- a/static/june_2007_style/panel_layout.css.tmpl Thu Apr 14 16:51:40 2011 -0400
+++ b/static/june_2007_style/panel_layout.css.tmpl Thu Apr 14 20:25:54 2011 -0400
@@ -194,6 +194,7 @@
padding: 5px;
overflow: auto;
max-height: 500px;
+ min-width: 300px;
}
.dialog-box .buttons {
--- a/static/june_2007_style/trackster.css.tmpl Thu Apr 14 16:51:40 2011 -0400
+++ b/static/june_2007_style/trackster.css.tmpl Thu Apr 14 20:25:54 2011 -0400
@@ -170,17 +170,14 @@
.track.error .track-content {
background-color: #ECB4AF;
background-image: none;
- padding: 2px 0;
}
.track.nodata .track-content {
background-color: #eee;
background-image: none;
- padding: 2px 0;
}
.track.pending .track-content {
background-color: white;
background-image: none;
- padding: 2px 0;
}
.loading {
@@ -237,7 +234,7 @@
margin-top: 0.4em;
margin-left: 1em;
}
-.param-label, .slider-label {
+.slider-label {
float: left;
font-weight: bold;
}
--- a/static/scripts/packed/trackster.js Thu Apr 14 16:51:40 2011 -0400
+++ b/static/scripts/packed/trackster.js Thu Apr 14 20:25:54 2011 -0400
@@ -1,1 +1,1 @@
-var extend=function(){var c=arguments[0];for(var b=1;b<arguments.length;b++){var a=arguments[b];for(key in a){c[key]=a[key]}}return c};var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=BEFORE}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=AFTER}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a};var is_overlap=function(c,b){var a=compute_overlap(c,b);return(a!==BEFORE&&a!==AFTER)};var trackster_module=function(f,R){var p=f("slotting"),G=f("painters");var X=function(Y,Z){this.document=Y;this.default_font=Z!==undefined?Z:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};extend(X.prototype,{load_pattern:function(Y,ac){var Z=this.patterns,aa=this.dummy_context,ab=new Image();ab.src=image_path+ac;ab.onload=function(){Z[Y]=aa.createPattern(ab,"repeat")}},get_pattern:function(Y){return this.patterns[Y]},new_canvas:function(){var Y=this.document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(Y)}Y.manager=this;return Y}});var B=function(Y,Z){Y.bind("drag",{handle:Z,relative:true},function(ad,ae){var ac=$(this).parent();var ab=ac.children();var aa;for(aa=0;aa<ab.length;aa++){if(ae.offsetY<$(ab.get(aa)).position().top){break}}if(aa===ab.length){if(this!==ab.get(aa-1)){ac.append(this)}}else{if(this!==ab.get(aa)){$(this).insertBefore(ab.get(aa))}}})};var h=function(aa,Y){var Z=Y-aa;return(Z<=2?0.01:(Z<=100?1:(Z<=1000?5:10)))};var C=9,z=10,M=C+2,w=100,D=12000,K=200,s=10,F=5000,t=100,n="There was an error in indexing this dataset. ",E="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",A="No data for this chrom/contig.",q="Currently indexing... please wait",v="Tool cannot be rerun: ",a="Loading data...",S="Ready for display",d=10,r=5,y=5;function u(Y){return Math.round(Y*1000)/1000}var c=function(Y){this.num_elements=Y;this.clear()};extend(c.prototype,{get:function(Z){var Y=this.key_ary.indexOf(Z);if(Y!==-1){this.move_key_to_end(Z,Y)}return this.obj_cache[Z]},set:function(Z,aa){if(!this.obj_cache[Z]){if(this.key_ary.length>=this.num_elements){var Y=this.key_ary.shift();delete this.obj_cache[Y]}this.key_ary.push(Z)}this.obj_cache[Z]=aa;return aa},move_key_to_end:function(Z,Y){this.key_ary.splice(Y,1);this.key_ary.push(Z)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var L=function(Z,Y,aa){c.call(this,Z);this.track=Y;this.subset=(aa!==undefined?aa:true)};extend(L.prototype,c.prototype,{load_data:function(ag,ah,ac,af,Z,ae){if(this.track.track_type=="ReferenceTrack"&&Z>1){return}var ab={chrom:ag,low:ah,high:ac,mode:af,resolution:Z,dataset_id:this.track.dataset_id,hda_ldda:this.track.hda_ldda};$.extend(ab,ae);if(this.track.filters_manager){var ai=[];var Y=this.track.filters_manager.filters;for(var ad=0;ad<Y.length;ad++){ai[ai.length]=Y[ad].name}ab.filter_cols=JSON.stringify(ai)}var aa=this;return $.getJSON(this.track.data_url,ab,function(aj){aa.set_data(ah,ac,af,aj)})},get_data:function(aa,Y,ad,ae,Z,ac){var ab=this.get(this.gen_key(Y,ad,ae));if(ab){return ab}ab=this.load_data(aa,Y,ad,ae,Z,ac);this.set_data(Y,ad,ae,ab);return ab},set_data:function(Z,aa,ab,Y){return this.set(this.gen_key(Z,aa,ab),Y)},gen_key:function(Y,aa,ab){var Z=Y+"_"+aa+"_"+ab;return Z},split_key:function(Y){return Y.split("_")}});var W=function(Y,ab,aa,Z,ac){this.container=Y;this.chrom=null;this.vis_id=aa;this.dbkey=Z;this.title=ab;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(ac);this.canvas_manager=new X(Y.get(0).ownerDocument);this.reset()};extend(W.prototype,{init:function(ab){var aa=this.container,Y=this;this.top_container=$("<div/>").addClass("top-container").appendTo(aa);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(aa);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(aa);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_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var Z=function(ac){if(ac.type==="focusout"||(ac.keyCode||ac.which)===13||(ac.keyCode||ac.which)===27){if((ac.keyCode||ac.which)!==27){Y.go_to($(this).val())}$(this).hide();$(this).val("");Y.location_span.show();Y.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",Z).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){Y.location_span.hide();Y.chrom_select.hide();Y.nav_input.val(Y.chrom+":"+Y.low+"-"+Y.high);Y.nav_input.css("display","inline-block");Y.nav_input.select();Y.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){Y.zoom_out();Y.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){Y.zoom_in();Y.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},ab);this.chrom_select.bind("change",function(){Y.change_chrom(Y.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(ac){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(ac){Y.zoom_in(ac.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ac,ad){this.current_x=ad.offsetX}).bind("drag",function(ac,ae){var af=ae.offsetX-this.current_x;this.current_x=ae.offsetX;var ad=Math.round(af/Y.viewport_container.width()*(Y.max_high-Y.max_low));Y.move_delta(-ad)});this.overview_close.bind("click",function(){for(var ad=0,ac=Y.tracks.length;ad<ac;ad++){Y.tracks[ad].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",Y.overview_box.height());Y.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(ac,ad){if(ac.clientX>Y.viewport_container.width()-16){return false}}).bind("dragstart",function(ac,ad){ad.original_low=Y.low;ad.current_height=ac.clientY;ad.current_x=ad.offsetX}).bind("drag",function(ae,ag){var ac=$(this);var ah=ag.offsetX-ag.current_x;var ad=ac.scrollTop()-(ae.clientY-ag.current_height);ac.scrollTop(ad);ag.current_height=ae.clientY;ag.current_x=ag.offsetX;var af=Math.round(ah/Y.viewport_container.width()*(Y.high-Y.low));Y.move_delta(af)}).bind("mousewheel",function(ae,ag,ad,ac){if(ad){var af=Math.round(-ad/Y.viewport_container.width()*(Y.high-Y.low));Y.move_delta(af)}});this.top_labeltrack.bind("dragstart",function(ac,ad){return $("<div />").css({height:Y.content_div.height()+Y.top_labeltrack.height()+Y.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ag,ah){$(ah.proxy).css({left:Math.min(ag.pageX,ah.startX),width:Math.abs(ag.pageX-ah.startX)});var ad=Math.min(ag.pageX,ah.startX)-Y.container.offset().left,ac=Math.max(ag.pageX,ah.startX)-Y.container.offset().left,af=(Y.high-Y.low),ae=Y.viewport_container.width();Y.update_location(Math.round(ad/ae*af)+Y.low,Math.round(ac/ae*af)+Y.low)}).bind("dragend",function(ah,ai){var ad=Math.min(ah.pageX,ai.startX),ac=Math.max(ah.pageX,ai.startX),af=(Y.high-Y.low),ae=Y.viewport_container.width(),ag=Y.low;Y.low=Math.round(ad/ae*af)+ag;Y.high=Math.round(ac/ae*af)+ag;$(ai.proxy).remove();Y.redraw()});this.add_label_track(new V(this,this.top_labeltrack));this.add_label_track(new V(this,this.nav_labeltrack));$(window).bind("resize",function(){Y.resize_window()});$(document).bind("redraw",function(){Y.redraw()});this.reset();$(window).trigger("resize")},update_location:function(Y,Z){this.location_span.text(commatize(Y)+" - "+commatize(Z));this.nav_input.val(this.chrom+":"+commatize(Y)+"-"+commatize(Z))},load_chroms:function(Z,aa){Z.num=t;$.extend(Z,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var Y=this;$.ajax({url:chrom_url,data:Z,dataType:"json",success:function(ac){if(ac.chrom_info.length===0){alert("Invalid chromosome: "+Z.chrom);return}if(ac.reference){Y.add_label_track(new x(Y))}Y.chrom_data=ac.chrom_info;var af='<option value="">Select Chrom/Contig</option>';for(var ae=0,ab=Y.chrom_data.length;ae<ab;ae++){var ad=Y.chrom_data[ae].chrom;af+='<option value="'+ad+'">'+ad+"</option>"}if(ac.prev_chroms){af+='<option value="previous">Previous '+t+"</option>"}if(ac.next_chroms){af+='<option value="next">Next '+t+"</option>"}Y.chrom_select.html(af);if(aa){aa()}Y.chrom_start_index=ac.start_index},error:function(){alert("Could not load chroms for this dbkey:",Y.dbkey)}})},change_chrom:function(ac,Z,ae){if(!ac||ac==="None"){return}var ab=this;if(ac==="previous"){ab.load_chroms({low:this.chrom_start_index-t});return}if(ac==="next"){ab.load_chroms({low:this.chrom_start_index+t});return}var ad=$.grep(ab.chrom_data,function(ag,ah){return ag.chrom===ac})[0];if(ad===undefined){ab.load_chroms({chrom:ac},function(){ab.change_chrom(ac,Z,ae)});return}else{if(ac!==ab.chrom){ab.chrom=ac;if(!ab.chrom){ab.intro_div.show()}else{ab.intro_div.hide()}ab.chrom_select.val(ab.chrom);ab.max_high=ad.len-1;ab.reset();ab.redraw(true);for(var af=0,Y=ab.tracks.length;af<Y;af++){var aa=ab.tracks[af];if(aa.init){aa.init()}}}if(Z!==undefined&&ae!==undefined){ab.low=Math.max(Z,0);ab.high=Math.min(ae,ab.max_high)}ab.reset_overview();ab.redraw()}},go_to:function(ac){var ag=this,Y,ab,Z=ac.split(":"),ae=Z[0],af=Z[1];if(af!==undefined){try{var ad=af.split("-");Y=parseInt(ad[0].replace(/,/g,""),10);ab=parseInt(ad[1].replace(/,/g,""),10)}catch(aa){return false}}ag.change_chrom(ae,Y,ab)},move_fraction:function(aa){var Y=this;var Z=Y.high-Y.low;this.move_delta(aa*Z)},move_delta:function(aa){var Y=this;var Z=Y.high-Y.low;if(Y.low-aa<Y.max_low){Y.low=Y.max_low;Y.high=Y.max_low+Z}else{if(Y.high-aa>Y.max_high){Y.high=Y.max_high;Y.low=Y.max_high-Z}else{Y.high-=aa;Y.low-=aa}}Y.redraw()},add_track:function(Y){Y.view=this;Y.track_id=this.track_id_counter;this.tracks.push(Y);if(Y.init){Y.init()}Y.container_div.attr("id","track_"+Y.track_id);B(Y.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(Y){Y.view=this;this.label_tracks.push(Y)},remove_track:function(Y){this.has_changes=true;Y.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(Y)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(af){var ae=this.high-this.low,ad=this.low,Z=this.high;if(ad<this.max_low){ad=this.max_low}if(Z>this.max_high){Z=this.max_high}if(this.high!==0&&ae<this.min_separation){Z=ad+this.min_separation}this.low=Math.floor(ad);this.high=Math.ceil(Z);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/K)/Math.LN10));this.zoom_res=Math.pow(s,Math.max(0,Math.ceil(Math.log(this.resolution,s)/Math.log(s))));var Y=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ac=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ag=13;this.overview_box.css({left:Y,width:Math.max(ag,ac)}).show();if(ac<ag){this.overview_box.css("left",Y-(ag-ac)/2)}if(this.overview_highlight){this.overview_highlight.css({left:Y,width:ac})}this.update_location(this.low,this.high);if(!af){for(var aa=0,ab=this.tracks.length;aa<ab;aa++){if(this.tracks[aa]&&this.tracks[aa].enabled){this.tracks[aa].draw()}}for(aa=0,ab=this.label_tracks.length;aa<ab;aa++){this.label_tracks[aa].draw()}}},zoom_in:function(Z,aa){if(this.max_high===0||this.high-this.low<this.min_separation){return}var ab=this.high-this.low,ac=ab/2+this.low,Y=(ab/this.zoom_factor)/2;if(Z){ac=Z/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ac-Y);this.high=Math.round(ac+Y);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var Z=this.high-this.low,aa=Z/2+this.low,Y=(Z*this.zoom_factor)/2;this.low=Math.round(aa-Y);this.high=Math.round(aa+Y);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 o=function(Z,ac){this.track=Z;this.name=ac.name;this.params=[];var ak=ac.params;for(var aa=0;aa<ak.length;aa++){var af=ak[aa],Y=af.name,aj=af.label,ab=unescape(af.html),ah=af.type;if(ah==="number"){this.params[this.params.length]=new g(Y,aj,ab,af.min,af.max)}else{if(ah=="select"){this.params[this.params.length]=new I(Y,aj,ab)}else{console.log("WARNING: unrecognized tool parameter type:",Y,ah)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(am){am.stopPropagation()}).bind("click",function(am){am.stopPropagation()}).bind("dblclick",function(am){am.stopPropagation()});var ai=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var ag=this.params;var ad=this;$.each(this.params,function(an,aq){var ap=$("<div>").addClass("param-row").appendTo(ad.parent_div);var am=$("<div>").addClass("param-label").text(aq.label).appendTo(ap);var ao=$("<div/>").addClass("slider").html(aq.html).appendTo(ap);$("<div style='clear: both;'/>").appendTo(ap)});this.parent_div.find("input").click(function(){$(this).select()});var al=$("<div>").addClass("slider-row").appendTo(this.parent_div);var ae=$("<input type='submit'>").attr("value","Run").appendTo(al);var ad=this;ae.click(function(){ad.run()})};extend(o.prototype,{get_param_values_dict:function(){var Y={};this.parent_div.find(":input").each(function(){var Z=$(this).attr("name"),aa=$(this).val();Y[Z]=JSON.stringify(aa)});return Y},get_param_values:function(){var Z=[];var Y={};this.parent_div.find(":input").each(function(){var aa=$(this).attr("name"),ab=$(this).val();if(aa){Z[Z.length]=ab}});return Z},run:function(){var Z={dataset_id:this.track.original_dataset_id,chrom:this.track.view.chrom,low:this.track.view.low,high:this.track.view.high,tool_id:this.name};$.extend(Z,this.get_param_values_dict());var ab=this.track,aa=Z.tool_id+ab.tool_region_and_parameters_str(Z.chrom,Z.low,Z.high),ac;if(ab.track_type==="FeatureTrack"){ac=new O(aa,view,ab.hda_ldda,undefined,{},{},ab)}this.track.add_track(ac);ac.content_div.text("Starting job.");var Y=function(){$.getJSON(run_tool_url,Z,function(ad){if(ad==="no converter"){ac.container_div.addClass("error");ac.content_div.text(E)}else{if(ad.error){ac.container_div.addClass("error");ac.content_div.text(v+ad.message)}else{if(ad==="pending"){ac.container_div.addClass("pending");ac.content_div.text("Converting input data so that it can be easily reused.");setTimeout(Y,2000)}else{ac.dataset_id=ad.dataset_id;ac.content_div.text("Running job.");ac.init()}}}})};Y()}});var I=function(Z,Y,aa){this.name=Z;this.label=Y;this.html=aa};var g=function(aa,Z,ac,ab,Y){I.call(this,aa,Z,ac);this.min=ab;this.max=Y};var j=function(Z,Y,aa){this.name=Z;this.index=Y;this.value=aa};var P=function(Z,Y){this.name=Z;this.index=Y;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.min=Number.MAX_VALUE;this.max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};extend(P.prototype,{applies_to:function(Y){if(Y.length>this.index){return true}return false},keep:function(Y){if(!this.applies_to(Y)){return true}var Z=parseInt(Y[this.index]);return(isNaN(Z)||(Z>=this.low&&Z<=this.high))},update_attrs:function(Z){var Y=false;if(!this.applies_to(Z)){return Y}if(Z[this.index]<this.min){this.min=Math.floor(Z[this.index]);Y=true}if(Z[this.index]>this.max){this.max=Math.ceil(Z[this.index]);Y=true}return Y},update_ui_elt:function(){var Z=this.slider.slider("option","min"),Y=this.slider.slider("option","max");if(this.min<Z||this.max>Y){this.slider.slider("option","min",this.min);this.slider.slider("option","max",this.max);this.slider.slider("option","step",h(this.min,this.max));this.slider.slider("option","values",[this.min,this.max])}}});var U=function(aa,ag){this.track=aa;this.filters=[];for(var ac=0;ac<ag.length;ac++){var Y=ag[ac];var Z=Y.name,af=Y.type,ad=Y.index;if(af==="int"||af==="float"){this.filters[ac]=new P(Z,ad)}else{this.filters[ac]=new j(Z,ad,af)}}var ae=function(ah,ai,aj){ah.click(function(){var ak=ai.text();max=parseFloat(aj.slider("option","max")),input_size=(max<=1?4:max<=1000000?max.toString().length:6),multi_value=false;if(aj.slider("option","values")){input_size=2*input_size+1;multi_value=true}ai.text("");$("<input type='text'/>").attr("size",input_size).attr("maxlength",input_size).attr("value",ak).appendTo(ai).focus().select().click(function(al){al.stopPropagation()}).blur(function(){$(this).remove();ai.text(ak)}).keyup(function(ap){if(ap.keyCode===27){$(this).trigger("blur")}else{if(ap.keyCode===13){var an=aj.slider("option","min"),al=aj.slider("option","max"),ao=function(aq){return(isNaN(aq)||aq>al||aq<an)},am=$(this).val();if(!multi_value){am=parseFloat(am);if(ao(am)){alert("Parameter value must be in the range ["+an+"-"+al+"]");return $(this)}}else{am=am.split("-");am=[parseFloat(am[0]),parseFloat(am[1])];if(ao(am[0])||ao(am[1])){alert("Parameter value must be in the range ["+an+"-"+al+"]");return $(this)}}aj.slider((multi_value?"values":"value"),am)}}})})};this.parent_div=$("<div/>").addClass("filters").hide();this.parent_div.bind("drag",function(ah){ah.stopPropagation()}).bind("click",function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()});var ab=this;$.each(this.filters,function(an,ai){var ak=$("<div/>").addClass("slider-row").appendTo(ab.parent_div);var ah=$("<div/>").addClass("slider-label").appendTo(ak);var ap=$("<span/>").addClass("slider-name").text(ai.name+" ").appendTo(ah);var aj=$("<span/>");var al=$("<span/>").addClass("slider-value").appendTo(ah).append("[").append(aj).append("]");var ao=$("<div/>").addClass("slider").appendTo(ak);ai.control_element=$("<div/>").attr("id",ai.name+"-filter-control").appendTo(ao);var am=[0,0];ai.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(aq,ar){am=ar.values;aj.text(ar.values[0]+"-"+ar.values[1]);setTimeout(function(){if(ar.values[0]==am[0]&&ar.values[1]==am[1]){var at=ar.values;aj.text(at[0]+"-"+at[1]);ai.low=at[0];ai.high=at[1];ab.track.draw(true,true)}},50)},change:function(aq,ar){ai.control_element.slider("option","slide").call(ai.control_element,aq,ar)}});ai.slider=ai.control_element;ai.slider_label=aj;ae(al,aj,ai.control_element);$("<div style='clear: both;'/>").appendTo(ak)})};var T=function(Y){this.track=Y.track;this.params=Y.params;this.values={};if(Y.saved_values){this.restore_values(Y.saved_values)}this.onchange=Y.onchange};extend(T.prototype,{restore_values:function(Y){var Z=this;$.each(this.params,function(aa,ab){if(Y[ab.key]!==undefined){Z.values[ab.key]=Y[ab.key]}else{Z.values[ab.key]=ab.default_value}})},build_form:function(){var Z=this;var Y=$("<div />");$.each(this.params,function(ad,ab){if(!ab.hidden){var aa="param_"+ad;var ai=$("<div class='form-row' />").appendTo(Y);ai.append($("<label />").attr("for",aa).text(ab.label+":"));if(ab.type==="bool"){ai.append($('<input type="checkbox" />').attr("id",aa).attr("name",aa).attr("checked",Z.values[ab.key]))}else{if(ab.type==="color"){var af=Z.values[ab.key];var ae=$("<input />").attr("id",aa).attr("name",aa).val(af);var ag=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var ac=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(ag);var ah=$("<div/>").appendTo(ac).farbtastic({width:100,height:100,callback:ae,color:af});$("<div />").append(ae).append(ag).appendTo(ai).bind("click",function(aj){ag.css({left:$(this).position().left+($(ae).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){ag.hide();$(document).unbind("click.color-picker")});aj.stopPropagation()})}else{ai.append($("<input />").attr("id",aa).attr("name",aa).val(Z.values[ab.key]))}}}});return Y},update_from_form:function(Y){var aa=this;var Z=false;$.each(this.params,function(ab,ad){if(!ad.hidden){var ae="param_"+ab;var ac=Y.find("#"+ae).val();if(ad.type==="float"){ac=parseFloat(ac)}else{if(ad.type==="int"){ac=parseInt(ac)}else{if(ad.type==="bool"){ac=Y.find("#"+ae).is(":checked")}}}if(ac!==aa.values[ad.key]){aa.values[ad.key]=ac;Z=true}}});if(Z){this.onchange()}}});var b=function(aa,Z,Y){this.index=aa;this.resolution=Z;this.canvas=$("<div class='track-tile'/>").append(Y)};var m=function(aa,Z,Y,ab){b.call(this,aa,Z,Y);this.max_val=ab};var J=function(aa,Z,Y){b.call(this,aa,Z,Y)};var k=function(Z,Y,ac,aa,ab){this.name=Z;this.view=Y;this.parent_element=ac;this.data_url=(aa?aa:default_data_url);this.data_url_extra_params={};this.data_query_wait=(ab?ab:F);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(k.prototype,{init:function(){var Y=this;Y.enabled=false;Y.tile_cache.clear();Y.data_cache.clear();Y.initial_canvas=undefined;Y.content_div.css("height","auto");Y.container_div.removeClass("nodata error pending");if(!Y.dataset_id){return}$.getJSON(converted_datasets_state_url,{hda_ldda:Y.hda_ldda,dataset_id:Y.dataset_id,chrom:Y.view.chrom},function(Z){if(!Z||Z==="error"||Z.kind==="error"){Y.container_div.addClass("error");Y.content_div.text(n);if(Z.message){var ab=Y.view.tracks.indexOf(Y);var aa=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+Z.message+"</pre>",{Close:hide_modal})});Y.content_div.append(aa)}}else{if(Z==="no converter"){Y.container_div.addClass("error");Y.content_div.text(E)}else{if(Z==="no data"||(Z.data!==undefined&&(Z.data===null||Z.data.length===0))){Y.container_div.addClass("nodata");Y.content_div.text(A)}else{if(Z==="pending"){Y.container_div.addClass("pending");Y.content_div.text(q);setTimeout(function(){Y.init()},Y.data_query_wait)}else{if(Z.status==="data"){if(Z.valid_chroms){Y.valid_chroms=Z.valid_chroms;Y.make_name_popup_menu()}Y.content_div.text(S);if(Y.view.chrom){Y.content_div.text("");Y.content_div.css("height",Y.height_px+"px");Y.enabled=true;$.when(Y.predraw_init()).done(function(){Y.container_div.removeClass("nodata error pending");Y.draw()})}}}}}}})},predraw_init:function(){},update_name:function(Y){this.old_name=this.name;this.name=Y;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var H=function(ag,ae,ah){var Z=this,ai=Z.view;this.filters_manager=(ag!==undefined?new U(this,ag):undefined);this.filters_available=false;this.filters_visible=false;this.tool=(ae!==undefined&&obj_length(ae)>0?new o(this,ae):undefined);this.parent_track=ah;this.child_tracks=[];if(Z.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}Z.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();Z.container_div.append(Z.child_tracks_container);if(this.filters_manager){this.filters_div=this.filters_manager.parent_div;this.header_div.after(this.filters_div)}if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}if(Z.display_modes!==undefined){if(Z.mode_div===undefined){Z.mode_div=$("<div class='right-float menubutton popup' />").appendTo(Z.header_div);var ab=(Z.track_config&&Z.track_config.values.mode?Z.track_config.values.mode:Z.display_modes[0]);Z.mode=ab;Z.mode_div.text(ab);var aa=function(aj){Z.mode_div.text(aj);Z.mode=aj;Z.track_config.values.mode=aj;Z.tile_cache.clear();Z.draw()};var Y={};for(var ac=0,af=Z.display_modes.length;ac<af;ac++){var ad=Z.display_modes[ac];Y[ad]=function(aj){return function(){aa(aj)}}(ad)}make_popupmenu(Z.mode_div,Y)}else{Z.mode_div.hide()}}this.make_name_popup_menu()};extend(H.prototype,k.prototype,{make_name_popup_menu:function(){var Z=this;var Y={};Y["Edit configuration"]=function(){var af=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ad=function(){Z.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ae=function(ag){if((ag.keyCode||ag.which)===27){af()}else{if((ag.keyCode||ag.which)===13){ad()}}};$(window).bind("keypress.check_enter_esc",ae);show_modal("Configure Track",Z.track_config.build_form(),{Cancel:af,OK:ad})};if(Z.filters_available>0){var ac=(Z.filters_div.is(":visible")?"Hide filters":"Show filters");Y[ac]=function(){Z.filters_visible=(Z.filters_div.is(":visible"));Z.filters_div.toggle();Z.make_name_popup_menu()}}if(Z.tool){var ac=(Z.dynamic_tool_div.is(":visible")?"Hide tool":"Show tool");Y[ac]=function(){if(!Z.dynamic_tool_div.is(":visible")){Z.update_name(Z.name+Z.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";Z.revert_name()}Z.dynamic_tool_div.toggle();Z.make_name_popup_menu()}}if(Z.valid_chroms){Y["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+Z.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var aa=view;var ab=function(){$("#no-tracks").show()};if(this.parent_track){aa=this.parent_track;ab=function(){}}Y.Remove=function(){aa.remove_track(Z);if(aa.num_tracks===0){ab()}};make_popupmenu(Z.name_div,Y)},draw:function(Y,aa){var ar=this.view.low,ae=this.view.high,ag=ae-ar,ai=this.view.container.width(),ac=ai/ag,aj=this.view.resolution,ab=$("<div style='position: relative;'></div>"),ak=function(au,av,at){return au+"_"+av+"_"+at};if(!aa){this.content_div.children().remove()}this.content_div.append(ab);this.max_height=0;var am=Math.floor(ar/aj/K);var ad=[];var an=0;while((am*K*aj)<ae){var aq=ak(ai,ac,am);var af=this.tile_cache.get(aq);var ao=am*K*this.view.resolution;var Z=ao+K*this.view.resolution;if(!Y&&af){ad[ad.length]=af;this.show_tile(af,ab,ao,ac)}else{this.delayed_draw(Y,aq,am,aj,ab,ac,ad)}am+=1;an++}var ah=this;var ap=setInterval(function(){if(ad.length===an){clearInterval(ap);if(aa){var aw=ah.content_div.children();var ax=false;for(var av=aw.length-1,aB=0;av>=aB;av--){var au=$(aw[av]);if(ax){au.remove()}else{if(au.children().length!==0){ax=true}}}}if(ah.track_type=="FeatureTrack"&&ah.mode=="Histogram"){var aA=-1;for(var av=0;av<ad.length;av++){var aD=ad[av].max_val;if(aD>aA){aA=aD}}for(var av=0;av<ad.length;av++){if(ad[av].max_val!==aA){var aC=ad[av];aC.canvas.remove();ah.delayed_draw(true,ak(ai,ac,aC.index),aC.index,aC.resolution,ab,ac,[],{max:aA})}}}if(ah.filters_manager){var at=ah.filters_manager.filters;for(var az=0;az<at.length;az++){at[az].update_ui_elt()}var ay=false;if(ah.example_feature){for(var az=0;az<at.length;az++){if(at[az].applies_to(ah.example_feature)){ay=true;break}}}if(ah.filters_available!==ay){ah.filters_available=ay;if(!ah.filters_available){ah.filters_div.hide()}ah.make_name_popup_menu()}}}},50);for(var al=0;al<this.child_tracks.length;al++){this.child_tracks[al].draw(Y,aa)}},delayed_draw:function(Z,ag,aa,ac,ah,ak,ai,ad){var ab=this,ae=aa*K*ac,aj=ae+K*ac;var af=function(at,al,an,am,aq,ar,ao){var ap=ab.draw_tile(al,an,am,ar,ao);ab.tile_cache.set(ag,ap);ab.show_tile(ap,aq,ae,ar);ai[ai.length]=ap};var Y=setTimeout(function(){if(ae<=ab.view.high&&aj>=ab.view.low){var al=(Z?undefined:ab.tile_cache.get(ag));if(al){ab.show_tile(al,ah,ae,ak);ai[ai.length]=al}else{$.when(ab.data_cache.get_data(view.chrom,ae,aj,ab.mode,ac,ab.data_url_extra_params)).then(function(am){extend(am,ad);if(view.reference_track&&ak>view.canvas_manager.char_width_px){$.when(view.reference_track.data_cache.get_data(view.chrom,ae,aj,ab.mode,ac,view.reference_track.data_url_extra_params)).then(function(an){af(Y,am,ac,aa,ah,ak,an)})}else{af(Y,am,ac,aa,ah,ak)}})}}},50)},show_tile:function(ab,ae,ac,af){var Z=this;var aa=this.view.high-this.view.low,ad=(ac-this.view.low)*af;if(this.left_offset){ad-=this.left_offset}var Y=ab.canvas;Y.css({position:"absolute",top:0,left:ad,height:""});ae.append(Y);Z.max_height=Math.max(Z.max_height,Y.height());Z.content_div.css("height",Z.max_height+"px");ae.children().css("height",Z.max_height+"px")},set_overview:function(){var Y=this.view;if(this.initial_canvas&&this.is_overview){Y.overview_close.show();Y.overview_viewport.append(this.initial_canvas);Y.overview_highlight.show().height(this.initial_canvas.height());Y.overview_viewport.height(this.initial_canvas.height()+Y.overview_box.height())}$(window).trigger("resize")},tool_region_and_parameters_str:function(aa,Y,ab){var Z=this,ac=(aa!==undefined&&Y!==undefined&&ab!==undefined?aa+":"+Y+"-"+ab:"all");return" - region=["+ac+"], parameters=["+Z.tool.get_param_values().join(", ")+"]"},add_track:function(Y){Y.track_id=this.track_id+"_"+this.child_tracks.length;Y.container_div.attr("id","track_"+Y.track_id);this.child_tracks_container.append(Y.container_div);B(Y.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(Y);this.view.has_changes=true},remove_track:function(Y){Y.container_div.fadeOut("slow",function(){$(this).remove()})}});var V=function(Y,Z){this.track_type="LabelTrack";this.hidden=true;k.call(this,null,Y,Z);this.container_div.addClass("label-track")};extend(V.prototype,k.prototype,{draw:function(){var aa=this.view,ab=aa.high-aa.low,ae=Math.floor(Math.pow(10,Math.floor(Math.log(ab)/Math.log(10)))),Y=Math.floor(aa.low/ae)*ae,ac=this.view.container.width(),Z=$("<div style='position: relative; height: 1.3em;'></div>");while(Y<aa.high){var ad=(Y-aa.low)/ab*ac;Z.append($("<div class='label'>"+commatize(Y)+"</div>").css({position:"absolute",left:ad-1}));Y+=ae}this.content_div.children(":first").remove();this.content_div.append(Z)}});var x=function(Y){this.track_type="ReferenceTrack";this.hidden=true;k.call(this,null,Y,Y.top_labeltrack);H.call(this);Y.reference_track=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_url=reference_url;this.data_url_extra_params={dbkey:Y.dbkey};this.data_cache=new L(y,this,false);this.tile_cache=new c(r)};extend(x.prototype,H.prototype,{draw_tile:function(ag,ad,Z,ai){var ac=this,aa=K*ad;if(ai>this.view.canvas_manager.char_width_px){if(ag===null){ac.content_div.css("height","0px");return}var ab=this.view.canvas_manager.new_canvas();var ah=ab.getContext("2d");ab.width=Math.ceil(aa*ai+ac.left_offset);ab.height=ac.height_px;ah.font=ah.canvas.manager.default_font;ah.textAlign="center";for(var ae=0,af=ag.length;ae<af;ae++){var Y=Math.round(ae*ai);ah.fillText(ag[ae],Y+ac.left_offset,10)}return new b(Z,ad,ab)}this.content_div.css("height","0px")}});var l=function(ac,aa,ad,Y,ab){var Z=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";k.call(this,ac,aa,aa.viewport_container);H.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=ad;this.dataset_id=Y;this.original_dataset_id=Y;this.data_cache=new L(y,this);this.tile_cache=new c(r);this.track_config=new T({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:ab,onchange:function(){Z.vertical_range=Z.prefs.max_value-Z.prefs.min_value;$("#linetrack_"+Z.track_id+"_minval").text(Z.prefs.min_value);$("#linetrack_"+Z.track_id+"_maxval").text(Z.prefs.max_value);Z.tile_cache.clear();Z.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;this.add_resize_handle()};extend(l.prototype,H.prototype,{add_resize_handle:function(){var Y=this;var ab=false;var aa=false;var Z=$("<div class='track-resize'>");$(Y.container_div).hover(function(){ab=true;Z.show()},function(){ab=false;if(!aa){Z.hide()}});Z.hide().bind("dragstart",function(ac,ad){aa=true;ad.original_height=$(Y.content_div).height()}).bind("drag",function(ad,ae){var ac=Math.min(Math.max(ae.original_height+ae.deltaY,Y.min_height_px),Y.max_height_px);$(Y.content_div).css("height",ac);Y.height_px=ac;Y.draw(true)}).bind("dragend",function(ac,ad){Y.tile_cache.clear();aa=false;if(!ab){Z.hide()}Y.track_config.values.height=Y.height_px}).appendTo(Y.container_div)},predraw_init:function(){var Y=this,Z=Y.view.tracks.indexOf(Y);Y.vertical_range=undefined;return $.getJSON(Y.data_url,{stats:true,chrom:Y.view.chrom,low:null,high:null,hda_ldda:Y.hda_ldda,dataset_id:Y.dataset_id},function(aa){Y.container_div.addClass("line-track");var ac=aa.data;if(isNaN(parseFloat(Y.prefs.min_value))||isNaN(parseFloat(Y.prefs.max_value))){Y.prefs.min_value=ac.min;Y.prefs.max_value=ac.max;$("#track_"+Z+"_minval").val(Y.prefs.min_value);$("#track_"+Z+"_maxval").val(Y.prefs.max_value)}Y.vertical_range=Y.prefs.max_value-Y.prefs.min_value;Y.total_frequency=ac.total_frequency;Y.container_div.find(".yaxislabel").remove();var ad=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+Z+"_minval").text(u(Y.prefs.min_value));var ab=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+Z+"_maxval").text(u(Y.prefs.max_value));ab.css({position:"absolute",top:"24px",left:"10px"});ab.prependTo(Y.container_div);ad.css({position:"absolute",bottom:"2px",left:"10px"});ad.prependTo(Y.container_div)})},draw_tile:function(ai,ac,Z,ah){if(this.vertical_range===undefined){return}var ad=Z*K*ac,ab=K*ac,Y=Math.ceil(ab*ah),af=this.height_px;var aa=this.view.canvas_manager.new_canvas();aa.width=Y,aa.height=af;var ag=aa.getContext("2d");var ae=new G.LinePainter(ai.data,ad,ad+ab,this.prefs,this.mode);ae.draw(ag,Y,af);return new b(ab,ac,aa)}});var e=function(Y,ad,ac,ag,af,aa,ab,ae){var Z=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Histogram","Dense","Squish","Pack"];this.track_config=new T({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:af,onchange:function(){Z.tile_cache.clear();Z.draw()}});this.prefs=this.track_config.values;k.call(this,Y,ad,ad.viewport_container);H.call(this,aa,ab,ae);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=ac;this.dataset_id=ag;this.original_dataset_id=ag;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.inc_slots={};this.start_end_dct={};this.tile_cache=new c(d);this.data_cache=new L(20,this);this.left_offset=200;this.painter=G.LinkedFeaturePainter};extend(e.prototype,H.prototype,{update_auto_mode:function(Y){if(this.mode=="Auto"){if(Y=="no_detail"){Y="feature spans"}else{if(Y=="summary_tree"){Y="coverage histogram"}}this.mode_div.text("Auto ("+Y+")")}},incremental_slots:function(ac,Z,ab){var aa=this.view.canvas_manager.dummy_context,Y=this.inc_slots[ac];if(!Y||(Y.mode!==ab)){Y=new (p.FeatureSlotter)(ac,ab==="Pack",w,function(ad){return aa.measureText(ad)});Y.mode=ab;this.inc_slots[ac]=Y}return Y.slot_features(Z)},get_summary_tree_data:function(ac,af,aa,an){if(an>aa-af){an=aa-af}var aj=Math.floor((aa-af)/an),am=[],ab=0;var ad=0,ae=0,ai,al=0,ag=[],ak,ah;var Z=function(aq,ap,ar,ao){aq[0]=ap+ar*ao;aq[1]=ap+(ar+1)*ao};while(al<an&&ad!==ac.length){var Y=false;for(;al<an&&!Y;al++){Z(ag,af,al,aj);for(ae=ad;ae<ac.length;ae++){ai=ac[ae].slice(1,3);if(is_overlap(ai,ag)){Y=true;break}}if(Y){break}}data_start_index=ae;am[am.length]=ak=[ag[0],0];for(;ae<ac.length;ae++){ai=ac[ae].slice(1,3);if(is_overlap(ai,ag)){ak[1]++}else{break}}if(ak[1]>ab){ab=ak[1]}al++}return{max:ab,delta:aj,data:am}},draw_tile:function(al,au,ay,ah,ab){var aq=this,aA=ay*K*au,Z=(ay+1)*K*au,an=Z-aA,ar=Math.ceil(an*ah),ap=this.mode,aE=25,ac=this.left_offset,am,ad;if(ap==="Auto"){if(al.dataset_type==="summary_tree"){ap=al.dataset_type}else{if(al.extra_info==="no_detail"){ap="no_detail"}else{var aD=al.data;if(this.view.high-this.view.low>D){ap="Squish"}else{ap="Pack"}}}this.update_auto_mode(ap)}if(ap==="summary_tree"||ap==="Histogram"){ad=this.summary_draw_height;this.container_div.find(".yaxislabel").remove();var Y=$("<div />").addClass("yaxislabel");Y.text(al.max);Y.css({position:"absolute",top:"22px",left:"10px"});Y.prependTo(this.container_div);var aa=this.view.canvas_manager.new_canvas();aa.width=ar+ac;aa.height=ad+M;if(al.dataset_type!="summary_tree"){var ai=this.get_summary_tree_data(al.data,aA,Z,200);if(al.max){ai.max=al.max}al=ai}var aB=new G.SummaryTreePainter(al,aA,Z,this.prefs);var at=aa.getContext("2d");at.translate(ac,M);aB.draw(at,ar,ad);return new m(ay,au,aa,al.max)}var am,af=1;if(ap==="no_detail"||ap==="Squish"||ap==="Pack"){af=this.incremental_slots(ah,al.data,ap);am=this.inc_slots[ah].slots}var ag=[];if(al.data){var aj=this.filters_manager.filters;for(var av=0,ax=al.data.length;av<ax;av++){var ae=al.data[av];var aw=false;var ak;for(var az=0,aC=aj.length;az<aC;az++){ak=aj[az];ak.update_attrs(ae);if(!ak.keep(ae)){aw=true;break}}if(!aw){ag.push(ae)}}}var aB=new (this.painter)(ag,aA,Z,this.prefs,ap,ab);var ad=aB.get_required_height(af)+z;var aa=this.view.canvas_manager.new_canvas();aa.width=ar+ac;aa.height=ad;var at=aa.getContext("2d");at.fillStyle=this.prefs.block_color;at.font=at.canvas.manager.default_font;at.textAlign="right";this.container_div.find(".yaxislabel").remove();if(al.message){$(aa).css({"border-top":"1px solid red"});at.fillStyle="red";at.textAlign="left";var ao=at.textBaseline;at.textBaseline="top";at.fillText(al.message,ac,0);at.textBaseline=ao;if(!al.data){return new b(ay,au,aa,ad)}}this.example_feature=(al.data.length?al.data[0]:undefined);at.translate(ac,z);aB.draw(at,ar,ad,am);return new J(ay,au,aa)}});var N=function(ab,Z,ad,Y,aa,ac){e.call(this,ab,Z,ad,Y,aa,ac);this.track_type="VcfTrack";this.painter=G.VariantPainter};extend(N.prototype,H.prototype,e.prototype);var Q=function(ab,Z,ad,Y,aa,ac){e.call(this,ab,Z,ad,Y,aa,ac);this.track_config=new T({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_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:aa,onchange:function(){this.track.tile_cache.clear();this.track.draw()}});this.prefs=this.track_config.values;this.track_type="ReadTrack";this.painter=G.ReadPainter;this.make_name_popup_menu()};extend(Q.prototype,H.prototype,e.prototype);var O=function(ac,aa,ae,Y,ab,ad,Z){e.call(this,ac,aa,ae,Y,ab,ad,{},Z);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};extend(O.prototype,H.prototype,e.prototype,{predraw_init:function(){var Z=this;var Y=function(){if(Z.data_cache.size()===0){setTimeout(Y,300)}else{Z.data_url=default_data_url;Z.data_query_wait=F;Z.dataset_state_url=converted_datasets_state_url;$.getJSON(Z.dataset_state_url,{dataset_id:Z.dataset_id,hda_ldda:Z.hda_ldda},function(aa){})}};Y()}});R.View=W;R.LineTrack=l;R.FeatureTrack=e;R.ReadTrack=Q};var slotting_module=function(c,b){var d=2,a=5;b.FeatureSlotter=function(h,g,e,f){this.slots={};this.start_end_dct={};this.w_scale=h;this.include_label=g;this.max_rows=e;this.measureText=f};extend(b.FeatureSlotter.prototype,{slot_features:function(l){var o=this.w_scale,r=this.slots,g=this.start_end_dct,x=[],z=[],m=0,y=this.max_rows;for(var v=0,w=l.length;v<w;v++){var k=l[v],n=k[0];if(r[n]!==undefined){m=Math.max(m,r[n]);z.push(r[n])}else{x.push(v)}}var p=function(F,G){for(var E=0;E<=y;E++){var C=false,H=g[E];if(H!==undefined){for(var B=0,D=H.length;B<D;B++){var A=H[B];if(G>A[0]&&F<A[1]){C=true;break}}}if(!C){return E}}return -1};for(var v=0,w=x.length;v<w;v++){var k=l[x[v]],n=k[0],t=k[1],e=k[2],q=k[3],f=Math.floor(t*o),j=Math.ceil(e*o),u=this.measureText(q).width,h;if(q!==undefined&&this.include_label){u+=(d+a);if(f-u>=0){f-=u;h="left"}else{j+=u;h="right"}}var s=p(f,j);if(s>=0){if(g[s]===undefined){g[s]=[]}g[s].push([f,j]);r[n]=s;m=Math.max(m,s)}else{}}return m+1}})};var painters_module=function(j,v){var o=function(G,y,E,x,D,B){if(B===undefined){B=4}var A=x-y;var z=D-E;var C=Math.floor(Math.sqrt(A*A+z*z)/B);var H=A/C;var F=z/C;var w;for(w=0;w<C;w++,y+=H,E+=F){if(w%2!==0){continue}G.fillRect(y,E,B,1)}};var p=function(z,x,w,C){var B=x-C/2,A=x+C/2,D=w-Math.sqrt(C*3/2);z.beginPath();z.moveTo(B,D);z.lineTo(A,D);z.lineTo(x,w);z.lineTo(B,D);z.strokeStyle=this.fillStyle;z.fill();z.stroke();z.closePath()};var l=function(y,A,w,x,z){this.data=y;this.view_start=A;this.view_end=w;this.prefs=extend({},this.default_prefs,x);this.mode=z};l.prototype.default_prefs={};var t=function(y,A,w,x,z){l.call(this,y,A,w,x,z)};t.prototype.default_prefs={show_counts:false};t.prototype.draw=function(L,w,K){var D=this.view_start,N=this.view_end-this.view_start,M=w/N;var I=this.data.data,H=this.data.delta,F=this.data.max,A=K;delta_x_px=Math.ceil(H*M);L.save();for(var B=0,C=I.length;B<C;B++){var G=Math.floor((I[B][0]-D)*M);var E=I[B][1];if(!E){continue}var J=E/F*K;if(E!==0&&J<1){J=1}L.fillStyle="black";L.fillRect(G,A-J,delta_x_px,J);var z=4;if(this.prefs.show_counts&&(L.measureText(E).width+z)<delta_x_px){L.fillStyle="#666";L.textAlign="center";L.fillText(E,G+(delta_x_px/2),10)}}L.restore()};var c=function(y,A,w,x,z){l.call(this,y,A,w,x,z)};c.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};c.prototype.draw=function(M,L,J){var E=false,F=this.prefs.min_value,C=this.prefs.max_value,I=C-F,x=J,z=this.view_start,K=this.view_end-this.view_start,A=L/K,G=this.mode,Q=this.data;M.save();var R=Math.round(J+F/I*J);if(G!=="Intensity"){M.fillStyle="#aaa";M.fillRect(0,R,L,1)}M.beginPath();M.fillStyle=this.prefs.color;var P,D,B;if(Q.length>1){B=Math.ceil((Q[1][0]-Q[0][0])*A)}else{B=10}for(var N=0,O=Q.length;N<O;N++){P=Math.round((Q[N][0]-z)*A);D=Q[N][1];if(D===null){if(E&&G==="Filled"){M.lineTo(P,x)}E=false;continue}if(D<F){D=F}else{if(D>C){D=C}}if(G==="Histogram"){D=Math.round(D/I*x);M.fillRect(P,R,B,-D)}else{if(G==="Intensity"){D=255-Math.floor((D-F)/I*255);M.fillStyle="rgb("+D+","+D+","+D+")";M.fillRect(P,0,B,x)}else{D=Math.round(x-(D-F)/I*x);if(E){M.lineTo(P,D)}else{E=true;if(G==="Filled"){M.moveTo(P,x);M.lineTo(P,D)}else{M.moveTo(P,D)}}}}}if(G==="Filled"){if(E){M.lineTo(P,R);M.lineTo(0,R)}M.fill()}else{M.stroke()}var w=-1,H=-1;M.fillStyle=this.prefs.overflow_color;for(var N=0,O=Q.length;N<O;N++){D=Q[N][1];P=Math.round((Q[N][0]-z)*A);x_minus_scaled=Math.round((Q[N][0]-1-z)*A);if(H>=0&&(D===null||D<C)){M.fillRect(H,0,x_minus_scaled-H+1,2);H=-1}else{if(w>=0&&(D===null||D>F)){M.fillRect(w,J-2,x_minus_scaled-w+1,2);w=-1}}if(D!==null&&D>C&&H<0){H=P}else{if(D!==null&&D<F&&w<0){w=P}}}M.restore()};var n=function(y,A,w,x,z){l.call(this,y,A,w,x,z)};n.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};extend(n.prototype,{get_required_height:function(x){var w=y_scale=this.get_row_height(),y=this.mode;if(y==="no_detail"||y==="Squish"||y==="Pack"){w=x*y_scale}return w+Math.max(Math.round(y_scale/2),5)},draw:function(I,z,H,E){var C=this.data,F=this.view_start,J=this.view_end;I.save();I.fillStyle=this.prefs.block_color;I.textAlign="right";var M=this.view_end-this.view_start,L=z/M,y=this.get_row_height();for(var B=0,D=C.length;B<D;B++){var K=C[B],A=K[0],w=K[1],x=K[2],G=(E&&E[A]!==undefined?E[A]:null);if((w<J&&x>F)&&(this.mode=="Dense"||G!==null)){this.draw_element(I,this.mode,K,G,F,J,L,y,z)}}I.restore()}});var d=10,h=3,k=5,u=10,f=1,r=3,e=3,a=9,m=2,g="#ccc";var q=function(y,A,w,x,z){n.call(this,y,A,w,x,z)};extend(q.prototype,n.prototype,{get_row_height:function(){var x=this.mode,w;if(x==="Dense"){w=d}else{if(x==="no_detail"){w=h}else{if(x==="Squish"){w=k}else{w=u}}}return w},draw_element:function(I,B,Q,D,K,aa,ae,af,w){var N=Q[0],ac=Q[1],U=Q[2],L=Q[3],V=Math.floor(Math.max(0,(ac-K)*ae)),J=Math.ceil(Math.min(w,Math.max(0,(U-K)*ae))),T=(B==="Dense"?0:(0+D))*af,H,Y,M=null,ag=null,z=this.prefs.block_color,X=this.prefs.label_color;if(B=="Dense"){D=1}if(B==="no_detail"){I.fillStyle=z;I.fillRect(V,T+5,J-V,f)}else{var G=Q[4],S=Q[5],W=Q[6],A=Q[7];if(S&&W){M=Math.floor(Math.max(0,(S-K)*ae));ag=Math.ceil(Math.min(w,Math.max(0,(W-K)*ae)))}var ad,O;if(B==="Squish"||B==="Dense"){ad=1;O=e}else{ad=5;O=a}if(!A){if(Q.strand){if(Q.strand==="+"){I.fillStyle=I.canvas.manager.get_pattern("right_strand_inv")}else{if(Q.strand==="-"){I.fillStyle=I.canvas.manager.get_pattern("left_strand_inv")}}}else{I.fillStyle=z}I.fillRect(V,T,J-V,O)}else{var F,P;if(B==="Squish"||B==="Dense"){I.fillStyle=g;F=T+Math.floor(e/2)+1;P=1}else{if(G){var F=T;var P=O;if(G==="+"){I.fillStyle=I.canvas.manager.get_pattern("right_strand")}else{if(G==="-"){I.fillStyle=I.canvas.manager.get_pattern("left_strand")}}}else{I.fillStyle=g;F+=(e/2)+1;P=1}}I.fillRect(V,F,J-V,P);for(var ab=0,y=A.length;ab<y;ab++){var C=A[ab],x=Math.floor(Math.max(0,(C[0]-K)*ae)),R=Math.ceil(Math.min(w,Math.max((C[1]-K)*ae)));if(x>R){continue}I.fillStyle=z;I.fillRect(x,T+(O-ad)/2+1,R-x,ad);if(M!==undefined&&W>S&&!(x>ag||R<M)){var Z=Math.max(x,M),E=Math.min(R,ag);I.fillRect(Z,T+1,E-Z,O);if(A.length==1&&B=="Pack"){if(G==="+"){I.fillStyle=I.canvas.manager.get_pattern("right_strand_inv")}else{if(G==="-"){I.fillStyle=I.canvas.manager.get_pattern("left_strand_inv")}}if(Z+14<E){Z+=2;E-=2}I.fillRect(Z,T+1,E-Z,O)}}}}if(B==="Pack"&&ac>K){I.fillStyle=X;if(K===0&&V-I.measureText(L).width<0){I.textAlign="left";I.fillText(L,J+m,T+8)}else{I.textAlign="right";I.fillText(L,V-m,T+8)}I.fillStyle=z}}}});var b=function(y,A,w,x,z){n.call(this,y,A,w,x,z)};extend(b.prototype,n.prototype,{draw_element:function(P,K,E,A,S,y,H,Q,N){var E=data[i],G=E[0],O=E[1],z=E[2],J=E[3],C=Math.floor(Math.max(0,(O-S)*H)),F=Math.ceil(Math.min(N,Math.max(0,(z-S)*H))),B=(K==="Dense"?0:(0+A))*Q,w,T,x=null,I=null;if(no_label){P.fillStyle=block_color;P.fillRect(C+left_offset,B+5,F-C,1)}else{var R=E[4],M=E[5],D=E[6];w=9;T=1;P.fillRect(C+left_offset,B,F-C,w);if(K!=="Dense"&&J!==undefined&&O>S){P.fillStyle=label_color;if(S===0&&C-P.measureText(J).width<0){P.textAlign="left";P.fillText(J,F+2+left_offset,B+8)}else{P.textAlign="right";P.fillText(J,C-2+left_offset,B+8)}P.fillStyle=block_color}var L=R+" / "+M;if(O>S&&P.measureText(L).width<(F-C)){P.fillStyle="white";P.textAlign="center";P.fillText(L,left_offset+C+(F-C)/2,B+8);P.fillStyle=block_color}}}});var s=function(z,B,w,y,A,x){n.call(this,z,B,w,y,A);this.ref_seq=x};s.prototype.default_prefs=extend({},n.prototype.default_prefs,{show_insertions:false});extend(s.prototype,n.prototype,{get_row_height:function(){var w,x=this.mode;if(x==="Dense"){w=d}else{if(x==="Squish"){w=k}else{w=u;if(this.prefs.show_insertions){w*=2}}}return w},draw_read:function(S,N,J,X,y,R,G,D,C){S.textAlign="center";var Q=this,x=[X,y],M=0,T=0,P=0;ref_seq=this.ref_seq,char_width_px=S.canvas.manager.char_width_px;var ac=[];if((N==="Pack"||this.mode==="Auto")&&D!==undefined&&J>char_width_px){P=Math.round(J/2)}if(!G){G=[[0,D.length]]}for(var K=0,V=G.length;K<V;K++){var H=G[K],z="MIDNSHP=X"[H[0]],L=H[1];if(z==="H"||z==="S"){M-=L}var E=R+M,ab=Math.floor(Math.max(0,(E-X)*J)),F=Math.floor(Math.max(0,(E+L-X)*J));if(ab===F){F+=1}switch(z){case"H":break;case"S":case"M":case"=":if(is_overlap([E,E+L],x)){var O=D.slice(T,T+L);if(P>0){S.fillStyle=this.prefs.block_color;S.fillRect(ab-P,C+1,F-ab,9);S.fillStyle=g;for(var Z=0,w=O.length;Z<w;Z++){if(this.prefs.show_differences&&ref_seq){var I=ref_seq[E-X+Z];if(!I||I.toLowerCase()===O[Z].toLowerCase()){continue}}if(E+Z>=X&&E+Z<=y){var aa=Math.floor(Math.max(0,(E+Z-X)*J));S.fillText(O[Z],aa,C+9)}}}else{S.fillStyle=this.prefs.block_color;S.fillRect(ab,C+4,F-ab,e)}}T+=L;M+=L;break;case"N":S.fillStyle=g;S.fillRect(ab-P,C+5,F-ab,1);M+=L;break;case"D":S.fillStyle="red";S.fillRect(ab-P,C+4,F-ab,3);M+=L;break;case"P":break;case"I":var W=ab-P;if(is_overlap([E,E+L],x)){var O=D.slice(T,T+L);if(this.prefs.show_insertions){var B=ab-(F-ab)/2;if((N==="Pack"||this.mode==="Auto")&&D!==undefined&&J>char_width_px){S.fillStyle="yellow";S.fillRect(B-P,C-9,F-ab,9);ac[ac.length]={type:"triangle",data:[W,C+4,5]};S.fillStyle=g;switch(seq_tile_overlap){case (OVERLAP_START):O=O.slice(X-E);break;case (OVERLAP_END):O=O.slice(0,E-y);break;case (CONTAINED_BY):break;case (CONTAINS):O=O.slice(X-E,E-y);break}for(var Z=0,w=O.length;Z<w;Z++){var aa=Math.floor(Math.max(0,(E+Z-X)*J));S.fillText(O[Z],aa-(F-ab)/2,C)}}else{S.fillStyle="yellow";S.fillRect(B,C+(this.mode!=="Dense"?2:5),F-ab,(N!=="Dense"?e:r))}}else{if((N==="Pack"||this.mode==="Auto")&&D!==undefined&&J>char_width_px){ac[ac.length]={type:"text",data:[O.length,W,C+9]}}else{}}}T+=L;break;case"X":T+=L;break}}S.fillStyle="yellow";var Y,A,ad;for(var U=0;U<ac.length;U++){Y=ac[U];A=Y.type;ad=Y.data;if(A==="text"){S.save();S.font="bold "+S.font;S.fillText(ad[0],ad[1],ad[2]);S.restore()}else{if(A=="triangle"){p(S,ad[0],ad[1],ad[2])}}}},draw_element:function(P,K,C,z,S,x,G,Q,N){var F=C[0],O=C[1],y=C[2],H=C[3],B=Math.floor(Math.max(0,(O-S)*G)),D=Math.ceil(Math.min(N,Math.max(0,(y-S)*G))),A=(K==="Dense"?0:(0+z))*Q,T=this.prefs.block_color,E=this.prefs.label_color,M=0;if((K==="Pack"||this.mode==="Auto")&&G>P.canvas.manager.char_width_px){var M=Math.round(G/2)}P.fillStyle=T;if(C[5] instanceof Array){var L=Math.floor(Math.max(0,(C[4][0]-S)*G)),J=Math.ceil(Math.min(N,Math.max(0,(C[4][1]-S)*G))),I=Math.floor(Math.max(0,(C[5][0]-S)*G)),w=Math.ceil(Math.min(N,Math.max(0,(C[5][1]-S)*G)));if(C[4][1]>=S&&C[4][0]<=x&&C[4][2]){this.draw_read(P,K,G,S,x,C[4][0],C[4][2],C[4][3],A)}if(C[5][1]>=S&&C[5][0]<=x&&C[5][2]){this.draw_read(P,K,G,S,x,C[5][0],C[5][2],C[5][3],A)}if(I>J){P.fillStyle=g;o(P,J-M,A+5,I-M,A+5)}}else{P.fillStyle=T;this.draw_read(P,K,G,S,x,O,C[4],C[5],A)}if(K==="Pack"&&O>S){P.fillStyle=this.prefs.label_color;var R=1;if(R===0&&B-P.measureText(H).width<0){P.textAlign="left";P.fillText(H,D+m-M,A+8)}else{P.textAlign="right";P.fillText(H,B-m-M,A+8)}P.fillStyle=T}}});v.SummaryTreePainter=t;v.LinePainter=c;v.LinkedFeaturePainter=q;v.ReadPainter=s;v.VariantPainter=b};(function(d){var c={};var b=function(e){return c[e]};var a=function(f,g){var e={};g(b,e);c[f]=e};a("slotting",slotting_module);a("painters",painters_module);a("trackster",trackster_module);for(key in c.trackster){d[key]=c.trackster[key]}})(window);
\ No newline at end of file
+var class_module=function(b,a){var c=function(){var f=arguments[0];for(var e=1;e<arguments.length;e++){var d=arguments[e];for(key in d){f[key]=d[key]}}return f};a.extend=c};var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=BEFORE}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=AFTER}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a};var is_overlap=function(c,b){var a=compute_overlap(c,b);return(a!==BEFORE&&a!==AFTER)};var trackster_module=function(f,T){var o=f("class").extend,q=f("slotting"),I=f("painters");var Z=function(aa,ab){this.document=aa;this.default_font=ab!==undefined?ab:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};o(Z.prototype,{load_pattern:function(aa,ae){var ab=this.patterns,ac=this.dummy_context,ad=new Image();ad.src=image_path+ae;ad.onload=function(){ab[aa]=ac.createPattern(ad,"repeat")}},get_pattern:function(aa){return this.patterns[aa]},new_canvas:function(){var aa=this.document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(aa)}aa.manager=this;return aa}});var C=function(aa,ab){aa.bind("drag",{handle:ab,relative:true},function(af,ag){var ae=$(this).parent();var ad=ae.children();var ac;for(ac=0;ac<ad.length;ac++){if(ag.offsetY<$(ad.get(ac)).position().top){break}}if(ac===ad.length){if(this!==ad.get(ac-1)){ae.append(this)}}else{if(this!==ad.get(ac)){$(this).insertBefore(ad.get(ac))}}})};T.sortable=C;var h=function(ac,aa){var ab=aa-ac;return(ab<=2?0.01:(ab<=100?1:(ab<=1000?5:10)))};var D=9,A=10,O=D+2,x=100,F=12000,M=200,t=10,H=5000,u=100,n="There was an error in indexing this dataset. ",G="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",B="No data for this chrom/contig.",r="Currently indexing... please wait",w="Tool cannot be rerun: ",a="Loading data...",U="Ready for display",d=10,s=5,z=5;function v(aa){return Math.round(aa*1000)/1000}var c=function(aa){this.num_elements=aa;this.clear()};o(c.prototype,{get:function(ab){var aa=this.key_ary.indexOf(ab);if(aa!==-1){this.move_key_to_end(ab,aa)}return this.obj_cache[ab]},set:function(ab,ac){if(!this.obj_cache[ab]){if(this.key_ary.length>=this.num_elements){var aa=this.key_ary.shift();delete this.obj_cache[aa]}this.key_ary.push(ab)}this.obj_cache[ab]=ac;return ac},move_key_to_end:function(ab,aa){this.key_ary.splice(aa,1);this.key_ary.push(ab)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var N=function(ab,aa,ac){c.call(this,ab);this.track=aa;this.subset=(ac!==undefined?ac:true)};o(N.prototype,c.prototype,{load_data:function(ai,aj,ae,ah,ab,ag){var ad={chrom:ai,low:aj,high:ae,mode:ah,resolution:ab,dataset_id:this.track.dataset_id,hda_ldda:this.track.hda_ldda};$.extend(ad,ag);if(this.track.filters_manager){var ak=[];var aa=this.track.filters_manager.filters;for(var af=0;af<aa.length;af++){ak[ak.length]=aa[af].name}ad.filter_cols=JSON.stringify(ak)}var ac=this;return $.getJSON(this.track.data_url,ad,function(al){ac.set_data(aj,ae,ah,al)})},get_data:function(ac,aa,af,ag,ab,ae){var ad=this.get(this.gen_key(aa,af,ag));if(ad){return ad}ad=this.load_data(ac,aa,af,ag,ab,ae);this.set_data(aa,af,ag,ad);return ad},set_data:function(ab,ac,ad,aa){return this.set(this.gen_key(ab,ac,ad),aa)},gen_key:function(aa,ac,ad){var ab=aa+"_"+ac+"_"+ad;return ab},split_key:function(aa){return aa.split("_")}});var E=function(ab,aa,ac){N.call(this,ab,aa,ac)};o(E.prototype,N.prototype,c.prototype,{load_data:function(ac,aa,ae,af,ab,ad){if(ab>1){return}return N.prototype.load_data.call(this,ac,aa,ae,af,ab,ad)}});var Y=function(aa,ad,ac,ab,ae){this.container=aa;this.chrom=null;this.vis_id=ac;this.dbkey=ab;this.title=ad;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(ae);this.canvas_manager=new Z(aa.get(0).ownerDocument);this.reset()};o(Y.prototype,{init:function(ad){var ac=this.container,aa=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ac);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(ac);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ac);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_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ab=function(ae){if(ae.type==="focusout"||(ae.keyCode||ae.which)===13||(ae.keyCode||ae.which)===27){if((ae.keyCode||ae.which)!==27){aa.go_to($(this).val())}$(this).hide();$(this).val("");aa.location_span.show();aa.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ab).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){aa.location_span.hide();aa.chrom_select.hide();aa.nav_input.val(aa.chrom+":"+aa.low+"-"+aa.high);aa.nav_input.css("display","inline-block");aa.nav_input.select();aa.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){aa.zoom_out();aa.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){aa.zoom_in();aa.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},ad);this.chrom_select.bind("change",function(){aa.change_chrom(aa.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(ae){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(ae){aa.zoom_in(ae.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ae,af){this.current_x=af.offsetX}).bind("drag",function(ae,ag){var ah=ag.offsetX-this.current_x;this.current_x=ag.offsetX;var af=Math.round(ah/aa.viewport_container.width()*(aa.max_high-aa.max_low));aa.move_delta(-af)});this.overview_close.bind("click",function(){for(var af=0,ae=aa.tracks.length;af<ae;af++){aa.tracks[af].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",aa.overview_box.height());aa.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(ae,af){if(ae.clientX>aa.viewport_container.width()-16){return false}}).bind("dragstart",function(ae,af){af.original_low=aa.low;af.current_height=ae.clientY;af.current_x=af.offsetX}).bind("drag",function(ag,ai){var ae=$(this);var aj=ai.offsetX-ai.current_x;var af=ae.scrollTop()-(ag.clientY-ai.current_height);ae.scrollTop(af);ai.current_height=ag.clientY;ai.current_x=ai.offsetX;var ah=Math.round(aj/aa.viewport_container.width()*(aa.high-aa.low));aa.move_delta(ah)}).bind("mousewheel",function(ag,ai,af,ae){if(af){var ah=Math.round(-af/aa.viewport_container.width()*(aa.high-aa.low));aa.move_delta(ah)}});this.top_labeltrack.bind("dragstart",function(ae,af){return $("<div />").css({height:aa.content_div.height()+aa.top_labeltrack.height()+aa.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ai,aj){$(aj.proxy).css({left:Math.min(ai.pageX,aj.startX),width:Math.abs(ai.pageX-aj.startX)});var af=Math.min(ai.pageX,aj.startX)-aa.container.offset().left,ae=Math.max(ai.pageX,aj.startX)-aa.container.offset().left,ah=(aa.high-aa.low),ag=aa.viewport_container.width();aa.update_location(Math.round(af/ag*ah)+aa.low,Math.round(ae/ag*ah)+aa.low)}).bind("dragend",function(aj,ak){var af=Math.min(aj.pageX,ak.startX),ae=Math.max(aj.pageX,ak.startX),ah=(aa.high-aa.low),ag=aa.viewport_container.width(),ai=aa.low;aa.low=Math.round(af/ag*ah)+ai;aa.high=Math.round(ae/ag*ah)+ai;$(ak.proxy).remove();aa.redraw()});this.add_label_track(new X(this,this.top_labeltrack));this.add_label_track(new X(this,this.nav_labeltrack));$(window).bind("resize",function(){aa.resize_window()});$(document).bind("redraw",function(){aa.redraw()});this.reset();$(window).trigger("resize")},update_location:function(aa,ab){this.location_span.text(commatize(aa)+" - "+commatize(ab));this.nav_input.val(this.chrom+":"+commatize(aa)+"-"+commatize(ab))},load_chroms:function(ab,ac){ab.num=u;$.extend(ab,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var aa=this;$.ajax({url:chrom_url,data:ab,dataType:"json",success:function(ae){if(ae.chrom_info.length===0){alert("Invalid chromosome: "+ab.chrom);return}if(ae.reference){aa.add_label_track(new y(aa))}aa.chrom_data=ae.chrom_info;var ah='<option value="">Select Chrom/Contig</option>';for(var ag=0,ad=aa.chrom_data.length;ag<ad;ag++){var af=aa.chrom_data[ag].chrom;ah+='<option value="'+af+'">'+af+"</option>"}if(ae.prev_chroms){ah+='<option value="previous">Previous '+u+"</option>"}if(ae.next_chroms){ah+='<option value="next">Next '+u+"</option>"}aa.chrom_select.html(ah);if(ac){ac()}aa.chrom_start_index=ae.start_index},error:function(){alert("Could not load chroms for this dbkey:",aa.dbkey)}})},change_chrom:function(ae,ab,ag){if(!ae||ae==="None"){return}var ad=this;if(ae==="previous"){ad.load_chroms({low:this.chrom_start_index-u});return}if(ae==="next"){ad.load_chroms({low:this.chrom_start_index+u});return}var af=$.grep(ad.chrom_data,function(ai,aj){return ai.chrom===ae})[0];if(af===undefined){ad.load_chroms({chrom:ae},function(){ad.change_chrom(ae,ab,ag)});return}else{if(ae!==ad.chrom){ad.chrom=ae;if(!ad.chrom){ad.intro_div.show()}else{ad.intro_div.hide()}ad.chrom_select.val(ad.chrom);ad.max_high=af.len-1;ad.reset();ad.redraw(true);for(var ah=0,aa=ad.tracks.length;ah<aa;ah++){var ac=ad.tracks[ah];if(ac.init){ac.init()}}}if(ab!==undefined&&ag!==undefined){ad.low=Math.max(ab,0);ad.high=Math.min(ag,ad.max_high)}ad.reset_overview();ad.redraw()}},go_to:function(ae){var ai=this,aa,ad,ab=ae.split(":"),ag=ab[0],ah=ab[1];if(ah!==undefined){try{var af=ah.split("-");aa=parseInt(af[0].replace(/,/g,""),10);ad=parseInt(af[1].replace(/,/g,""),10)}catch(ac){return false}}ai.change_chrom(ag,aa,ad)},move_fraction:function(ac){var aa=this;var ab=aa.high-aa.low;this.move_delta(ac*ab)},move_delta:function(ac){var aa=this;var ab=aa.high-aa.low;if(aa.low-ac<aa.max_low){aa.low=aa.max_low;aa.high=aa.max_low+ab}else{if(aa.high-ac>aa.max_high){aa.high=aa.max_high;aa.low=aa.max_high-ab}else{aa.high-=ac;aa.low-=ac}}aa.redraw()},add_track:function(aa){aa.view=this;aa.track_id=this.track_id_counter;this.tracks.push(aa);if(aa.init){aa.init()}aa.container_div.attr("id","track_"+aa.track_id);C(aa.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(aa){aa.view=this;this.label_tracks.push(aa)},remove_track:function(aa){this.has_changes=true;aa.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(aa)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(ah){var ag=this.high-this.low,af=this.low,ab=this.high;if(af<this.max_low){af=this.max_low}if(ab>this.max_high){ab=this.max_high}if(this.high!==0&&ag<this.min_separation){ab=af+this.min_separation}this.low=Math.floor(af);this.high=Math.ceil(ab);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/M)/Math.LN10));this.zoom_res=Math.pow(t,Math.max(0,Math.ceil(Math.log(this.resolution,t)/Math.log(t))));var aa=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ai=13;this.overview_box.css({left:aa,width:Math.max(ai,ae)}).show();if(ae<ai){this.overview_box.css("left",aa-(ai-ae)/2)}if(this.overview_highlight){this.overview_highlight.css({left:aa,width:ae})}this.update_location(this.low,this.high);if(!ah){for(var ac=0,ad=this.tracks.length;ac<ad;ac++){if(this.tracks[ac]&&this.tracks[ac].enabled){this.tracks[ac].draw()}}for(ac=0,ad=this.label_tracks.length;ac<ad;ac++){this.label_tracks[ac].draw()}}},zoom_in:function(ab,ac){if(this.max_high===0||this.high-this.low<this.min_separation){return}var ad=this.high-this.low,ae=ad/2+this.low,aa=(ad/this.zoom_factor)/2;if(ab){ae=ab/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ae-aa);this.high=Math.round(ae+aa);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var ab=this.high-this.low,ac=ab/2+this.low,aa=(ab*this.zoom_factor)/2;this.low=Math.round(ac-aa);this.high=Math.round(ac+aa);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 p=function(ab,ae){this.track=ab;this.name=ae.name;this.params=[];var am=ae.params;for(var ac=0;ac<am.length;ac++){var ah=am[ac],aa=ah.name,al=ah.label,ad=unescape(ah.html),aj=ah.type;if(aj==="number"){this.params[this.params.length]=new g(aa,al,ad,ah.min,ah.max)}else{if(aj=="select"){this.params[this.params.length]=new K(aa,al,ad)}else{console.log("WARNING: unrecognized tool parameter type:",aa,aj)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(ao){ao.stopPropagation()}).bind("click",function(ao){ao.stopPropagation()}).bind("dblclick",function(ao){ao.stopPropagation()});var ak=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var ai=this.params;var af=this;$.each(this.params,function(ap,at){var ar=$("<div>").addClass("param-row").appendTo(af.parent_div);var ao=$("<div>").addClass("param-label").text(at.label).appendTo(ar);var aq=$("<div/>").addClass("slider").html(at.html).appendTo(ar);$("<div style='clear: both;'/>").appendTo(ar)});this.parent_div.find("input").click(function(){$(this).select()});var an=$("<div>").addClass("slider-row").appendTo(this.parent_div);var ag=$("<input type='submit'>").attr("value","Run").appendTo(an);var af=this;ag.click(function(){af.run()})};o(p.prototype,{get_param_values_dict:function(){var aa={};this.parent_div.find(":input").each(function(){var ab=$(this).attr("name"),ac=$(this).val();aa[ab]=JSON.stringify(ac)});return aa},get_param_values:function(){var ab=[];var aa={};this.parent_div.find(":input").each(function(){var ac=$(this).attr("name"),ad=$(this).val();if(ac){ab[ab.length]=ad}});return ab},run:function(){var ab={dataset_id:this.track.original_dataset_id,chrom:this.track.view.chrom,low:this.track.view.low,high:this.track.view.high,tool_id:this.name};$.extend(ab,this.get_param_values_dict());var ad=this.track,ac=ab.tool_id+ad.tool_region_and_parameters_str(ab.chrom,ab.low,ab.high),ae;if(ad.track_type==="FeatureTrack"){ae=new Q(ac,view,ad.hda_ldda,undefined,{},{},ad)}this.track.add_track(ae);ae.content_div.text("Starting job.");var aa=function(){$.getJSON(run_tool_url,ab,function(af){if(af==="no converter"){ae.container_div.addClass("error");ae.content_div.text(G)}else{if(af.error){ae.container_div.addClass("error");ae.content_div.text(w+af.message)}else{if(af==="pending"){ae.container_div.addClass("pending");ae.content_div.text("Converting input data so that it can be easily reused.");setTimeout(aa,2000)}else{ae.dataset_id=af.dataset_id;ae.content_div.text("Running job.");ae.init()}}}})};aa()}});var K=function(ab,aa,ac){this.name=ab;this.label=aa;this.html=ac};var g=function(ac,ab,ae,ad,aa){K.call(this,ac,ab,ae);this.min=ad;this.max=aa};var j=function(ab,aa,ac){this.name=ab;this.index=aa;this.value=ac};var R=function(ab,aa){this.name=ab;this.index=aa;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.min=Number.MAX_VALUE;this.max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};o(R.prototype,{applies_to:function(aa){if(aa.length>this.index){return true}return false},keep:function(aa){if(!this.applies_to(aa)){return true}var ab=parseInt(aa[this.index]);return(isNaN(ab)||(ab>=this.low&&ab<=this.high))},update_attrs:function(ab){var aa=false;if(!this.applies_to(ab)){return aa}if(ab[this.index]<this.min){this.min=Math.floor(ab[this.index]);aa=true}if(ab[this.index]>this.max){this.max=Math.ceil(ab[this.index]);aa=true}return aa},update_ui_elt:function(){var ab=this.slider.slider("option","min"),aa=this.slider.slider("option","max");if(this.min<ab||this.max>aa){this.slider.slider("option","min",this.min);this.slider.slider("option","max",this.max);this.slider.slider("option","step",h(this.min,this.max));this.slider.slider("option","values",[this.min,this.max])}}});var W=function(ac,ai){this.track=ac;this.filters=[];for(var ae=0;ae<ai.length;ae++){var aa=ai[ae];var ab=aa.name,ah=aa.type,af=aa.index;if(ah==="int"||ah==="float"){this.filters[ae]=new R(ab,af)}else{this.filters[ae]=new j(ab,af,ah)}}var ag=function(aj,ak,al){aj.click(function(){var am=ak.text();max=parseFloat(al.slider("option","max")),input_size=(max<=1?4:max<=1000000?max.toString().length:6),multi_value=false;if(al.slider("option","values")){input_size=2*input_size+1;multi_value=true}ak.text("");$("<input type='text'/>").attr("size",input_size).attr("maxlength",input_size).attr("value",am).appendTo(ak).focus().select().click(function(an){an.stopPropagation()}).blur(function(){$(this).remove();ak.text(am)}).keyup(function(ar){if(ar.keyCode===27){$(this).trigger("blur")}else{if(ar.keyCode===13){var ap=al.slider("option","min"),an=al.slider("option","max"),aq=function(at){return(isNaN(at)||at>an||at<ap)},ao=$(this).val();if(!multi_value){ao=parseFloat(ao);if(aq(ao)){alert("Parameter value must be in the range ["+ap+"-"+an+"]");return $(this)}}else{ao=ao.split("-");ao=[parseFloat(ao[0]),parseFloat(ao[1])];if(aq(ao[0])||aq(ao[1])){alert("Parameter value must be in the range ["+ap+"-"+an+"]");return $(this)}}al.slider((multi_value?"values":"value"),ao)}}})})};this.parent_div=$("<div/>").addClass("filters").hide();this.parent_div.bind("drag",function(aj){aj.stopPropagation()}).bind("click",function(aj){aj.stopPropagation()}).bind("dblclick",function(aj){aj.stopPropagation()});var ad=this;$.each(this.filters,function(ap,ak){var am=$("<div/>").addClass("slider-row").appendTo(ad.parent_div);var aj=$("<div/>").addClass("slider-label").appendTo(am);var ar=$("<span/>").addClass("slider-name").text(ak.name+" ").appendTo(aj);var al=$("<span/>");var an=$("<span/>").addClass("slider-value").appendTo(aj).append("[").append(al).append("]");var aq=$("<div/>").addClass("slider").appendTo(am);ak.control_element=$("<div/>").attr("id",ak.name+"-filter-control").appendTo(aq);var ao=[0,0];ak.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(at,au){ao=au.values;al.text(au.values[0]+"-"+au.values[1]);setTimeout(function(){if(au.values[0]==ao[0]&&au.values[1]==ao[1]){var av=au.values;al.text(av[0]+"-"+av[1]);ak.low=av[0];ak.high=av[1];ad.track.draw(true,true)}},50)},change:function(at,au){ak.control_element.slider("option","slide").call(ak.control_element,at,au)}});ak.slider=ak.control_element;ak.slider_label=al;ag(an,al,ak.control_element);$("<div style='clear: both;'/>").appendTo(am)})};var V=function(aa){this.track=aa.track;this.params=aa.params;this.values={};if(aa.saved_values){this.restore_values(aa.saved_values)}this.onchange=aa.onchange};o(V.prototype,{restore_values:function(aa){var ab=this;$.each(this.params,function(ac,ad){if(aa[ad.key]!==undefined){ab.values[ad.key]=aa[ad.key]}else{ab.values[ad.key]=ad.default_value}})},build_form:function(){var ab=this;var aa=$("<div />");$.each(this.params,function(af,ad){if(!ad.hidden){var ac="param_"+af;var ak=$("<div class='form-row' />").appendTo(aa);ak.append($("<label />").attr("for",ac).text(ad.label+":"));if(ad.type==="bool"){ak.append($('<input type="checkbox" />').attr("id",ac).attr("name",ac).attr("checked",ab.values[ad.key]))}else{if(ad.type==="color"){var ah=ab.values[ad.key];var ag=$("<input />").attr("id",ac).attr("name",ac).val(ah);var ai=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var ae=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(ai);var aj=$("<div/>").appendTo(ae).farbtastic({width:100,height:100,callback:ag,color:ah});$("<div />").append(ag).append(ai).appendTo(ak).bind("click",function(al){ai.css({left:$(this).position().left+($(ag).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){ai.hide();$(document).unbind("click.color-picker")});al.stopPropagation()})}else{ak.append($("<input />").attr("id",ac).attr("name",ac).val(ab.values[ad.key]))}}}});return aa},update_from_form:function(aa){var ac=this;var ab=false;$.each(this.params,function(ad,af){if(!af.hidden){var ag="param_"+ad;var ae=aa.find("#"+ag).val();if(af.type==="float"){ae=parseFloat(ae)}else{if(af.type==="int"){ae=parseInt(ae)}else{if(af.type==="bool"){ae=aa.find("#"+ag).is(":checked")}}}if(ae!==ac.values[af.key]){ac.values[af.key]=ae;ab=true}}});if(ab){this.onchange()}}});var b=function(ac,ab,aa){this.index=ac;this.resolution=ab;this.canvas=$("<div class='track-tile'/>").append(aa)};var m=function(ac,ab,aa,ad){b.call(this,ac,ab,aa);this.max_val=ad};var L=function(ac,ab,aa){b.call(this,ac,ab,aa)};var k=function(ab,aa,ae,ac,ad){this.name=ab;this.view=aa;this.parent_element=ae;this.data_url=(ac?ac:default_data_url);this.data_url_extra_params={};this.data_query_wait=(ad?ad:H);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)};o(k.prototype,{init:function(){var aa=this;aa.enabled=false;aa.tile_cache.clear();aa.data_cache.clear();aa.initial_canvas=undefined;aa.content_div.css("height","auto");aa.container_div.removeClass("nodata error pending");if(!aa.dataset_id){return}$.getJSON(converted_datasets_state_url,{hda_ldda:aa.hda_ldda,dataset_id:aa.dataset_id,chrom:aa.view.chrom},function(ab){if(!ab||ab==="error"||ab.kind==="error"){aa.container_div.addClass("error");aa.content_div.text(n);if(ab.message){var ad=aa.view.tracks.indexOf(aa);var ac=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+ab.message+"</pre>",{Close:hide_modal})});aa.content_div.append(ac)}}else{if(ab==="no converter"){aa.container_div.addClass("error");aa.content_div.text(G)}else{if(ab==="no data"||(ab.data!==undefined&&(ab.data===null||ab.data.length===0))){aa.container_div.addClass("nodata");aa.content_div.text(B)}else{if(ab==="pending"){aa.container_div.addClass("pending");aa.content_div.text(r);setTimeout(function(){aa.init()},aa.data_query_wait)}else{if(ab.status==="data"){if(ab.valid_chroms){aa.valid_chroms=ab.valid_chroms;aa.make_name_popup_menu()}aa.content_div.text(U);if(aa.view.chrom){aa.content_div.text("");aa.content_div.css("height",aa.height_px+"px");aa.enabled=true;$.when(aa.predraw_init()).done(function(){aa.container_div.removeClass("nodata error pending");aa.draw()})}}}}}}})},predraw_init:function(){},update_name:function(aa){this.old_name=this.name;this.name=aa;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var J=function(ai,ag,aj){var ab=this,ak=ab.view;this.filters_manager=(ai!==undefined?new W(this,ai):undefined);this.filters_available=false;this.filters_visible=false;this.tool=(ag!==undefined&&obj_length(ag)>0?new p(this,ag):undefined);this.parent_track=aj;this.child_tracks=[];if(ab.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}ab.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();ab.container_div.append(ab.child_tracks_container);if(this.filters_manager){this.filters_div=this.filters_manager.parent_div;this.header_div.after(this.filters_div)}if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}if(ab.display_modes!==undefined){if(ab.mode_div===undefined){ab.mode_div=$("<div class='right-float menubutton popup' />").appendTo(ab.header_div);var ad=(ab.track_config&&ab.track_config.values.mode?ab.track_config.values.mode:ab.display_modes[0]);ab.mode=ad;ab.mode_div.text(ad);var ac=function(al){ab.mode_div.text(al);ab.mode=al;ab.track_config.values.mode=al;ab.tile_cache.clear();ab.draw()};var aa={};for(var ae=0,ah=ab.display_modes.length;ae<ah;ae++){var af=ab.display_modes[ae];aa[af]=function(al){return function(){ac(al)}}(af)}make_popupmenu(ab.mode_div,aa)}else{ab.mode_div.hide()}}this.make_name_popup_menu()};o(J.prototype,k.prototype,{make_name_popup_menu:function(){var ab=this;var aa={};aa["Edit configuration"]=function(){var ah=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},af=function(){ab.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){af()}}};$(window).bind("keypress.check_enter_esc",ag);show_modal("Configure Track",ab.track_config.build_form(),{Cancel:ah,OK:af})};if(ab.filters_available>0){var ae=(ab.filters_div.is(":visible")?"Hide filters":"Show filters");aa[ae]=function(){ab.filters_visible=(ab.filters_div.is(":visible"));ab.filters_div.toggle();ab.make_name_popup_menu()}}if(ab.tool){var ae=(ab.dynamic_tool_div.is(":visible")?"Hide tool":"Show tool");aa[ae]=function(){if(!ab.dynamic_tool_div.is(":visible")){ab.update_name(ab.name+ab.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";ab.revert_name()}ab.dynamic_tool_div.toggle();ab.make_name_popup_menu()}}if(ab.valid_chroms){aa["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+ab.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var ac=view;var ad=function(){$("#no-tracks").show()};if(this.parent_track){ac=this.parent_track;ad=function(){}}aa.Remove=function(){ac.remove_track(ab);if(ac.num_tracks===0){ad()}};make_popupmenu(ab.name_div,aa)},draw:function(aa,ac){var au=this.view.low,ag=this.view.high,ai=ag-au,ak=this.view.container.width(),ae=ak/ai,al=this.view.resolution,ad=$("<div style='position: relative;'></div>"),am=function(aw,ax,av){return aw+"_"+ax+"_"+av};if(!ac){this.content_div.children().remove()}this.content_div.append(ad);this.max_height=0;var ao=Math.floor(au/al/M);var af=[];var ap=0;while((ao*M*al)<ag){var at=am(ak,ae,ao);var ah=this.tile_cache.get(at);var aq=ao*M*this.view.resolution;var ab=aq+M*this.view.resolution;if(!aa&&ah){af[af.length]=ah;this.show_tile(ah,ad,aq,ae)}else{this.delayed_draw(aa,at,ao,al,ad,ae,af)}ao+=1;ap++}var aj=this;var ar=setInterval(function(){if(af.length===ap){clearInterval(ar);if(ac){var ay=aj.content_div.children();var az=false;for(var ax=ay.length-1,aD=0;ax>=aD;ax--){var aw=$(ay[ax]);if(az){aw.remove()}else{if(aw.children().length!==0){az=true}}}}if(aj.track_type=="FeatureTrack"&&aj.mode=="Histogram"){var aC=-1;for(var ax=0;ax<af.length;ax++){var aF=af[ax].max_val;if(aF>aC){aC=aF}}for(var ax=0;ax<af.length;ax++){if(af[ax].max_val!==aC){var aE=af[ax];aE.canvas.remove();aj.delayed_draw(true,am(ak,ae,aE.index),aE.index,aE.resolution,ad,ae,[],{max:aC})}}}if(aj.filters_manager){var av=aj.filters_manager.filters;for(var aB=0;aB<av.length;aB++){av[aB].update_ui_elt()}var aA=false;if(aj.example_feature){for(var aB=0;aB<av.length;aB++){if(av[aB].applies_to(aj.example_feature)){aA=true;break}}}if(aj.filters_available!==aA){aj.filters_available=aA;if(!aj.filters_available){aj.filters_div.hide()}aj.make_name_popup_menu()}}}},50);for(var an=0;an<this.child_tracks.length;an++){this.child_tracks[an].draw(aa,ac)}},delayed_draw:function(ab,ai,ac,ae,aj,am,ak,af){var ad=this,ag=ac*M*ae,al=ag+M*ae;var ah=function(av,an,ap,ao,at,au,aq){var ar=ad.draw_tile(an,ap,ao,au,aq);ad.tile_cache.set(ai,ar);ad.show_tile(ar,at,ag,au);ak[ak.length]=ar};var aa=setTimeout(function(){if(ag<=ad.view.high&&al>=ad.view.low){var an=(ab?undefined:ad.tile_cache.get(ai));if(an){ad.show_tile(an,aj,ag,am);ak[ak.length]=an}else{$.when(ad.data_cache.get_data(view.chrom,ag,al,ad.mode,ae,ad.data_url_extra_params)).then(function(ao){o(ao,af);if(view.reference_track&&am>view.canvas_manager.char_width_px){$.when(view.reference_track.data_cache.get_data(view.chrom,ag,al,ad.mode,ae,view.reference_track.data_url_extra_params)).then(function(ap){ah(aa,ao,ae,ac,aj,am,ap)})}else{ah(aa,ao,ae,ac,aj,am)}})}}},50)},show_tile:function(ad,ag,ae,ah){var ab=this;var ac=this.view.high-this.view.low,af=(ae-this.view.low)*ah;if(this.left_offset){af-=this.left_offset}var aa=ad.canvas;aa.css({position:"absolute",top:0,left:af,height:""});ag.append(aa);ab.max_height=Math.max(ab.max_height,aa.height());ab.content_div.css("height",ab.max_height+"px");ag.children().css("height",ab.max_height+"px")},set_overview:function(){var aa=this.view;if(this.initial_canvas&&this.is_overview){aa.overview_close.show();aa.overview_viewport.append(this.initial_canvas);aa.overview_highlight.show().height(this.initial_canvas.height());aa.overview_viewport.height(this.initial_canvas.height()+aa.overview_box.height())}$(window).trigger("resize")},tool_region_and_parameters_str:function(ac,aa,ad){var ab=this,ae=(ac!==undefined&&aa!==undefined&&ad!==undefined?ac+":"+aa+"-"+ad:"all");return" - region=["+ae+"], parameters=["+ab.tool.get_param_values().join(", ")+"]"},add_track:function(aa){aa.track_id=this.track_id+"_"+this.child_tracks.length;aa.container_div.attr("id","track_"+aa.track_id);this.child_tracks_container.append(aa.container_div);C(aa.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(aa);this.view.has_changes=true},remove_track:function(aa){aa.container_div.fadeOut("slow",function(){$(this).remove()})}});var X=function(aa,ab){this.track_type="LabelTrack";this.hidden=true;k.call(this,null,aa,ab);this.container_div.addClass("label-track")};o(X.prototype,k.prototype,{draw:function(){var ac=this.view,ad=ac.high-ac.low,ag=Math.floor(Math.pow(10,Math.floor(Math.log(ad)/Math.log(10)))),aa=Math.floor(ac.low/ag)*ag,ae=this.view.container.width(),ab=$("<div style='position: relative; height: 1.3em;'></div>");while(aa<ac.high){var af=(aa-ac.low)/ad*ae;ab.append($("<div class='label'>"+commatize(aa)+"</div>").css({position:"absolute",left:af-1}));aa+=ag}this.content_div.children(":first").remove();this.content_div.append(ab)}});var y=function(aa){this.track_type="ReferenceTrack";this.hidden=true;k.call(this,null,aa,aa.top_labeltrack);J.call(this);aa.reference_track=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_url=reference_url;this.data_url_extra_params={dbkey:aa.dbkey};this.data_cache=new E(z,this,false);this.tile_cache=new c(s)};o(y.prototype,J.prototype,{draw_tile:function(ai,af,ab,ak){var ae=this,ac=M*af;if(ak>this.view.canvas_manager.char_width_px){if(ai===null){ae.content_div.css("height","0px");return}var ad=this.view.canvas_manager.new_canvas();var aj=ad.getContext("2d");ad.width=Math.ceil(ac*ak+ae.left_offset);ad.height=ae.height_px;aj.font=aj.canvas.manager.default_font;aj.textAlign="center";for(var ag=0,ah=ai.length;ag<ah;ag++){var aa=Math.round(ag*ak);aj.fillText(ai[ag],aa+ae.left_offset,10)}return new b(ab,af,ad)}this.content_div.css("height","0px")}});var l=function(ae,ac,af,aa,ad){var ab=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";k.call(this,ae,ac,ac.viewport_container);J.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=af;this.dataset_id=aa;this.original_dataset_id=aa;this.data_cache=new N(z,this);this.tile_cache=new c(s);this.track_config=new V({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:ad,onchange:function(){ab.vertical_range=ab.prefs.max_value-ab.prefs.min_value;$("#linetrack_"+ab.track_id+"_minval").text(ab.prefs.min_value);$("#linetrack_"+ab.track_id+"_maxval").text(ab.prefs.max_value);ab.tile_cache.clear();ab.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;this.add_resize_handle()};o(l.prototype,J.prototype,{add_resize_handle:function(){var aa=this;var ad=false;var ac=false;var ab=$("<div class='track-resize'>");$(aa.container_div).hover(function(){ad=true;ab.show()},function(){ad=false;if(!ac){ab.hide()}});ab.hide().bind("dragstart",function(ae,af){ac=true;af.original_height=$(aa.content_div).height()}).bind("drag",function(af,ag){var ae=Math.min(Math.max(ag.original_height+ag.deltaY,aa.min_height_px),aa.max_height_px);$(aa.content_div).css("height",ae);aa.height_px=ae;aa.draw(true)}).bind("dragend",function(ae,af){aa.tile_cache.clear();ac=false;if(!ad){ab.hide()}aa.track_config.values.height=aa.height_px}).appendTo(aa.container_div)},predraw_init:function(){var aa=this,ab=aa.view.tracks.indexOf(aa);aa.vertical_range=undefined;return $.getJSON(aa.data_url,{stats:true,chrom:aa.view.chrom,low:null,high:null,hda_ldda:aa.hda_ldda,dataset_id:aa.dataset_id},function(ac){aa.container_div.addClass("line-track");var ae=ac.data;if(isNaN(parseFloat(aa.prefs.min_value))||isNaN(parseFloat(aa.prefs.max_value))){aa.prefs.min_value=ae.min;aa.prefs.max_value=ae.max;$("#track_"+ab+"_minval").val(aa.prefs.min_value);$("#track_"+ab+"_maxval").val(aa.prefs.max_value)}aa.vertical_range=aa.prefs.max_value-aa.prefs.min_value;aa.total_frequency=ae.total_frequency;aa.container_div.find(".yaxislabel").remove();var af=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+ab+"_minval").text(v(aa.prefs.min_value));var ad=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+ab+"_maxval").text(v(aa.prefs.max_value));ad.css({position:"absolute",top:"24px",left:"10px"});ad.prependTo(aa.container_div);af.css({position:"absolute",bottom:"2px",left:"10px"});af.prependTo(aa.container_div)})},draw_tile:function(ak,ae,ab,aj){if(this.vertical_range===undefined){return}var af=ab*M*ae,ad=M*ae,aa=Math.ceil(ad*aj),ah=this.height_px;var ac=this.view.canvas_manager.new_canvas();ac.width=aa,ac.height=ah;var ai=ac.getContext("2d");var ag=new I.LinePainter(ak.data,af,af+ad,this.prefs,this.mode);ag.draw(ai,aa,ah);return new b(ad,ae,ac)}});var e=function(aa,af,ae,ai,ah,ac,ad,ag){var ab=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Histogram","Dense","Squish","Pack"];this.track_config=new V({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:ah,onchange:function(){ab.tile_cache.clear();ab.draw()}});this.prefs=this.track_config.values;k.call(this,aa,af,af.viewport_container);J.call(this,ac,ad,ag);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=ae;this.dataset_id=ai;this.original_dataset_id=ai;this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.inc_slots={};this.start_end_dct={};this.tile_cache=new c(d);this.data_cache=new N(20,this);this.left_offset=200;this.painter=I.LinkedFeaturePainter};o(e.prototype,J.prototype,{update_auto_mode:function(aa){if(this.mode=="Auto"){if(aa=="no_detail"){aa="feature spans"}else{if(aa=="summary_tree"){aa="coverage histogram"}}this.mode_div.text("Auto ("+aa+")")}},incremental_slots:function(ae,ab,ad){var ac=this.view.canvas_manager.dummy_context,aa=this.inc_slots[ae];if(!aa||(aa.mode!==ad)){aa=new (q.FeatureSlotter)(ae,ad==="Pack",x,function(af){return ac.measureText(af)});aa.mode=ad;this.inc_slots[ae]=aa}return aa.slot_features(ab)},get_summary_tree_data:function(ae,ah,ac,ap){if(ap>ac-ah){ap=ac-ah}var al=Math.floor((ac-ah)/ap),ao=[],ad=0;var af=0,ag=0,ak,an=0,ai=[],am,aj;var ab=function(at,ar,au,aq){at[0]=ar+au*aq;at[1]=ar+(au+1)*aq};while(an<ap&&af!==ae.length){var aa=false;for(;an<ap&&!aa;an++){ab(ai,ah,an,al);for(ag=af;ag<ae.length;ag++){ak=ae[ag].slice(1,3);if(is_overlap(ak,ai)){aa=true;break}}if(aa){break}}data_start_index=ag;ao[ao.length]=am=[ai[0],0];for(;ag<ae.length;ag++){ak=ae[ag].slice(1,3);if(is_overlap(ak,ai)){am[1]++}else{break}}if(am[1]>ad){ad=am[1]}an++}return{max:ad,delta:al,data:ao}},draw_tile:function(an,aw,aA,aj,ad){var at=this,aC=aA*M*aw,ab=(aA+1)*M*aw,ap=ab-aC,au=Math.ceil(ap*aj),ar=this.mode,aG=25,ae=this.left_offset,ao,af;if(ar==="Auto"){if(an.dataset_type==="summary_tree"){ar=an.dataset_type}else{if(an.extra_info==="no_detail"){ar="no_detail"}else{var aF=an.data;if(this.view.high-this.view.low>F){ar="Squish"}else{ar="Pack"}}}this.update_auto_mode(ar)}if(ar==="summary_tree"||ar==="Histogram"){af=this.summary_draw_height;this.container_div.find(".yaxislabel").remove();var aa=$("<div />").addClass("yaxislabel");aa.text(an.max);aa.css({position:"absolute",top:"22px",left:"10px"});aa.prependTo(this.container_div);var ac=this.view.canvas_manager.new_canvas();ac.width=au+ae;ac.height=af+O;if(an.dataset_type!="summary_tree"){var ak=this.get_summary_tree_data(an.data,aC,ab,200);if(an.max){ak.max=an.max}an=ak}var aD=new I.SummaryTreePainter(an,aC,ab,this.prefs);var av=ac.getContext("2d");av.translate(ae,O);aD.draw(av,au,af);return new m(aA,aw,ac,an.max)}var ao,ah=1;if(ar==="no_detail"||ar==="Squish"||ar==="Pack"){ah=this.incremental_slots(aj,an.data,ar);ao=this.inc_slots[aj].slots}var ai=[];if(an.data){var al=this.filters_manager.filters;for(var ax=0,az=an.data.length;ax<az;ax++){var ag=an.data[ax];var ay=false;var am;for(var aB=0,aE=al.length;aB<aE;aB++){am=al[aB];am.update_attrs(ag);if(!am.keep(ag)){ay=true;break}}if(!ay){ai.push(ag)}}}var aD=new (this.painter)(ai,aC,ab,this.prefs,ar,ad);var af=aD.get_required_height(ah)+A;var ac=this.view.canvas_manager.new_canvas();ac.width=au+ae;ac.height=af;var av=ac.getContext("2d");av.fillStyle=this.prefs.block_color;av.font=av.canvas.manager.default_font;av.textAlign="right";this.container_div.find(".yaxislabel").remove();if(an.message){$(ac).css({"border-top":"1px solid red"});av.fillStyle="red";av.textAlign="left";var aq=av.textBaseline;av.textBaseline="top";av.fillText(an.message,ae,0);av.textBaseline=aq;if(!an.data){return new b(aA,aw,ac,af)}}this.example_feature=(an.data.length?an.data[0]:undefined);av.translate(ae,A);aD.draw(av,au,af,ao);return new L(aA,aw,ac)}});var P=function(ad,ab,af,aa,ac,ae){e.call(this,ad,ab,af,aa,ac,ae);this.track_type="VcfTrack";this.painter=I.VariantPainter};o(P.prototype,J.prototype,e.prototype);var S=function(ad,ab,af,aa,ac,ae){e.call(this,ad,ab,af,aa,ac,ae);this.track_config=new V({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_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:ac,onchange:function(){this.track.tile_cache.clear();this.track.draw()}});this.prefs=this.track_config.values;this.track_type="ReadTrack";this.painter=I.ReadPainter;this.make_name_popup_menu()};o(S.prototype,J.prototype,e.prototype);var Q=function(ae,ac,ag,aa,ad,af,ab){e.call(this,ae,ac,ag,aa,ad,af,{},ab);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};o(Q.prototype,J.prototype,e.prototype,{predraw_init:function(){var ab=this;var aa=function(){if(ab.data_cache.size()===0){setTimeout(aa,300)}else{ab.data_url=default_data_url;ab.data_query_wait=H;ab.dataset_state_url=converted_datasets_state_url;$.getJSON(ab.dataset_state_url,{dataset_id:ab.dataset_id,hda_ldda:ab.hda_ldda},function(ac){})}};aa()}});T.View=Y;T.LineTrack=l;T.FeatureTrack=e;T.ReadTrack=S};var slotting_module=function(c,b){var e=c("class").extend;var d=2,a=5;b.FeatureSlotter=function(j,h,f,g){this.slots={};this.start_end_dct={};this.w_scale=j;this.include_label=h;this.max_rows=f;this.measureText=g};e(b.FeatureSlotter.prototype,{slot_features:function(m){var p=this.w_scale,s=this.slots,h=this.start_end_dct,y=[],A=[],n=0,z=this.max_rows;for(var w=0,x=m.length;w<x;w++){var l=m[w],o=l[0];if(s[o]!==undefined){n=Math.max(n,s[o]);A.push(s[o])}else{y.push(w)}}var q=function(G,H){for(var F=0;F<=z;F++){var D=false,I=h[F];if(I!==undefined){for(var C=0,E=I.length;C<E;C++){var B=I[C];if(H>B[0]&&G<B[1]){D=true;break}}}if(!D){return F}}return -1};for(var w=0,x=y.length;w<x;w++){var l=m[y[w]],o=l[0],u=l[1],f=l[2],r=l[3],g=Math.floor(u*p),k=Math.ceil(f*p),v=this.measureText(r).width,j;if(r!==undefined&&this.include_label){v+=(d+a);if(g-v>=0){g-=v;j="left"}else{k+=v;j="right"}}var t=q(g,k);if(t>=0){if(h[t]===undefined){h[t]=[]}h[t].push([g,k]);s[o]=t;n=Math.max(n,t)}else{}}return n+1}})};var painters_module=function(j,w){var t=j("class").extend;var o=function(H,z,F,y,E,C){if(C===undefined){C=4}var B=y-z;var A=E-F;var D=Math.floor(Math.sqrt(B*B+A*A)/C);var I=B/D;var G=A/D;var x;for(x=0;x<D;x++,z+=I,F+=G){if(x%2!==0){continue}H.fillRect(z,F,C,1)}};var p=function(A,z,x,D){var C=z-D/2,B=z+D/2,E=x-Math.sqrt(D*3/2);A.beginPath();A.moveTo(C,E);A.lineTo(B,E);A.lineTo(z,x);A.lineTo(C,E);A.strokeStyle=this.fillStyle;A.fill();A.stroke();A.closePath()};var m=function(z,B,x,y,A){this.data=z;this.view_start=B;this.view_end=x;this.prefs=t({},this.default_prefs,y);this.mode=A};m.prototype.default_prefs={};var u=function(z,B,x,y,A){m.call(this,z,B,x,y,A)};u.prototype.default_prefs={show_counts:false};u.prototype.draw=function(M,z,L){var E=this.view_start,O=this.view_end-this.view_start,N=z/O;var J=this.data.data,I=this.data.delta,G=this.data.max,B=L;delta_x_px=Math.ceil(I*N);M.save();for(var C=0,D=J.length;C<D;C++){var H=Math.floor((J[C][0]-E)*N);var F=J[C][1];if(!F){continue}var K=F/G*L;if(F!==0&&K<1){K=1}M.fillStyle="black";M.fillRect(H,B-K,delta_x_px,K);var A=4;if(this.prefs.show_counts&&(M.measureText(F).width+A)<delta_x_px){M.fillStyle="#666";M.textAlign="center";M.fillText(F,H+(delta_x_px/2),10)}}M.restore()};var c=function(z,B,x,y,A){m.call(this,z,B,x,y,A)};c.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};c.prototype.draw=function(O,N,L){var F=false,H=this.prefs.min_value,D=this.prefs.max_value,K=D-H,z=L,A=this.view_start,M=this.view_end-this.view_start,B=N/M,I=this.mode,S=this.data;O.save();var T=Math.round(L+H/K*L);if(I!=="Intensity"){O.fillStyle="#aaa";O.fillRect(0,T,N,1)}O.beginPath();O.fillStyle=this.prefs.color;var R,E,C;if(S.length>1){C=Math.ceil((S[1][0]-S[0][0])*B)}else{C=10}for(var P=0,Q=S.length;P<Q;P++){R=Math.round((S[P][0]-A)*B);E=S[P][1];if(E===null){if(F&&I==="Filled"){O.lineTo(R,z)}F=false;continue}if(E<H){E=H}else{if(E>D){E=D}}if(I==="Histogram"){E=Math.round(E/K*z);O.fillRect(R,T,C,-E)}else{if(I==="Intensity"){E=255-Math.floor((E-H)/K*255);O.fillStyle="rgb("+E+","+E+","+E+")";O.fillRect(R,0,C,z)}else{E=Math.round(z-(E-H)/K*z);if(F){O.lineTo(R,E)}else{F=true;if(I==="Filled"){O.moveTo(R,z);O.lineTo(R,E)}else{O.moveTo(R,E)}}}}}if(I==="Filled"){if(F){O.lineTo(R,T);O.lineTo(0,T)}O.fill()}else{O.stroke()}var x=-1,J=-1;O.fillStyle=this.prefs.overflow_color;var G;for(var P=0,Q=S.length;P<Q;P++){E=S[P][1];R=Math.round((S[P][0]-A)*B);if(J>=0&&(E===null||E<D)){O.fillRect(J,0,G+C-J,2);J=-1}else{if(x>=0&&(E===null||E>H)){O.fillRect(x,L-2,G+C-x,2);x=-1}}if(E!==null&&E>D&&J<0){J=R}else{if(E!==null&&E<H&&x<0){x=R}}G=R}O.restore()};var n=function(z,B,x,y,A){m.call(this,z,B,x,y,A)};n.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};t(n.prototype,{get_required_height:function(y){var x=y_scale=this.get_row_height(),z=this.mode;if(z==="no_detail"||z==="Squish"||z==="Pack"){x=y*y_scale}return x+Math.max(Math.round(y_scale/2),5)},draw:function(J,A,I,F){var D=this.data,G=this.view_start,K=this.view_end;J.save();J.fillStyle=this.prefs.block_color;J.textAlign="right";var N=this.view_end-this.view_start,M=A/N,z=this.get_row_height();for(var C=0,E=D.length;C<E;C++){var L=D[C],B=L[0],x=L[1],y=L[2],H=(F&&F[B]!==undefined?F[B]:null);if((x<K&&y>G)&&(this.mode=="Dense"||H!==null)){this.draw_element(J,this.mode,L,H,G,K,M,z,A)}}J.restore()}});var d=10,h=3,l=5,v=10,f=1,r=3,e=3,a=9,k=2,g="#ccc";var q=function(z,B,x,y,A){n.call(this,z,B,x,y,A)};t(q.prototype,n.prototype,{get_row_height:function(){var y=this.mode,x;if(y==="Dense"){x=d}else{if(y==="no_detail"){x=h}else{if(y==="Squish"){x=l}else{x=v}}}return x},draw_element:function(J,C,R,E,L,ab,af,ag,x){var O=R[0],ad=R[1],V=R[2],M=R[3],W=Math.floor(Math.max(0,(ad-L)*af)),K=Math.ceil(Math.min(x,Math.max(0,(V-L)*af))),U=(C==="Dense"?0:(0+E))*ag,I,Z,N=null,ah=null,A=this.prefs.block_color,Y=this.prefs.label_color;if(C=="Dense"){E=1}if(C==="no_detail"){J.fillStyle=A;J.fillRect(W,U+5,K-W,f)}else{var H=R[4],T=R[5],X=R[6],B=R[7];if(T&&X){N=Math.floor(Math.max(0,(T-L)*af));ah=Math.ceil(Math.min(x,Math.max(0,(X-L)*af)))}var ae,P;if(C==="Squish"||C==="Dense"){ae=1;P=e}else{ae=5;P=a}if(!B){if(R.strand){if(R.strand==="+"){J.fillStyle=J.canvas.manager.get_pattern("right_strand_inv")}else{if(R.strand==="-"){J.fillStyle=J.canvas.manager.get_pattern("left_strand_inv")}}}else{J.fillStyle=A}J.fillRect(W,U,K-W,P)}else{var G,Q;if(C==="Squish"||C==="Dense"){J.fillStyle=g;G=U+Math.floor(e/2)+1;Q=1}else{if(H){var G=U;var Q=P;if(H==="+"){J.fillStyle=J.canvas.manager.get_pattern("right_strand")}else{if(H==="-"){J.fillStyle=J.canvas.manager.get_pattern("left_strand")}}}else{J.fillStyle=g;G+=(e/2)+1;Q=1}}J.fillRect(W,G,K-W,Q);for(var ac=0,z=B.length;ac<z;ac++){var D=B[ac],y=Math.floor(Math.max(0,(D[0]-L)*af)),S=Math.ceil(Math.min(x,Math.max((D[1]-L)*af)));if(y>S){continue}J.fillStyle=A;J.fillRect(y,U+(P-ae)/2+1,S-y,ae);if(N!==undefined&&X>T&&!(y>ah||S<N)){var aa=Math.max(y,N),F=Math.min(S,ah);J.fillRect(aa,U+1,F-aa,P);if(B.length==1&&C=="Pack"){if(H==="+"){J.fillStyle=J.canvas.manager.get_pattern("right_strand_inv")}else{if(H==="-"){J.fillStyle=J.canvas.manager.get_pattern("left_strand_inv")}}if(aa+14<F){aa+=2;F-=2}J.fillRect(aa,U+1,F-aa,P)}}}}if(C==="Pack"&&ad>L){J.fillStyle=Y;if(L===0&&W-J.measureText(M).width<0){J.textAlign="left";J.fillText(M,K+k,U+8)}else{J.textAlign="right";J.fillText(M,W-k,U+8)}J.fillStyle=A}}}});var b=function(z,B,x,y,A){n.call(this,z,B,x,y,A)};t(b.prototype,n.prototype,{draw_element:function(Q,L,F,B,T,z,I,R,O){var F=data[i],H=F[0],P=F[1],A=F[2],K=F[3],D=Math.floor(Math.max(0,(P-T)*I)),G=Math.ceil(Math.min(O,Math.max(0,(A-T)*I))),C=(L==="Dense"?0:(0+B))*R,x,U,y=null,J=null;if(no_label){Q.fillStyle=block_color;Q.fillRect(D+left_offset,C+5,G-D,1)}else{var S=F[4],N=F[5],E=F[6];x=9;U=1;Q.fillRect(D+left_offset,C,G-D,x);if(L!=="Dense"&&K!==undefined&&P>T){Q.fillStyle=label_color;if(T===0&&D-Q.measureText(K).width<0){Q.textAlign="left";Q.fillText(K,G+2+left_offset,C+8)}else{Q.textAlign="right";Q.fillText(K,D-2+left_offset,C+8)}Q.fillStyle=block_color}var M=S+" / "+N;if(P>T&&Q.measureText(M).width<(G-D)){Q.fillStyle="white";Q.textAlign="center";Q.fillText(M,left_offset+D+(G-D)/2,C+8);Q.fillStyle=block_color}}}});var s=function(A,C,x,z,B,y){n.call(this,A,C,x,z,B);this.ref_seq=y};s.prototype.default_prefs=t({},n.prototype.default_prefs,{show_insertions:false});t(s.prototype,n.prototype,{get_row_height:function(){var x,y=this.mode;if(y==="Dense"){x=d}else{if(y==="Squish"){x=l}else{x=v;if(this.prefs.show_insertions){x*=2}}}return x},draw_read:function(T,O,K,Y,z,S,H,E,D){T.textAlign="center";var R=this,y=[Y,z],N=0,U=0,Q=0;ref_seq=this.ref_seq,char_width_px=T.canvas.manager.char_width_px;var ad=[];if((O==="Pack"||this.mode==="Auto")&&E!==undefined&&K>char_width_px){Q=Math.round(K/2)}if(!H){H=[[0,E.length]]}for(var L=0,W=H.length;L<W;L++){var I=H[L],A="MIDNSHP=X"[I[0]],M=I[1];if(A==="H"||A==="S"){N-=M}var F=S+N,ac=Math.floor(Math.max(0,(F-Y)*K)),G=Math.floor(Math.max(0,(F+M-Y)*K));if(ac===G){G+=1}switch(A){case"H":break;case"S":case"M":case"=":if(is_overlap([F,F+M],y)){var P=E.slice(U,U+M);if(Q>0){T.fillStyle=this.prefs.block_color;T.fillRect(ac-Q,D+1,G-ac,9);T.fillStyle=g;for(var aa=0,x=P.length;aa<x;aa++){if(this.prefs.show_differences&&ref_seq){var J=ref_seq[F-Y+aa];if(!J||J.toLowerCase()===P[aa].toLowerCase()){continue}}if(F+aa>=Y&&F+aa<=z){var ab=Math.floor(Math.max(0,(F+aa-Y)*K));T.fillText(P[aa],ab,D+9)}}}else{T.fillStyle=this.prefs.block_color;T.fillRect(ac,D+4,G-ac,e)}}U+=M;N+=M;break;case"N":T.fillStyle=g;T.fillRect(ac-Q,D+5,G-ac,1);N+=M;break;case"D":T.fillStyle="red";T.fillRect(ac-Q,D+4,G-ac,3);N+=M;break;case"P":break;case"I":var X=ac-Q;if(is_overlap([F,F+M],y)){var P=E.slice(U,U+M);if(this.prefs.show_insertions){var C=ac-(G-ac)/2;if((O==="Pack"||this.mode==="Auto")&&E!==undefined&&K>char_width_px){T.fillStyle="yellow";T.fillRect(C-Q,D-9,G-ac,9);ad[ad.length]={type:"triangle",data:[X,D+4,5]};T.fillStyle=g;switch(seq_tile_overlap){case (OVERLAP_START):P=P.slice(Y-F);break;case (OVERLAP_END):P=P.slice(0,F-z);break;case (CONTAINED_BY):break;case (CONTAINS):P=P.slice(Y-F,F-z);break}for(var aa=0,x=P.length;aa<x;aa++){var ab=Math.floor(Math.max(0,(F+aa-Y)*K));T.fillText(P[aa],ab-(G-ac)/2,D)}}else{T.fillStyle="yellow";T.fillRect(C,D+(this.mode!=="Dense"?2:5),G-ac,(O!=="Dense"?e:r))}}else{if((O==="Pack"||this.mode==="Auto")&&E!==undefined&&K>char_width_px){ad[ad.length]={type:"text",data:[P.length,X,D+9]}}else{}}}U+=M;break;case"X":U+=M;break}}T.fillStyle="yellow";var Z,B,ae;for(var V=0;V<ad.length;V++){Z=ad[V];B=Z.type;ae=Z.data;if(B==="text"){T.save();T.font="bold "+T.font;T.fillText(ae[0],ae[1],ae[2]);T.restore()}else{if(B=="triangle"){p(T,ae[0],ae[1],ae[2])}}}},draw_element:function(Q,L,D,A,T,y,H,R,O){var G=D[0],P=D[1],z=D[2],I=D[3],C=Math.floor(Math.max(0,(P-T)*H)),E=Math.ceil(Math.min(O,Math.max(0,(z-T)*H))),B=(L==="Dense"?0:(0+A))*R,U=this.prefs.block_color,F=this.prefs.label_color,N=0;if((L==="Pack"||this.mode==="Auto")&&H>Q.canvas.manager.char_width_px){var N=Math.round(H/2)}Q.fillStyle=U;if(D[5] instanceof Array){var M=Math.floor(Math.max(0,(D[4][0]-T)*H)),K=Math.ceil(Math.min(O,Math.max(0,(D[4][1]-T)*H))),J=Math.floor(Math.max(0,(D[5][0]-T)*H)),x=Math.ceil(Math.min(O,Math.max(0,(D[5][1]-T)*H)));if(D[4][1]>=T&&D[4][0]<=y&&D[4][2]){this.draw_read(Q,L,H,T,y,D[4][0],D[4][2],D[4][3],B)}if(D[5][1]>=T&&D[5][0]<=y&&D[5][2]){this.draw_read(Q,L,H,T,y,D[5][0],D[5][2],D[5][3],B)}if(J>K){Q.fillStyle=g;o(Q,K-N,B+5,J-N,B+5)}}else{Q.fillStyle=U;this.draw_read(Q,L,H,T,y,P,D[4],D[5],B)}if(L==="Pack"&&P>T){Q.fillStyle=this.prefs.label_color;var S=1;if(S===0&&C-Q.measureText(I).width<0){Q.textAlign="left";Q.fillText(I,E+k-N,B+8)}else{Q.textAlign="right";Q.fillText(I,C-k-N,B+8)}Q.fillStyle=U}}});w.SummaryTreePainter=u;w.LinePainter=c;w.LinkedFeaturePainter=q;w.ReadPainter=s;w.VariantPainter=b};(function(d){var c={};var b=function(e){return c[e]};var a=function(f,g){var e={};g(b,e);c[f]=e};a("class",class_module);a("slotting",slotting_module);a("painters",painters_module);a("trackster",trackster_module);for(key in c.trackster){d[key]=c.trackster[key]}})(window);
\ No newline at end of file
--- a/static/scripts/trackster.js Thu Apr 14 16:51:40 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 20:25:54 2011 -0400
@@ -155,6 +155,7 @@
}
});
};
+exports.sortable = sortable;
/**
* Calculates step for slider with a given min, max.
--- a/templates/library/common/browse_library.mako Thu Apr 14 16:51:40 2011 -0400
+++ b/templates/library/common/browse_library.mako Thu Apr 14 20:25:54 2011 -0400
@@ -48,14 +48,14 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js("json2", "jstorage")}
+ ${h.js("jstorage")}
${common_javascripts()}
${self.grid_javascripts()}
</%def><%def name="grid_javascripts()"><script type="text/javascript">
- $(function() {
+ var init_libraries = function() {
var storage_id = "library-expand-state-${trans.security.encode_id(library.id)}";
var restore_folder_state = function() {
@@ -151,6 +151,9 @@
});
restore_folder_state();
+ };
+ $(function() {
+ init_libraries();
});
// Looks for changes in dataset state using an async request. Keeps
--- a/templates/tracks/browser.mako Thu Apr 14 16:51:40 2011 -0400
+++ b/templates/tracks/browser.mako Thu Apr 14 20:25:54 2011 -0400
@@ -12,7 +12,7 @@
<%def name="stylesheets()">
${parent.stylesheets()}
- ${h.css( "history", "autocomplete_tagging", "trackster", "overcast/jquery-ui-1.8.5.custom" )}
+ ${h.css( "history", "autocomplete_tagging", "trackster", "overcast/jquery-ui-1.8.5.custom", "library" )}
<style type="text/css">
#browser-container {
@@ -55,7 +55,7 @@
<script type='text/javascript' src="${h.url_for('/static/scripts/excanvas.js')}"></script><![endif]-->
-${h.js( "galaxy.base", "galaxy.panels", "json2", "jquery", "jquery.event.drag", "jquery.mousewheel", "jquery.autocomplete", "trackster", "jquery.ui.sortable.slider", "jquery.scrollTo", "farbtastic" )}
+${h.js( "galaxy.base", "galaxy.panels", "json2", "jquery", "jstorage", "jquery.event.drag", "jquery.mousewheel", "jquery.autocomplete", "trackster", "jquery.ui.sortable.slider", "jquery.scrollTo", "farbtastic" )}
<script type="text/javascript">
@@ -148,7 +148,7 @@
track_data.name, view, track_data.hda_ldda, track_data.dataset_id,
track_data.prefs, track_data.filters, track_data.tool );
view.add_track(new_track);
- ## Should replace with live event but can't get working
+ // Should replace with live event but can't get working
sortable( new_track.container_div, ".draghandle" );
view.has_changes = true;
$("#no-tracks").hide();
@@ -172,9 +172,8 @@
error: function() { alert( "Grid failed" ); },
success: function(table_html) {
show_modal(
- "Add Track — Select history/library, then datasets",
- table_html,
- {
+ "Select datasets for new tracks",
+ table_html, {
"Cancel": function() {
hide_modal();
},
--- a/templates/tracks/history_datasets_select_grid.mako Thu Apr 14 16:51:40 2011 -0400
+++ b/templates/tracks/history_datasets_select_grid.mako Thu Apr 14 20:25:54 2011 -0400
@@ -1,15 +1,5 @@
<%inherit file="/tracks/history_select_grid.mako"/><%def name="title()">
- ##
- ## Provide link to go back to histories grid.
- ##
- <%
- url_dict = dict( action="list_histories" )
- for filter, value in grid.cur_filter_dict.iteritems():
- url_dict[ "f-" + filter ] = value
- %>
- ## Use class 'label' to piggyback on URL functionality in parent template.
- <a class="label" href="${h.url_for( **url_dict )}">Back to histories</a><h2>History '${grid.get_current_item( trans, **kwargs ).name}'</h2></%def>
\ No newline at end of file
--- a/templates/tracks/history_select_grid.mako Thu Apr 14 16:51:40 2011 -0400
+++ b/templates/tracks/history_select_grid.mako Thu Apr 14 20:25:54 2011 -0400
@@ -5,41 +5,78 @@
##
<%namespace file="../grid_base.mako" import="*" />
+${stylesheets()}
+${grid_javascripts()}
+
+<%def name="select_header()">
+ <script type="text/javascript">
+ // Handle all label clicks.
+ var f = function() {
+ $(".addtracktab, #grid-table-body a").click(function() {
+ var parent_body = $(".divider").parent();
+ if (parent_body.length !== 0) {
+ parent_body.load($(this).attr("href"));
+ f();
+ return false;
+ }
+ });
+ };
+ // Need to process label URLs when document loaded and when grid changes.
+ $(document).ready(function() {
+ f();
+ // $('#grid-table-body').bind('update', f);
+ });
+ </script>
+ <style>
+ .addtracktab {
+ margin: 0px 5px;
+ padding: 5px;
+ display: block;
+ width: 35%;
+ text-align: center;
+ float: left;
+ background-color: #ccc;
+ border-bottom: 0px;
+ -webkit-border-top-left-radius: 10px;
+ -webkit-border-top-right-radius: 10px;
+ -moz-border-radius-topleft: 10px;
+ -moz-border-radius-topright: 10px;
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+ }
+ .activetab {
+ border: 1px solid #aaa;
+ border-bottom: 0px;
+ background-color: white;
+ margin-bottom: -2px;
+ }
+ .divider {
+ clear: both;
+ border-top: 1px solid #aaa;
+ margin-bottom: 5px;
+ }
+
+ </style>
+
+ <% histories_active = data_libraries_active = "" %>
+ %if getattr(grid, "datasets_param", None):
+ %if grid.datasets_param == "f-history":
+ <% histories_active = " activetab" %>
+ %else:
+ <% data_libraries_active = " activetab" %>
+ %endif
+ %endif
+ <a class="addtracktab${histories_active}" href="${h.url_for( action='list_histories' )}">Histories</a>
+ <a class="addtracktab${data_libraries_active}" href="${h.url_for( action='list_libraries' )}">Data Libraries</a>
+ <div class="divider"></div>
+</%def>
+
+${select_header()}
## Need to define title so that it can be overridden by child templates.
<%def name="title()"></%def>
${self.title()}
-${stylesheets()}
-${grid_javascripts()}
-##
-## Load grid label and page links within a modal window.
-##
-<script type="text/javascript">
- // Handle all label clicks.
- var f = function() {
- $("a.label,.page-link>a").click(function() {
- var parent_body = $(this).parents("div.body");
- if (parent_body.length !== 0) {
- parent_body.load($(this).attr("href"));
- return false;
- }
- });
- };
- // Need to process label URLs when document loaded and when grid changes.
- $(document).ready(function() {
- f();
- $('#grid-table-body').bind('update', f);
- });
-</script>
-
-%if getattr(grid, "datasets_param", None):
- %if grid.datasets_param == "f-history":
- <a class="label" href="${h.url_for( action='list_libraries' )}">Show Data Libraries</a>
- %else:
- <a class="label" href="${h.url_for( action='list_histories' )}">Show Histories</a>
- %endif
- <br /><br />
-%endif
${render_grid_header( grid, False )}
-${render_grid_table( grid, show_item_checkboxes=show_item_checkboxes )}
\ No newline at end of file
+${render_grid_table( grid, show_item_checkboxes=show_item_checkboxes )}
+
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
7 new changesets in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/4730f4406ee7/
changeset: r5392:4730f4406ee7
user: james_taylor
date: 2011-04-12 02:55:39
summary: trackster: pull out a class module for the ubiquitous extend method, this should be augmented with a more complete inheritence framework
affected #: 1 file (338 bytes)
--- a/static/scripts/trackster.js Fri Apr 08 16:43:45 2011 -0400
+++ b/static/scripts/trackster.js Mon Apr 11 20:55:39 2011 -0400
@@ -2,6 +2,10 @@
2010-2011: James Taylor, Kanwei Li, Jeremy Goecks
*/
+var class_module = function(require, exports) {
+
+// Module is a placeholder for a more complete inheritence approach
+
/** Simple extend function for inheritence */
var extend = function() {
var target = arguments[0];
@@ -14,12 +18,20 @@
return target;
};
+exports.extend = extend;
+
+// end class_module encapsulation
+};
+
+
// Encapsulate -- anything to be availabe outside this block is added to exports
-var trackster_module = function(require, exports){
+var trackster_module = function(require, exports) {
-var slotting = require('slotting'),
+var extend = require('class').extend,
+ slotting = require('slotting'),
painters = require('painters');
+
// ---- Canvas management and extensions ----
/**
@@ -2076,7 +2088,6 @@
this.hda_ldda = hda_ldda;
this.dataset_id = dataset_id;
this.original_dataset_id = dataset_id;
- this.zo_slots = {};
this.show_labels_scale = 0.001;
this.showing_details = false;
this.summary_draw_height = 30;
@@ -2361,6 +2372,8 @@
// Encapsulation
var slotting_module = function(require, exports) {
+
+var extend = require('class').extend;
// HACK: LABEL_SPACING is currently duplicated between here and painters
var LABEL_SPACING = 2,
@@ -2526,6 +2539,8 @@
// ---- Painters ----
var painters_module = function(require, exports){
+
+var extend = require('class').extend;
/**
* Draw a dashed line on a canvas using filled rectangles. This function is based on:
@@ -3420,6 +3435,7 @@
modules[key] = exports;
};
// Run all modules
+ run_module( 'class', class_module );
run_module( 'slotting', slotting_module );
run_module( 'painters', painters_module );
run_module( 'trackster', trackster_module );
http://bitbucket.org/galaxy/galaxy-central/changeset/f6050dc1bb64/
changeset: r5393:f6050dc1bb64
user: james_taylor
date: 2011-04-12 02:55:51
summary: Automated merge with https://bitbucket.org/galaxy/galaxy-central
affected #: 1 file (338 bytes)
--- a/static/scripts/trackster.js Mon Apr 11 14:17:35 2011 -0400
+++ b/static/scripts/trackster.js Mon Apr 11 20:55:51 2011 -0400
@@ -2,6 +2,10 @@
2010-2011: James Taylor, Kanwei Li, Jeremy Goecks
*/
+var class_module = function(require, exports) {
+
+// Module is a placeholder for a more complete inheritence approach
+
/** Simple extend function for inheritence */
var extend = function() {
var target = arguments[0];
@@ -14,12 +18,20 @@
return target;
};
+exports.extend = extend;
+
+// end class_module encapsulation
+};
+
+
// Encapsulate -- anything to be availabe outside this block is added to exports
-var trackster_module = function(require, exports){
+var trackster_module = function(require, exports) {
-var slotting = require('slotting'),
+var extend = require('class').extend,
+ slotting = require('slotting'),
painters = require('painters');
+
// ---- Canvas management and extensions ----
/**
@@ -2093,7 +2105,6 @@
this.hda_ldda = hda_ldda;
this.dataset_id = dataset_id;
this.original_dataset_id = dataset_id;
- this.zo_slots = {};
this.show_labels_scale = 0.001;
this.showing_details = false;
this.summary_draw_height = 30;
@@ -2379,6 +2390,8 @@
// Encapsulation
var slotting_module = function(require, exports) {
+
+var extend = require('class').extend;
// HACK: LABEL_SPACING is currently duplicated between here and painters
var LABEL_SPACING = 2,
@@ -2544,6 +2557,8 @@
// ---- Painters ----
var painters_module = function(require, exports){
+
+var extend = require('class').extend;
/**
* Draw a dashed line on a canvas using filled rectangles. This function is based on:
@@ -3438,6 +3453,7 @@
modules[key] = exports;
};
// Run all modules
+ run_module( 'class', class_module );
run_module( 'slotting', slotting_module );
run_module( 'painters', painters_module );
run_module( 'trackster', trackster_module );
http://bitbucket.org/galaxy/galaxy-central/changeset/ffbec3713bc0/
changeset: r5394:ffbec3713bc0
user: james_taylor
date: 2011-04-14 20:07:22
summary: Automated merge with https://bitbucket.org/galaxy/galaxy-central
affected #: 1 file (0 bytes)
http://bitbucket.org/galaxy/galaxy-central/changeset/e8f720f2e0f8/
changeset: r5395:e8f720f2e0f8
user: james_taylor
date: 2011-04-14 20:32:37
summary: merging
affected #: 1 file (334 bytes)
--- a/static/scripts/trackster.js Thu Apr 14 14:07:22 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 14:32:37 2011 -0400
@@ -2,6 +2,10 @@
2010-2011: James Taylor, Kanwei Li, Jeremy Goecks
*/
+var class_module = function(require, exports) {
+
+// Module is a placeholder for a more complete inheritence approach
+
/** Simple extend function for inheritence */
var extend = function() {
var target = arguments[0];
@@ -14,6 +18,12 @@
return target;
};
+exports.extend = extend;
+
+// end class_module encapsulation
+};
+
+
/**
* 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
@@ -59,11 +69,13 @@
};
// Encapsulate -- anything to be availabe outside this block is added to exports
-var trackster_module = function(require, exports){
+var trackster_module = function(require, exports) {
-var slotting = require('slotting'),
+var extend = require('class').extend,
+ slotting = require('slotting'),
painters = require('painters');
+
// ---- Canvas management and extensions ----
/**
@@ -2183,7 +2195,6 @@
this.hda_ldda = hda_ldda;
this.dataset_id = dataset_id;
this.original_dataset_id = dataset_id;
- this.zo_slots = {};
this.show_labels_scale = 0.001;
this.showing_details = false;
this.summary_draw_height = 30;
@@ -2558,6 +2569,8 @@
// Encapsulation
var slotting_module = function(require, exports) {
+
+var extend = require('class').extend;
// HACK: LABEL_SPACING is currently duplicated between here and painters
var LABEL_SPACING = 2,
@@ -2724,6 +2737,8 @@
var painters_module = function(require, exports){
+var extend = require('class').extend;
+
/**
* Draw a dashed line on a canvas using filled rectangles. This function is based on:
* http://vetruvet.blogspot.com/2010/10/drawing-dashed-lines-on-html5-canvas.h…
@@ -3573,6 +3588,7 @@
modules[key] = exports;
};
// Run all modules
+ run_module( 'class', class_module );
run_module( 'slotting', slotting_module );
run_module( 'painters', painters_module );
run_module( 'trackster', trackster_module );
http://bitbucket.org/galaxy/galaxy-central/changeset/45298d68ad5b/
changeset: r5396:45298d68ad5b
user: james_taylor
date: 2011-04-14 20:32:44
summary: Automated merge with https://bitbucket.org/galaxy/galaxy-central
affected #: 1 file (334 bytes)
--- a/static/scripts/trackster.js Thu Apr 14 14:29:32 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 14:32:44 2011 -0400
@@ -2,6 +2,10 @@
2010-2011: James Taylor, Kanwei Li, Jeremy Goecks
*/
+var class_module = function(require, exports) {
+
+// Module is a placeholder for a more complete inheritence approach
+
/** Simple extend function for inheritence */
var extend = function() {
var target = arguments[0];
@@ -14,6 +18,12 @@
return target;
};
+exports.extend = extend;
+
+// end class_module encapsulation
+};
+
+
/**
* 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
@@ -59,11 +69,13 @@
};
// Encapsulate -- anything to be availabe outside this block is added to exports
-var trackster_module = function(require, exports){
+var trackster_module = function(require, exports) {
-var slotting = require('slotting'),
+var extend = require('class').extend,
+ slotting = require('slotting'),
painters = require('painters');
+
// ---- Canvas management and extensions ----
/**
@@ -2185,7 +2197,6 @@
this.hda_ldda = hda_ldda;
this.dataset_id = dataset_id;
this.original_dataset_id = dataset_id;
- this.zo_slots = {};
this.show_labels_scale = 0.001;
this.showing_details = false;
this.summary_draw_height = 30;
@@ -2557,6 +2568,8 @@
// Encapsulation
var slotting_module = function(require, exports) {
+
+var extend = require('class').extend;
// HACK: LABEL_SPACING is currently duplicated between here and painters
var LABEL_SPACING = 2,
@@ -2723,6 +2736,8 @@
var painters_module = function(require, exports){
+var extend = require('class').extend;
+
/**
* Draw a dashed line on a canvas using filled rectangles. This function is based on:
* http://vetruvet.blogspot.com/2010/10/drawing-dashed-lines-on-html5-canvas.h…
@@ -3572,6 +3587,7 @@
modules[key] = exports;
};
// Run all modules
+ run_module( 'class', class_module );
run_module( 'slotting', slotting_module );
run_module( 'painters', painters_module );
run_module( 'trackster', trackster_module );
http://bitbucket.org/galaxy/galaxy-central/changeset/d4ede96517d0/
changeset: r5397:d4ede96517d0
user: james_taylor
date: 2011-04-14 22:51:26
summary: trackster: fix problem with drawing bounderies of overflow bars for line tracks
affected #: 1 file (5 bytes)
--- a/static/scripts/trackster.js Thu Apr 14 14:32:44 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 16:51:26 2011 -0400
@@ -2941,19 +2941,19 @@
var overflow_min_start = -1,
overflow_max_start = -1;
ctx.fillStyle = this.prefs.overflow_color;
+ var last_x_scaled;
for (var i = 0, len = data.length; i < len; i++) {
y = data[i][1];
x_scaled = Math.round((data[i][0] - view_start) * w_scale);
- x_minus_scaled = Math.round((data[i][0] - 1 - view_start) * w_scale);
// If we are in a min/max run, check if it should be ended
if ( overflow_max_start >= 0 && ( y === null || y < max_value ) ) {
// Value does not exist or is in valid range, any overflow ends
- ctx.fillRect( overflow_max_start, 0, x_minus_scaled - overflow_max_start + 1, 2 );
+ ctx.fillRect( overflow_max_start, 0, last_x_scaled + delta_x_px - overflow_max_start, 2 );
overflow_max_start = -1;
} else if ( overflow_min_start >= 0 && ( y === null || y > min_value ) ) {
// Draw bottom overflow bar
- ctx.fillRect( overflow_min_start, height - 2, x_minus_scaled - overflow_min_start + 1, 2 );
+ ctx.fillRect( overflow_min_start, height - 2, last_x_scaled + delta_x_px - overflow_min_start, 2 );
overflow_min_start = -1;
}
@@ -2966,6 +2966,7 @@
// Bottom overflows and we are not already in a run
overflow_min_start = x_scaled;
}
+ last_x_scaled = x_scaled;
}
ctx.restore();
http://bitbucket.org/galaxy/galaxy-central/changeset/c792f5cc9efd/
changeset: r5398:c792f5cc9efd
user: james_taylor
date: 2011-04-14 22:51:40
summary: Automated merge with https://bitbucket.org/galaxy/galaxy-central
affected #: 1 file (329 bytes)
--- a/static/scripts/trackster.js Thu Apr 14 16:42:12 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 16:51:40 2011 -0400
@@ -2,6 +2,10 @@
2010-2011: James Taylor, Kanwei Li, Jeremy Goecks
*/
+var class_module = function(require, exports) {
+
+// Module is a placeholder for a more complete inheritence approach
+
/** Simple extend function for inheritence */
var extend = function() {
var target = arguments[0];
@@ -14,6 +18,12 @@
return target;
};
+exports.extend = extend;
+
+// end class_module encapsulation
+};
+
+
/**
* 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
@@ -59,11 +69,13 @@
};
// Encapsulate -- anything to be availabe outside this block is added to exports
-var trackster_module = function(require, exports){
+var trackster_module = function(require, exports) {
-var slotting = require('slotting'),
+var extend = require('class').extend,
+ slotting = require('slotting'),
painters = require('painters');
+
// ---- Canvas management and extensions ----
/**
@@ -2194,7 +2206,6 @@
this.hda_ldda = hda_ldda;
this.dataset_id = dataset_id;
this.original_dataset_id = dataset_id;
- this.zo_slots = {};
this.show_labels_scale = 0.001;
this.showing_details = false;
this.summary_draw_height = 30;
@@ -2566,6 +2577,8 @@
// Encapsulation
var slotting_module = function(require, exports) {
+
+var extend = require('class').extend;
// HACK: LABEL_SPACING is currently duplicated between here and painters
var LABEL_SPACING = 2,
@@ -2732,6 +2745,8 @@
var painters_module = function(require, exports){
+var extend = require('class').extend;
+
/**
* Draw a dashed line on a canvas using filled rectangles. This function is based on:
* http://vetruvet.blogspot.com/2010/10/drawing-dashed-lines-on-html5-canvas.h…
@@ -2935,19 +2950,19 @@
var overflow_min_start = -1,
overflow_max_start = -1;
ctx.fillStyle = this.prefs.overflow_color;
+ var last_x_scaled;
for (var i = 0, len = data.length; i < len; i++) {
y = data[i][1];
x_scaled = Math.round((data[i][0] - view_start) * w_scale);
- x_minus_scaled = Math.round((data[i][0] - 1 - view_start) * w_scale);
// If we are in a min/max run, check if it should be ended
if ( overflow_max_start >= 0 && ( y === null || y < max_value ) ) {
// Value does not exist or is in valid range, any overflow ends
- ctx.fillRect( overflow_max_start, 0, x_minus_scaled - overflow_max_start + 1, 2 );
+ ctx.fillRect( overflow_max_start, 0, last_x_scaled + delta_x_px - overflow_max_start, 2 );
overflow_max_start = -1;
} else if ( overflow_min_start >= 0 && ( y === null || y > min_value ) ) {
// Draw bottom overflow bar
- ctx.fillRect( overflow_min_start, height - 2, x_minus_scaled - overflow_min_start + 1, 2 );
+ ctx.fillRect( overflow_min_start, height - 2, last_x_scaled + delta_x_px - overflow_min_start, 2 );
overflow_min_start = -1;
}
@@ -2960,6 +2975,7 @@
// Bottom overflows and we are not already in a run
overflow_min_start = x_scaled;
}
+ last_x_scaled = x_scaled;
}
ctx.restore();
@@ -3581,6 +3597,7 @@
modules[key] = exports;
};
// Run all modules
+ run_module( 'class', class_module );
run_module( 'slotting', slotting_module );
run_module( 'painters', painters_module );
run_module( 'trackster', trackster_module );
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: Fixes for transferring files from external services using the http protocol. Automatic file transfers from Pac Bio SMRT Portal are functional for version 1.1.0.
by Bitbucket 14 Apr '11
by Bitbucket 14 Apr '11
14 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/5affe61170f7/
changeset: r5391:5affe61170f7
user: greg
date: 2011-04-14 22:42:12
summary: Fixes for transferring files from external services using the http protocol. Automatic file transfers from Pac Bio SMRT Portal are functional for version 1.1.0.
affected #: 8 files (2.5 KB)
--- a/external_service_types/pacific_biosciences_smrt_portal.xml Thu Apr 14 14:34:39 2011 -0400
+++ b/external_service_types/pacific_biosciences_smrt_portal.xml Thu Apr 14 16:42:12 2011 -0400
@@ -2,9 +2,6 @@
<description></description><version>1</version><data_transfer_settings>
- <!--
- <data_transfer protocol='scp' automatic_transfer='True' host='host' user_name='user_name' password='password' data_location='data_location' />
- --><data_transfer protocol='http' automatic_transfer='True' /></data_transfer_settings><run_details>
--- a/lib/galaxy/jobs/deferred/data_transfer.py Thu Apr 14 14:34:39 2011 -0400
+++ b/lib/galaxy/jobs/deferred/data_transfer.py Thu Apr 14 16:42:12 2011 -0400
@@ -4,8 +4,6 @@
import logging, urllib2, re, shutil
from galaxy import eggs
-from galaxy.util import json
-from string import Template
from sqlalchemy import and_
from galaxy.util.odict import odict
@@ -19,6 +17,8 @@
log = logging.getLogger( __name__ )
+__all__ = [ 'DataTransfer' ]
+
class DataTransfer( object ):
check_interval = 15
dataset_name_re = re.compile( '(dataset\d+)_(name)' )
@@ -36,7 +36,10 @@
if job.params[ 'protocol' ] in [ 'http', 'https' ]:
results = []
for result in job.params[ 'results' ].values():
- result[ 'transfer_job' ] = self.app.transfer_manager.new( protocol=job.params[ 'protocol' ], url=result[ 'url' ] )
+ result[ 'transfer_job' ] = self.app.transfer_manager.new( protocol=job.params[ 'protocol' ],
+ name=result[ 'name' ],
+ datatype=result[ 'datatype' ],
+ url=result[ 'url' ] )
results.append( result )
elif job.params[ 'protocol' ] == 'scp':
results = []
@@ -83,9 +86,9 @@
# Update the state of the relevant SampleDataset
new_status = self.app.model.SampleDataset.transfer_status.ADD_TO_LIBRARY
if protocol in [ 'http', 'https' ]:
- result_dict = job.params[ 'results' ]
- library_dataset_name = job.params[ 'result' ][ 'name' ]
- extension = job.params[ 'result' ][ 'datatype' ]
+ result_dict = job.params[ 'result' ]
+ library_dataset_name = result_dict[ 'name' ]
+ extension = result_dict[ 'datatype' ]
elif protocol in [ 'scp' ]:
# In this case, job.params will be a dictionary that contains a key named 'result'. The value
# of the result key is a dictionary that looks something like:
--- a/lib/galaxy/jobs/deferred/pacific_biosciences_smrt_portal.py Thu Apr 14 14:34:39 2011 -0400
+++ b/lib/galaxy/jobs/deferred/pacific_biosciences_smrt_portal.py Thu Apr 14 16:42:12 2011 -0400
@@ -3,6 +3,9 @@
produced by SMRT Portal.
"""
import logging, urllib2, re, shutil
+from string import Template
+from galaxy.util import json
+
from data_transfer import *
log = logging.getLogger( __name__ )
@@ -18,9 +21,16 @@
sample = kwd[ 'sample' ]
smrt_job_id = kwd[ 'secondary_analysis_job_id' ]
external_service = sample.request.type.get_external_service( 'pacific_biosciences_smrt_portal' )
+ external_service.load_data_transfer_settings( trans )
+ http_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.HTTP ]
+ if not http_configs[ 'automatic_transfer' ]:
+ raise Exception( "Manual data transfer using http is not yet supported." )
smrt_host = external_service.form_values.content[ 'host' ]
- external_service_type_id = external_service.external_service_type_id
- external_service_type = self.app.external_service_types.all_external_service_types[ external_service_type_id ]
+ external_service_type = external_service.get_external_service_type( trans )
+ # TODO: is there a better way to store the protocol?
+ # external_service_type.data_transfer looks somethng like
+ # {'http': <galaxy.sample_tracking.data_transfer.HttpDataTransferFactory object at 0x1064239d0>}
+ protocol = external_service_type.data_transfer.keys()[0]
results = {}
for k, v in external_service.form_values.content.items():
match = self.dataset_name_re.match( k ) or self.dataset_datatype_re.match( k )
@@ -42,6 +52,7 @@
self.sa_session.add(sample)
self.sa_session.flush()
params = { 'type' : 'init_transfer',
+ 'protocol' : protocol,
'sample_id' : sample.id,
'results' : results,
'smrt_host' : smrt_host,
@@ -50,6 +61,7 @@
self._associate_untransferred_datasets_with_sample( sample, external_service, results )
elif 'transfer_job_id' in kwd:
params = { 'type' : 'finish_transfer',
+ 'protocol' : kwd[ 'result' ][ 'protocol' ],
'sample_id' : kwd[ 'sample_id' ],
'result' : kwd[ 'result' ],
'transfer_job_id' : kwd[ 'transfer_job_id' ] }
--- a/lib/galaxy/jobs/transfer_manager.py Thu Apr 14 14:34:39 2011 -0400
+++ b/lib/galaxy/jobs/transfer_manager.py Thu Apr 14 16:42:12 2011 -0400
@@ -30,14 +30,13 @@
if protocol in [ 'http', 'https' ]:
if 'url' not in kwd:
raise Exception( 'Missing required parameter "url".' )
- transfer_job = self.app.model.TransferJob( state=self.app.model.TransferJob.states.NEW, params=kwd )
elif protocol == 'scp':
# TODO: add more checks here?
if 'sample_dataset_id' not in kwd:
raise Exception( 'Missing required parameter "sample_dataset_id".' )
if 'file_path' not in kwd:
raise Exception( 'Missing required parameter "file_path".' )
- transfer_job = self.app.model.TransferJob( state=self.app.model.TransferJob.states.NEW, params=kwd )
+ transfer_job = self.app.model.TransferJob( state=self.app.model.TransferJob.states.NEW, params=kwd )
self.sa_session.add( transfer_job )
self.sa_session.flush()
return transfer_job
--- a/lib/galaxy/model/__init__.py Thu Apr 14 14:34:39 2011 -0400
+++ b/lib/galaxy/model/__init__.py Thu Apr 14 16:42:12 2011 -0400
@@ -1825,6 +1825,11 @@
scp_configs[ 'data_location' ] = self.form_values.content.get( data_transfer_obj.config.get( 'data_location', '' ), '' )
scp_configs[ 'rename_dataset' ] = self.form_values.content.get( data_transfer_obj.config.get( 'rename_dataset', '' ), '' )
self.data_transfer[ self.data_transfer_protocol.SCP ] = scp_configs
+ if data_transfer_protocol == self.data_transfer_protocol.HTTP:
+ http_configs = {}
+ automatic_transfer = data_transfer_obj.config.get( 'automatic_transfer', 'false' )
+ http_configs[ 'automatic_transfer' ] = util.string_as_bool( automatic_transfer )
+ self.data_transfer[ self.data_transfer_protocol.HTTP ] = http_configs
def populate_actions( self, trans, item, param_dict=None ):
return self.get_external_service_type( trans ).actions.populate( self, item, param_dict=param_dict )
--- a/lib/galaxy/sample_tracking/data_transfer.py Thu Apr 14 14:34:39 2011 -0400
+++ b/lib/galaxy/sample_tracking/data_transfer.py Thu Apr 14 16:42:12 2011 -0400
@@ -27,12 +27,23 @@
# Validate
for name, value in self.config.items():
assert value, "'%s' attribute missing in 'data_transfer' element of type 'scp' in external_service_type xml config file: '%s'." % ( name, config_file )
-
+
+class HttpDataTransferFactory( DataTransferFactory ):
+ type = 'http'
+ def __init__( self ):
+ pass
+ def parse( self, config_file, elem ):
+ self.config = {}
+ self.config[ 'automatic_transfer' ] = elem.get( 'automatic_transfer' )
+ # Validate
+ for name, value in self.config.items():
+ assert value, "'%s' attribute missing in 'data_transfer' element of type 'http' in external_service_type xml config file: '%s'." % ( name, config_file )
+
class FtpDataTransferFactory( DataTransferFactory ):
type = 'ftp'
def __init__( self ):
pass
def parse( self, elem ):
pass
-
-data_transfer_factories = dict( [ ( data_transfer.type, data_transfer() ) for data_transfer in [ ScpDataTransferFactory, FtpDataTransferFactory ] ] )
+
+data_transfer_factories = dict( [ ( data_transfer.type, data_transfer() ) for data_transfer in [ ScpDataTransferFactory, HttpDataTransferFactory, FtpDataTransferFactory ] ] )
--- a/lib/galaxy/sample_tracking/external_service_types.py Thu Apr 14 14:34:39 2011 -0400
+++ b/lib/galaxy/sample_tracking/external_service_types.py Thu Apr 14 16:42:12 2011 -0400
@@ -84,12 +84,16 @@
def parse_data_transfer_settings( self, root ):
self.data_transfer = {}
data_transfer_settings_elem = root.find( 'data_transfer_settings' )
- # Currently only data transfer using scp is supported.
+ # Currently only data transfer using scp or http is supported.
for data_transfer_elem in data_transfer_settings_elem.findall( "data_transfer" ):
if data_transfer_elem.get( 'protocol' ) == model.ExternalService.data_transfer_protocol.SCP:
scp_data_transfer = data_transfer_factories[ model.ExternalService.data_transfer_protocol.SCP ]
scp_data_transfer.parse( self.config_file, data_transfer_elem )
self.data_transfer[ model.ExternalService.data_transfer_protocol.SCP ] = scp_data_transfer
+ if data_transfer_elem.get( 'protocol' ) == model.ExternalService.data_transfer_protocol.HTTP:
+ http_data_transfer = data_transfer_factories[ model.ExternalService.data_transfer_protocol.HTTP ]
+ http_data_transfer.parse( self.config_file, data_transfer_elem )
+ self.data_transfer[ model.ExternalService.data_transfer_protocol.HTTP ] = http_data_transfer
def parse_run_details( self, root ):
self.run_details = {}
run_details_elem = root.find( 'run_details' )
--- a/lib/galaxy/web/controllers/requests_admin.py Thu Apr 14 14:34:39 2011 -0400
+++ b/lib/galaxy/web/controllers/requests_admin.py Thu Apr 14 16:42:12 2011 -0400
@@ -671,7 +671,7 @@
if not scp_configs[ 'automatic_transfer' ]:
deferred_plugin = 'ManualDataTransferPlugin'
else:
- raise Exception( "Automatic data transfer using scp is not yet suppored." )
+ raise Exception( "Automatic data transfer using scp is not yet supported." )
trans.app.job_manager.deferred_job_queue.plugins[ deferred_plugin ].create_job( trans,
sample=sample,
sample_datasets=sample_datasets,
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: Create and use ReferenceTrackDataManager to fetch ReferenceTrack data.
by Bitbucket 14 Apr '11
by Bitbucket 14 Apr '11
14 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/b20ed3ccbba2/
changeset: r5390:b20ed3ccbba2
user: jgoecks
date: 2011-04-14 20:34:39
summary: Create and use ReferenceTrackDataManager to fetch ReferenceTrack data.
affected #: 1 file (383 bytes)
--- a/static/scripts/trackster.js Thu Apr 14 14:29:32 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 14:34:39 2011 -0400
@@ -244,11 +244,6 @@
* Load data from server; returns AJAX object so that use of Deferred is possible.
*/
load_data: function(chrom, low, high, mode, resolution, extra_params) {
- if (this.track.track_type == "ReferenceTrack" && resolution > 1) {
- // Now that data is pre-fetched before draw, we don't load reference tracks
- // unless it's at the bottom level
- return;
- }
// Setup data request params.
var params = {"chrom": chrom, "low": low, "high": high, "mode": mode,
"resolution": resolution, "dataset_id" : this.track.dataset_id,
@@ -346,6 +341,20 @@
}
});
+var ReferenceTrackDataManager = function(num_elements, track, subset) {
+ DataManager.call(this, num_elements, track, subset);
+};
+extend(ReferenceTrackDataManager.prototype, DataManager.prototype, Cache.prototype, {
+ load_data: function(chrom, low, high, mode, resolution, extra_params) {
+ if (resolution > 1) {
+ // Now that data is pre-fetched before draw, we don't load reference tracks
+ // unless it's at the bottom level
+ return;
+ }
+ return DataManager.prototype.load_data.call(this, chrom, low, high, mode, resolution, extra_params);
+ }
+});
+
/**
* View object manages complete viz view, including tracks and user interactions.
*/
@@ -1979,7 +1988,7 @@
this.content_div.css("border", "none");
this.data_url = reference_url;
this.data_url_extra_params = {dbkey: view.dbkey};
- this.data_cache = new DataManager(CACHED_DATA, this, false);
+ this.data_cache = new ReferenceTrackDataManager(CACHED_DATA, this, false);
this.tile_cache = new Cache(CACHED_TILES_LINE);
};
extend(ReferenceTrack.prototype, TiledTrack.prototype, {
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
14 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/49e97cc2ac1f/
changeset: r5389:49e97cc2ac1f
user: jgoecks
date: 2011-04-14 20:29:32
summary: Trackster: (a) fix bug in acee660871cd that prevented line tracks from displaying properly and (b) set track height in show_tile rather than draw_tile, which obviates the need for parent_element to be passed to draw_tile.
affected #: 2 files (1.8 KB)
--- a/static/scripts/packed/trackster.js Thu Apr 14 10:37:42 2011 -0400
+++ b/static/scripts/packed/trackster.js Thu Apr 14 14:29:32 2011 -0400
@@ -1,1 +1,1 @@
-var extend=function(){var c=arguments[0];for(var b=1;b<arguments.length;b++){var a=arguments[b];for(key in a){c[key]=a[key]}}return c};var trackster_module=function(f,P){var o=f("slotting"),F=f("painters");var V=function(W,X){this.document=W;this.default_font=X!==undefined?X:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};extend(V.prototype,{load_pattern:function(W,aa){var X=this.patterns,Y=this.dummy_context,Z=new Image();Z.src=image_path+aa;Z.onload=function(){X[W]=Y.createPattern(Z,"repeat")}},get_pattern:function(W){return this.patterns[W]},new_canvas:function(){var W=this.document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(W)}W.manager=this;return W}});var A=function(W,X){W.bind("drag",{handle:X,relative:true},function(ab,ac){var aa=$(this).parent();var Z=aa.children();var Y;for(Y=0;Y<Z.length;Y++){if(ac.offsetY<$(Z.get(Y)).position().top){break}}if(Y===Z.length){if(this!==Z.get(Y-1)){aa.append(this)}}else{if(this!==Z.get(Y)){$(this).insertBefore(Z.get(Y))}}})};var h=function(Y,W){var X=W-Y;return(X<=2?0.01:(X<=100?1:(X<=1000?5:10)))};var B=9,y=10,K=B+2,v=100,C=12000,I=200,r=10,E=5000,s=100,m="There was an error in indexing this dataset. ",D="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",z="No data for this chrom/contig.",p="Currently indexing... please wait",u="Tool cannot be rerun: ",a="Loading data...",Q="Ready for display",d=10,q=5,x=5;function t(W){return Math.round(W*1000)/1000}var c=function(W){this.num_elements=W;this.clear()};extend(c.prototype,{get:function(X){var W=this.key_ary.indexOf(X);if(W!==-1){this.move_key_to_end(X,W)}return this.obj_cache[X]},set:function(X,Y){if(!this.obj_cache[X]){if(this.key_ary.length>=this.num_elements){var W=this.key_ary.shift();delete this.obj_cache[W]}this.key_ary.push(X)}this.obj_cache[X]=Y;return Y},move_key_to_end:function(X,W){this.key_ary.splice(W,1);this.key_ary.push(X)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var J=function(X,W,Y){c.call(this,X);this.track=W;this.subset=(Y!==undefined?Y:true)};extend(J.prototype,c.prototype,{load_data:function(ae,af,aa,ad,X,ac){var Z={chrom:ae,low:af,high:aa,mode:ad,resolution:X,dataset_id:this.track.dataset_id,hda_ldda:this.track.hda_ldda};$.extend(Z,ac);if(this.track.filters_manager){var ag=[];var W=this.track.filters_manager.filters;for(var ab=0;ab<W.length;ab++){ag[ag.length]=W[ab].name}Z.filter_cols=JSON.stringify(ag)}var Y=this;return $.getJSON(this.track.data_url,Z,function(ah){Y.set_data(af,aa,ad,ah)})},get_data:function(Y,W,ab,ac,X,aa){var Z=this.get(this.gen_key(W,ab,ac));if(Z){return Z}Z=this.load_data(Y,W,ab,ac,X,aa);this.set_data(W,ab,ac,Z);return Z},set_data:function(X,Y,Z,W){return this.set(this.gen_key(X,Y,Z),W)},gen_key:function(W,Y,Z){var X=W+"_"+Y+"_"+Z;return X},split_key:function(W){return W.split("_")}});var U=function(W,Z,Y,X,aa){this.container=W;this.chrom=null;this.vis_id=Y;this.dbkey=X;this.title=Z;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(aa);this.canvas_manager=new V(W.get(0).ownerDocument);this.reset()};extend(U.prototype,{init:function(Z){var Y=this.container,W=this;this.top_container=$("<div/>").addClass("top-container").appendTo(Y);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(Y);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(Y);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_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var X=function(aa){if(aa.type==="focusout"||(aa.keyCode||aa.which)===13||(aa.keyCode||aa.which)===27){if((aa.keyCode||aa.which)!==27){W.go_to($(this).val())}$(this).hide();$(this).val("");W.location_span.show();W.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",X).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){W.location_span.hide();W.chrom_select.hide();W.nav_input.val(W.chrom+":"+W.low+"-"+W.high);W.nav_input.css("display","inline-block");W.nav_input.select();W.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){W.zoom_out();W.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){W.zoom_in();W.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},Z);this.chrom_select.bind("change",function(){W.change_chrom(W.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(aa){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(aa){W.zoom_in(aa.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(aa,ab){this.current_x=ab.offsetX}).bind("drag",function(aa,ac){var ad=ac.offsetX-this.current_x;this.current_x=ac.offsetX;var ab=Math.round(ad/W.viewport_container.width()*(W.max_high-W.max_low));W.move_delta(-ab)});this.overview_close.bind("click",function(){for(var ab=0,aa=W.tracks.length;ab<aa;ab++){W.tracks[ab].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",W.overview_box.height());W.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(aa,ab){if(aa.clientX>W.viewport_container.width()-16){return false}}).bind("dragstart",function(aa,ab){ab.original_low=W.low;ab.current_height=aa.clientY;ab.current_x=ab.offsetX}).bind("drag",function(ac,ae){var aa=$(this);var af=ae.offsetX-ae.current_x;var ab=aa.scrollTop()-(ac.clientY-ae.current_height);aa.scrollTop(ab);ae.current_height=ac.clientY;ae.current_x=ae.offsetX;var ad=Math.round(af/W.viewport_container.width()*(W.high-W.low));W.move_delta(ad)}).bind("mousewheel",function(ac,ae,ab,aa){if(ab){var ad=Math.round(-ab/W.viewport_container.width()*(W.high-W.low));W.move_delta(ad)}});this.top_labeltrack.bind("dragstart",function(aa,ab){return $("<div />").css({height:W.content_div.height()+W.top_labeltrack.height()+W.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ae,af){$(af.proxy).css({left:Math.min(ae.pageX,af.startX),width:Math.abs(ae.pageX-af.startX)});var ab=Math.min(ae.pageX,af.startX)-W.container.offset().left,aa=Math.max(ae.pageX,af.startX)-W.container.offset().left,ad=(W.high-W.low),ac=W.viewport_container.width();W.update_location(Math.round(ab/ac*ad)+W.low,Math.round(aa/ac*ad)+W.low)}).bind("dragend",function(af,ag){var ab=Math.min(af.pageX,ag.startX),aa=Math.max(af.pageX,ag.startX),ad=(W.high-W.low),ac=W.viewport_container.width(),ae=W.low;W.low=Math.round(ab/ac*ad)+ae;W.high=Math.round(aa/ac*ad)+ae;$(ag.proxy).remove();W.redraw()});this.add_label_track(new T(this,this.top_labeltrack));this.add_label_track(new T(this,this.nav_labeltrack));$(window).bind("resize",function(){W.resize_window()});$(document).bind("redraw",function(){W.redraw()});this.reset();$(window).trigger("resize")},update_location:function(W,X){this.location_span.text(commatize(W)+" - "+commatize(X));this.nav_input.val(this.chrom+":"+commatize(W)+"-"+commatize(X))},load_chroms:function(X,Y){X.num=s;$.extend(X,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var W=this;$.ajax({url:chrom_url,data:X,dataType:"json",success:function(aa){if(aa.chrom_info.length===0){alert("Invalid chromosome: "+X.chrom);return}if(aa.reference){W.add_label_track(new w(W))}W.chrom_data=aa.chrom_info;var ad='<option value="">Select Chrom/Contig</option>';for(var ac=0,Z=W.chrom_data.length;ac<Z;ac++){var ab=W.chrom_data[ac].chrom;ad+='<option value="'+ab+'">'+ab+"</option>"}if(aa.prev_chroms){ad+='<option value="previous">Previous '+s+"</option>"}if(aa.next_chroms){ad+='<option value="next">Next '+s+"</option>"}W.chrom_select.html(ad);if(Y){Y()}W.chrom_start_index=aa.start_index},error:function(){alert("Could not load chroms for this dbkey:",W.dbkey)}})},change_chrom:function(aa,X,ac){if(!aa||aa==="None"){return}var Z=this;if(aa==="previous"){Z.load_chroms({low:this.chrom_start_index-s});return}if(aa==="next"){Z.load_chroms({low:this.chrom_start_index+s});return}var ab=$.grep(Z.chrom_data,function(ae,af){return ae.chrom===aa})[0];if(ab===undefined){Z.load_chroms({chrom:aa},function(){Z.change_chrom(aa,X,ac)});return}else{if(aa!==Z.chrom){Z.chrom=aa;if(!Z.chrom){Z.intro_div.show()}else{Z.intro_div.hide()}Z.chrom_select.val(Z.chrom);Z.max_high=ab.len-1;Z.reset();Z.redraw(true);for(var ad=0,W=Z.tracks.length;ad<W;ad++){var Y=Z.tracks[ad];if(Y.init){Y.init()}}}if(X!==undefined&&ac!==undefined){Z.low=Math.max(X,0);Z.high=Math.min(ac,Z.max_high)}Z.reset_overview();Z.redraw()}},go_to:function(aa){var ae=this,W,Z,X=aa.split(":"),ac=X[0],ad=X[1];if(ad!==undefined){try{var ab=ad.split("-");W=parseInt(ab[0].replace(/,/g,""),10);Z=parseInt(ab[1].replace(/,/g,""),10)}catch(Y){return false}}ae.change_chrom(ac,W,Z)},move_fraction:function(Y){var W=this;var X=W.high-W.low;this.move_delta(Y*X)},move_delta:function(Y){var W=this;var X=W.high-W.low;if(W.low-Y<W.max_low){W.low=W.max_low;W.high=W.max_low+X}else{if(W.high-Y>W.max_high){W.high=W.max_high;W.low=W.max_high-X}else{W.high-=Y;W.low-=Y}}W.redraw()},add_track:function(W){W.view=this;W.track_id=this.track_id_counter;this.tracks.push(W);if(W.init){W.init()}W.container_div.attr("id","track_"+W.track_id);A(W.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(W){W.view=this;this.label_tracks.push(W)},remove_track:function(W){this.has_changes=true;W.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(W)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(ad){var ac=this.high-this.low,ab=this.low,X=this.high;if(ab<this.max_low){ab=this.max_low}if(X>this.max_high){X=this.max_high}if(this.high!==0&&ac<this.min_separation){X=ab+this.min_separation}this.low=Math.floor(ab);this.high=Math.ceil(X);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/200)/Math.LN10));this.zoom_res=Math.pow(r,Math.max(0,Math.ceil(Math.log(this.resolution,r)/Math.log(r))));var W=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var aa=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:W,width:Math.max(ae,aa)}).show();if(aa<ae){this.overview_box.css("left",W-(ae-aa)/2)}if(this.overview_highlight){this.overview_highlight.css({left:W,width:aa})}this.update_location(this.low,this.high);if(!ad){for(var Y=0,Z=this.tracks.length;Y<Z;Y++){if(this.tracks[Y]&&this.tracks[Y].enabled){this.tracks[Y].draw()}}for(Y=0,Z=this.label_tracks.length;Y<Z;Y++){this.label_tracks[Y].draw()}}},zoom_in:function(X,Y){if(this.max_high===0||this.high-this.low<this.min_separation){return}var Z=this.high-this.low,aa=Z/2+this.low,W=(Z/this.zoom_factor)/2;if(X){aa=X/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(aa-W);this.high=Math.round(aa+W);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var X=this.high-this.low,Y=X/2+this.low,W=(X*this.zoom_factor)/2;this.low=Math.round(Y-W);this.high=Math.round(Y+W);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 n=function(X,aa){this.track=X;this.name=aa.name;this.params=[];var ai=aa.params;for(var Y=0;Y<ai.length;Y++){var ad=ai[Y],W=ad.name,ah=ad.label,Z=unescape(ad.html),af=ad.type;if(af==="number"){this.params[this.params.length]=new g(W,ah,Z,ad.min,ad.max)}else{if(af=="select"){this.params[this.params.length]=new H(W,ah,Z)}else{console.log("WARNING: unrecognized tool parameter type:",W,af)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(ak){ak.stopPropagation()}).bind("click",function(ak){ak.stopPropagation()}).bind("dblclick",function(ak){ak.stopPropagation()});var ag=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var ae=this.params;var ab=this;$.each(this.params,function(al,ao){var an=$("<div>").addClass("param-row").appendTo(ab.parent_div);var ak=$("<div>").addClass("param-label").text(ao.label).appendTo(an);var am=$("<div/>").addClass("slider").html(ao.html).appendTo(an);$("<div style='clear: both;'/>").appendTo(an)});this.parent_div.find("input").click(function(){$(this).select()});var aj=$("<div>").addClass("slider-row").appendTo(this.parent_div);var ac=$("<input type='submit'>").attr("value","Run").appendTo(aj);var ab=this;ac.click(function(){ab.run()})};extend(n.prototype,{get_param_values_dict:function(){var W={};this.parent_div.find(":input").each(function(){var X=$(this).attr("name"),Y=$(this).val();W[X]=JSON.stringify(Y)});return W},get_param_values:function(){var X=[];var W={};this.parent_div.find(":input").each(function(){var Y=$(this).attr("name"),Z=$(this).val();if(Y){X[X.length]=Z}});return X},run:function(){var X={dataset_id:this.track.original_dataset_id,chrom:this.track.view.chrom,low:this.track.view.low,high:this.track.view.high,tool_id:this.name};$.extend(X,this.get_param_values_dict());var Z=this.track,Y=X.tool_id+Z.tool_region_and_parameters_str(X.chrom,X.low,X.high),aa;if(Z.track_type==="FeatureTrack"){aa=new M(Y,view,Z.hda_ldda,undefined,{},{},Z)}this.track.add_track(aa);aa.content_div.text("Starting job.");var W=function(){$.getJSON(run_tool_url,X,function(ab){if(ab==="no converter"){aa.container_div.addClass("error");aa.content_div.text(D)}else{if(ab.error){aa.container_div.addClass("error");aa.content_div.text(u+ab.message)}else{if(ab==="pending"){aa.container_div.addClass("pending");aa.content_div.text("Converting input data so that it can be easily reused.");setTimeout(W,2000)}else{aa.dataset_id=ab.dataset_id;aa.content_div.text("Running job.");aa.init()}}}})};W()}});var H=function(X,W,Y){this.name=X;this.label=W;this.html=Y};var g=function(Y,X,aa,Z,W){H.call(this,Y,X,aa);this.min=Z;this.max=W};var j=function(X,W,Y){this.name=X;this.index=W;this.value=Y};var N=function(X,W){this.name=X;this.index=W;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.min=Number.MAX_VALUE;this.max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};extend(N.prototype,{applies_to:function(W){if(W.length>this.index){return true}return false},keep:function(W){if(!this.applies_to(W)){return true}return(W[this.index]>=this.low&&W[this.index]<=this.high)},update_attrs:function(X){var W=false;if(!this.applies_to(X)){return W}if(X[this.index]<this.min){this.min=Math.floor(X[this.index]);W=true}if(X[this.index]>this.max){this.max=Math.ceil(X[this.index]);W=true}return W},update_ui_elt:function(){var X=this.slider.slider("option","min"),W=this.slider.slider("option","max");if(this.min<X||this.max>W){this.slider.slider("option","min",this.min);this.slider.slider("option","max",this.max);this.slider.slider("option","step",h(this.min,this.max));this.slider.slider("option","values",[this.min,this.max])}}});var S=function(Y,ae){this.track=Y;this.filters=[];for(var aa=0;aa<ae.length;aa++){var W=ae[aa];var X=W.name,ad=W.type,ab=W.index;if(ad==="int"||ad==="float"){this.filters[aa]=new N(X,ab)}else{this.filters[aa]=new j(X,ab,ad)}}var ac=function(af,ag,ah){af.click(function(){var ai=ag.text();max=parseFloat(ah.slider("option","max")),input_size=(max<=1?4:max<=1000000?max.toString().length:6),multi_value=false;if(ah.slider("option","values")){input_size=2*input_size+1;multi_value=true}ag.text("");$("<input type='text'/>").attr("size",input_size).attr("maxlength",input_size).attr("value",ai).appendTo(ag).focus().select().click(function(aj){aj.stopPropagation()}).blur(function(){$(this).remove();ag.text(ai)}).keyup(function(an){if(an.keyCode===27){$(this).trigger("blur")}else{if(an.keyCode===13){var al=ah.slider("option","min"),aj=ah.slider("option","max"),am=function(ao){return(isNaN(ao)||ao>aj||ao<al)},ak=$(this).val();if(!multi_value){ak=parseFloat(ak);if(am(ak)){alert("Parameter value must be in the range ["+al+"-"+aj+"]");return $(this)}}else{ak=ak.split("-");ak=[parseFloat(ak[0]),parseFloat(ak[1])];if(am(ak[0])||am(ak[1])){alert("Parameter value must be in the range ["+al+"-"+aj+"]");return $(this)}}ah.slider((multi_value?"values":"value"),ak)}}})})};this.parent_div=$("<div/>").addClass("filters").hide();this.parent_div.bind("drag",function(af){af.stopPropagation()}).bind("click",function(af){af.stopPropagation()}).bind("dblclick",function(af){af.stopPropagation()});var Z=this;$.each(this.filters,function(al,ag){var ai=$("<div/>").addClass("slider-row").appendTo(Z.parent_div);var af=$("<div/>").addClass("slider-label").appendTo(ai);var an=$("<span/>").addClass("slider-name").text(ag.name+" ").appendTo(af);var ah=$("<span/>");var aj=$("<span/>").addClass("slider-value").appendTo(af).append("[").append(ah).append("]");var am=$("<div/>").addClass("slider").appendTo(ai);ag.control_element=$("<div/>").attr("id",ag.name+"-filter-control").appendTo(am);var ak=[0,0];ag.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(ao,ap){ak=ap.values;ah.text(ap.values[0]+"-"+ap.values[1]);setTimeout(function(){if(ap.values[0]==ak[0]&&ap.values[1]==ak[1]){var aq=ap.values;ah.text(aq[0]+"-"+aq[1]);ag.low=aq[0];ag.high=aq[1];Z.track.draw(true,true)}},50)},change:function(ao,ap){ag.control_element.slider("option","slide").call(ag.control_element,ao,ap)}});ag.slider=ag.control_element;ag.slider_label=ah;ac(aj,ah,ag.control_element);$("<div style='clear: both;'/>").appendTo(ai)})};var R=function(W){this.track=W.track;this.params=W.params;this.values={};if(W.saved_values){this.restore_values(W.saved_values)}this.onchange=W.onchange};extend(R.prototype,{restore_values:function(W){var X=this;$.each(this.params,function(Y,Z){if(W[Z.key]!==undefined){X.values[Z.key]=W[Z.key]}else{X.values[Z.key]=Z.default_value}})},build_form:function(){var X=this;var W=$("<div />");$.each(this.params,function(ab,Z){if(!Z.hidden){var Y="param_"+ab;var ag=$("<div class='form-row' />").appendTo(W);ag.append($("<label />").attr("for",Y).text(Z.label+":"));if(Z.type==="bool"){ag.append($('<input type="checkbox" />').attr("id",Y).attr("name",Y).attr("checked",X.values[Z.key]))}else{if(Z.type==="color"){var ad=X.values[Z.key];var ac=$("<input />").attr("id",Y).attr("name",Y).val(ad);var ae=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var aa=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(ae);var af=$("<div/>").appendTo(aa).farbtastic({width:100,height:100,callback:ac,color:ad});$("<div />").append(ac).append(ae).appendTo(ag).bind("click",function(ah){ae.css({left:$(this).position().left+($(ac).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){ae.hide();$(document).unbind("click.color-picker")});ah.stopPropagation()})}else{ag.append($("<input />").attr("id",Y).attr("name",Y).val(X.values[Z.key]))}}}});return W},update_from_form:function(W){var Y=this;var X=false;$.each(this.params,function(Z,ab){if(!ab.hidden){var ac="param_"+Z;var aa=W.find("#"+ac).val();if(ab.type==="float"){aa=parseFloat(aa)}else{if(ab.type==="int"){aa=parseInt(aa)}else{if(ab.type==="bool"){aa=W.find("#"+ac).is(":checked")}}}if(aa!==Y.values[ab.key]){Y.values[ab.key]=aa;X=true}}});if(X){this.onchange()}}});var b=function(W,X){this.track=W;this.canvas=X};var k=function(X,W,aa,Y,Z){this.name=X;this.view=W;this.parent_element=aa;this.data_url=(Y?Y:default_data_url);this.data_url_extra_params={};this.data_query_wait=(Z?Z:E);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(k.prototype,{init:function(){var W=this;W.enabled=false;W.tile_cache.clear();W.data_cache.clear();W.initial_canvas=undefined;W.content_div.css("height","auto");W.container_div.removeClass("nodata error pending");if(!W.dataset_id){return}$.getJSON(converted_datasets_state_url,{hda_ldda:W.hda_ldda,dataset_id:W.dataset_id,chrom:W.view.chrom},function(X){if(!X||X==="error"||X.kind==="error"){W.container_div.addClass("error");W.content_div.text(m);if(X.message){var Z=W.view.tracks.indexOf(W);var Y=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+X.message+"</pre>",{Close:hide_modal})});W.content_div.append(Y)}}else{if(X==="no converter"){W.container_div.addClass("error");W.content_div.text(D)}else{if(X==="no data"||(X.data!==undefined&&(X.data===null||X.data.length===0))){W.container_div.addClass("nodata");W.content_div.text(z)}else{if(X==="pending"){W.container_div.addClass("pending");W.content_div.text(p);setTimeout(function(){W.init()},W.data_query_wait)}else{if(X.status==="data"){if(X.valid_chroms){W.valid_chroms=X.valid_chroms;W.make_name_popup_menu()}W.content_div.text(Q);if(W.view.chrom){W.content_div.text("");W.content_div.css("height",W.height_px+"px");W.enabled=true;$.when(W.predraw_init()).done(function(){W.container_div.removeClass("nodata error pending");W.draw()})}}}}}}})},predraw_init:function(){},update_name:function(W){this.old_name=this.name;this.name=W;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var G=function(ae,ac,af){var X=this,ag=X.view;this.filters_manager=(ae!==undefined?new S(this,ae):undefined);this.filters_available=false;this.filters_visible=false;this.tool=(ac!==undefined&&obj_length(ac)>0?new n(this,ac):undefined);this.parent_track=af;this.child_tracks=[];if(X.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}X.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();X.container_div.append(X.child_tracks_container);if(this.filters_manager){this.filters_div=this.filters_manager.parent_div;this.header_div.after(this.filters_div)}if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}if(X.display_modes!==undefined){if(X.mode_div===undefined){X.mode_div=$("<div class='right-float menubutton popup' />").appendTo(X.header_div);var Z=(X.track_config&&X.track_config.values.mode?X.track_config.values.mode:X.display_modes[0]);X.mode=Z;X.mode_div.text(Z);var Y=function(ah){X.mode_div.text(ah);X.mode=ah;X.track_config.values.mode=ah;X.tile_cache.clear();X.draw()};var W={};for(var aa=0,ad=X.display_modes.length;aa<ad;aa++){var ab=X.display_modes[aa];W[ab]=function(ah){return function(){Y(ah)}}(ab)}make_popupmenu(X.mode_div,W)}else{X.mode_div.hide()}}this.make_name_popup_menu()};extend(G.prototype,k.prototype,{make_name_popup_menu:function(){var X=this;var W={};W["Edit configuration"]=function(){var ad=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ab=function(){X.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ac=function(ae){if((ae.keyCode||ae.which)===27){ad()}else{if((ae.keyCode||ae.which)===13){ab()}}};$(window).bind("keypress.check_enter_esc",ac);show_modal("Configure Track",X.track_config.build_form(),{Cancel:ad,OK:ab})};if(X.filters_available>0){var aa=(X.filters_div.is(":visible")?"Hide filters":"Show filters");W[aa]=function(){X.filters_visible=(X.filters_div.is(":visible"));X.filters_div.toggle();X.make_name_popup_menu()}}if(X.tool){var aa=(X.dynamic_tool_div.is(":visible")?"Hide tool":"Show tool");W[aa]=function(){if(!X.dynamic_tool_div.is(":visible")){X.update_name(X.name+X.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";X.revert_name()}X.dynamic_tool_div.toggle();X.make_name_popup_menu()}}if(X.valid_chroms){W["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+X.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var Y=view;var Z=function(){$("#no-tracks").show()};if(this.parent_track){Y=this.parent_track;Z=function(){}}W.Remove=function(){Y.remove_track(X);if(Y.num_tracks===0){Z()}};make_popupmenu(X.name_div,W)},draw:function(W,Z){var an=this.view.low,ac=this.view.high,ae=ac-an,ag=this.view.container.width(),ab=ag/ae,ah=this.view.resolution,aa=$("<div style='position: relative;'></div>");if(!Z){this.content_div.children().remove()}this.content_div.append(aa);this.max_height=0;var aj=Math.floor(an/ah/I);var Y={};while((aj*I*ah)<ac){var am=ag+"_"+ab+"_"+aj;var ad=this.tile_cache.get(am);var ak=aj*I*this.view.resolution;var X=ak+I*this.view.resolution;if(!W&&ad){this.show_tile(ad,aa,ak,ab)}else{this.delayed_draw(W,am,ak,X,aj,ah,aa,ab,Y)}aj+=1}var af=this;var al=setInterval(function(){if(obj_length(Y)===0){clearInterval(al);if(Z){var aq=af.content_div.children();var ap=false;for(var ar=aq.length-1,ao=0;ar>=ao;ar--){var aw=$(aq[ar]);if(ap){aw.remove()}else{if(aw.children().length!==0){ap=true}}}}if(af.filters_manager){var au=af.filters_manager.filters;for(var av=0;av<au.length;av++){au[av].update_ui_elt()}var at=false;if(af.example_feature){for(var av=0;av<au.length;av++){if(au[av].applies_to(af.example_feature)){at=true;break}}}if(af.filters_available!==at){af.filters_available=at;if(!af.filters_available){af.filters_div.hide()}af.make_name_popup_menu()}}}},50);for(var ai=0;ai<this.child_tracks.length;ai++){this.child_tracks[ai].draw(W,Z)}},delayed_draw:function(X,ae,ac,ag,Y,aa,af,ah,ab){var Z=this;var ad=function(ap,ai,ak,aj,an,ao,al){returned_tile=Z.draw_tile(ai,ak,aj,an,ao,al);var am=$("<div class='track-tile'>").prepend(returned_tile);tile_element=am;Z.tile_cache.set(ae,tile_element);Z.show_tile(tile_element,an,ac,ao);delete ab[ap]};var W=setTimeout(function(){if(ac<=Z.view.high&&ag>=Z.view.low){var ai=(X?undefined:Z.tile_cache.get(ae));if(ai){Z.show_tile(ai,af,ac,ah);delete ab[W]}else{$.when(Z.data_cache.get_data(view.chrom,ac,ag,Z.mode,aa,Z.data_url_extra_params)).then(function(aj){if(view.reference_track&&ah>view.canvas_manager.char_width_px){$.when(view.reference_track.data_cache.get_data(view.chrom,ac,ag,Z.mode,aa,view.reference_track.data_url_extra_params)).then(function(ak){ad(W,aj,aa,Y,af,ah,ak)})}else{ad(W,aj,aa,Y,af,ah)}})}}},50);ab[W]=true},show_tile:function(W,ab,Z,ac){var X=this;var Y=this.view.high-this.view.low,aa=(Z-this.view.low)*ac;if(this.left_offset){aa-=this.left_offset}W.css({position:"absolute",top:0,left:aa,height:""});ab.append(W);X.max_height=Math.max(X.max_height,W.height());X.content_div.css("height",X.max_height+"px");ab.children().css("height",X.max_height+"px")},set_overview:function(){var W=this.view;if(this.initial_canvas&&this.is_overview){W.overview_close.show();W.overview_viewport.append(this.initial_canvas);W.overview_highlight.show().height(this.initial_canvas.height());W.overview_viewport.height(this.initial_canvas.height()+W.overview_box.height())}$(window).trigger("resize")},tool_region_and_parameters_str:function(Y,W,Z){var X=this,aa=(Y!==undefined&&W!==undefined&&Z!==undefined?Y+":"+W+"-"+Z:"all");return" - region=["+aa+"], parameters=["+X.tool.get_param_values().join(", ")+"]"},add_track:function(W){W.track_id=this.track_id+"_"+this.child_tracks.length;W.container_div.attr("id","track_"+W.track_id);this.child_tracks_container.append(W.container_div);A(W.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(W);this.view.has_changes=true},remove_track:function(W){W.container_div.fadeOut("slow",function(){$(this).remove()})}});var T=function(W,X){this.track_type="LabelTrack";this.hidden=true;k.call(this,null,W,X);this.container_div.addClass("label-track")};extend(T.prototype,k.prototype,{draw:function(){var Y=this.view,Z=Y.high-Y.low,ac=Math.floor(Math.pow(10,Math.floor(Math.log(Z)/Math.log(10)))),W=Math.floor(Y.low/ac)*ac,aa=this.view.container.width(),X=$("<div style='position: relative; height: 1.3em;'></div>");while(W<Y.high){var ab=(W-Y.low)/Z*aa;X.append($("<div class='label'>"+commatize(W)+"</div>").css({position:"absolute",left:ab-1}));W+=ac}this.content_div.children(":first").remove();this.content_div.append(X)}});var w=function(W){this.track_type="ReferenceTrack";this.hidden=true;k.call(this,null,W,W.top_labeltrack);G.call(this);W.reference_track=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_url=reference_url;this.data_url_extra_params={dbkey:W.dbkey};this.data_cache=new J(x,this,false);this.tile_cache=new c(q)};extend(w.prototype,G.prototype,{draw_tile:function(ag,ab,X,ad,ah){var aa=this,Y=I*ab;if(ah>this.view.canvas_manager.char_width_px){if(ag===null){aa.content_div.css("height","0px");return}var Z=this.view.canvas_manager.new_canvas();var af=Z.getContext("2d");Z.width=Math.ceil(Y*ah+aa.left_offset);Z.height=aa.height_px;af.font=af.canvas.manager.default_font;af.textAlign="center";for(var ac=0,ae=ag.length;ac<ae;ac++){var W=Math.round(ac*ah);af.fillText(ag[ac],W+aa.left_offset,10)}return Z}this.content_div.css("height","0px")}});var l=function(aa,Y,ab,W,Z){var X=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";k.call(this,aa,Y,Y.viewport_container);G.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=ab;this.dataset_id=W;this.original_dataset_id=W;this.data_cache=new J(x,this);this.tile_cache=new c(q);this.track_config=new R({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:Z,onchange:function(){X.vertical_range=X.prefs.max_value-X.prefs.min_value;$("#linetrack_"+X.track_id+"_minval").text(X.prefs.min_value);$("#linetrack_"+X.track_id+"_maxval").text(X.prefs.max_value);X.tile_cache.clear();X.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;this.add_resize_handle()};extend(l.prototype,G.prototype,{add_resize_handle:function(){var W=this;var Z=false;var Y=false;var X=$("<div class='track-resize'>");$(W.container_div).hover(function(){Z=true;X.show()},function(){Z=false;if(!Y){X.hide()}});X.hide().bind("dragstart",function(aa,ab){Y=true;ab.original_height=$(W.content_div).height()}).bind("drag",function(ab,ac){var aa=Math.min(Math.max(ac.original_height+ac.deltaY,W.min_height_px),W.max_height_px);$(W.content_div).css("height",aa);W.height_px=aa;W.draw(true)}).bind("dragend",function(aa,ab){W.tile_cache.clear();Y=false;if(!Z){X.hide()}W.track_config.values.height=W.height_px}).appendTo(W.container_div)},predraw_init:function(){var W=this,X=W.view.tracks.indexOf(W);W.vertical_range=undefined;return $.getJSON(W.data_url,{stats:true,chrom:W.view.chrom,low:null,high:null,hda_ldda:W.hda_ldda,dataset_id:W.dataset_id},function(Y){W.container_div.addClass("line-track");var aa=Y.data;if(isNaN(parseFloat(W.prefs.min_value))||isNaN(parseFloat(W.prefs.max_value))){W.prefs.min_value=aa.min;W.prefs.max_value=aa.max;$("#track_"+X+"_minval").val(W.prefs.min_value);$("#track_"+X+"_maxval").val(W.prefs.max_value)}W.vertical_range=W.prefs.max_value-W.prefs.min_value;W.total_frequency=aa.total_frequency;W.container_div.find(".yaxislabel").remove();var ab=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+X+"_minval").text(t(W.prefs.min_value));var Z=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+X+"_maxval").text(t(W.prefs.max_value));Z.css({position:"absolute",top:"24px",left:"10px"});Z.prependTo(W.container_div);ab.css({position:"absolute",bottom:"2px",left:"10px"});ab.prependTo(W.container_div)})},draw_tile:function(ah,aa,X,ae,ag){if(this.vertical_range===undefined){return}var ab=X*I*aa,Z=I*aa,W=Math.ceil(Z*ag),ad=this.height_px;var Y=this.view.canvas_manager.new_canvas();Y.width=W,Y.height=ad;var af=Y.getContext("2d");var ac=new F.LinePainter(ah.data,ab,ab+Z,this.prefs,this.mode);ac.draw(af,W,ad);return Y}});var e=function(W,ab,aa,ae,ad,Y,Z,ac){var X=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];this.track_config=new R({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:ad,onchange:function(){X.tile_cache.clear();X.draw()}});this.prefs=this.track_config.values;k.call(this,W,ab,ab.viewport_container);G.call(this,Y,Z,ac);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=aa;this.dataset_id=ae;this.original_dataset_id=ae;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.inc_slots={};this.start_end_dct={};this.tile_cache=new c(d);this.data_cache=new J(20,this);this.left_offset=200;this.painter=F.LinkedFeaturePainter};extend(e.prototype,G.prototype,{update_auto_mode:function(W){if(this.mode=="Auto"){if(W=="no_detail"){W="feature spans"}else{if(W=="summary_tree"){W="coverage histogram"}}this.mode_div.text("Auto ("+W+")")}},incremental_slots:function(aa,X,Z){var Y=this.view.canvas_manager.dummy_context,W=this.inc_slots[aa];if(!W||(W.mode!==Z)){W=new (o.FeatureSlotter)(aa,Z==="Pack",v,function(ab){return Y.measureText(ab)});W.mode=Z;this.inc_slots[aa]=W}return W.slot_features(X)},draw_tile:function(aj,ar,aw,ae,ag,Z){var ao=this,ay=aw*I*ar,X=(aw+1)*I*ar,al=X-ay,ap=Math.ceil(al*ag),an=this.mode,aC=25,aa=this.left_offset,ak,ab;if(an==="Auto"){if(aj.dataset_type==="summary_tree"){an=aj.dataset_type}else{if(aj.extra_info==="no_detail"){an="no_detail"}else{var aB=aj.data;if(this.view.high-this.view.low>C){an="Squish"}else{an="Pack"}}}this.update_auto_mode(an)}if(an==="summary_tree"){ab=this.summary_draw_height;ae.parent().css("height",Math.max(this.height_px,ab)+"px");this.container_div.find(".yaxislabel").remove();var W=$("<div />").addClass("yaxislabel");W.text(aj.max);W.css({position:"absolute",top:"22px",left:"10px"});W.prependTo(this.container_div);var Y=this.view.canvas_manager.new_canvas();Y.width=ap+aa;Y.height=ab+K;var az=new F.SummaryTreePainter(aj,ay,X,this.prefs);var aq=Y.getContext("2d");aq.translate(aa,K);az.draw(aq,ap,ab);return Y}var ak,ad=1;if(an==="no_detail"||an==="Squish"||an==="Pack"){ad=this.incremental_slots(ag,aj.data,an);ak=this.inc_slots[ag].slots}var af=[];if(aj.data){var ah=this.filters_manager.filters;for(var at=0,av=aj.data.length;at<av;at++){var ac=aj.data[at];var au=false;var ai;for(var ax=0,aA=ah.length;ax<aA;ax++){ai=ah[ax];ai.update_attrs(ac);if(!ai.keep(ac)){au=true;break}}if(!au){af.push(ac)}}}var az=new (this.painter)(af,ay,X,this.prefs,an,Z);var ab=az.get_required_height(ad)+y;var Y=this.view.canvas_manager.new_canvas();Y.width=ap+aa;Y.height=ab;ae.parent().css("height",Math.max(this.height_px,ab)+"px");var aq=Y.getContext("2d");aq.fillStyle=this.prefs.block_color;aq.font=aq.canvas.manager.default_font;aq.textAlign="right";this.container_div.find(".yaxislabel").remove();if(aj.message){$(Y).css({"border-top":"1px solid red"});aq.fillStyle="red";aq.textAlign="left";var am=aq.textBaseline;aq.textBaseline="top";aq.fillText(aj.message,aa,0);aq.textBaseline=am;if(!aj.data){return Y}}this.example_feature=(aj.data.length?aj.data[0]:undefined);aq.translate(aa,y);az.draw(aq,ap,ab,ak);return Y}});var L=function(Z,X,ab,W,Y,aa){e.call(this,Z,X,ab,W,Y,aa);this.track_type="VcfTrack";this.painter=F.VariantPainter};extend(L.prototype,G.prototype,e.prototype);var O=function(Z,X,ab,W,Y,aa){e.call(this,Z,X,ab,W,Y,aa);this.track_config=new R({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_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:Y,onchange:function(){this.track.tile_cache.clear();this.track.draw()}});this.prefs=this.track_config.values;this.track_type="ReadTrack";this.painter=F.ReadPainter;this.make_name_popup_menu()};extend(O.prototype,G.prototype,e.prototype);var M=function(aa,Y,ac,W,Z,ab,X){e.call(this,aa,Y,ac,W,Z,ab,{},X);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};extend(M.prototype,G.prototype,e.prototype,{predraw_init:function(){var X=this;var W=function(){if(X.data_cache.size()===0){setTimeout(W,300)}else{X.data_url=default_data_url;X.data_query_wait=E;X.dataset_state_url=converted_datasets_state_url;$.getJSON(X.dataset_state_url,{dataset_id:X.dataset_id,hda_ldda:X.hda_ldda},function(Y){})}};W()}});P.View=U;P.LineTrack=l;P.FeatureTrack=e;P.ReadTrack=O};var slotting_module=function(c,b){var d=2,a=5;b.FeatureSlotter=function(h,g,e,f){this.slots={};this.start_end_dct={};this.w_scale=h;this.include_label=g;this.max_rows=e;this.measureText=f};extend(b.FeatureSlotter.prototype,{slot_features:function(l){var o=this.w_scale,r=this.slots,g=this.start_end_dct,x=[],z=[],m=0,y=this.max_rows;for(var v=0,w=l.length;v<w;v++){var k=l[v],n=k[0];if(r[n]!==undefined){m=Math.max(m,r[n]);z.push(r[n])}else{x.push(v)}}var p=function(F,G){for(var E=0;E<=y;E++){var C=false,H=g[E];if(H!==undefined){for(var B=0,D=H.length;B<D;B++){var A=H[B];if(G>A[0]&&F<A[1]){C=true;break}}}if(!C){return E}}return -1};for(var v=0,w=x.length;v<w;v++){var k=l[x[v]],n=k[0],t=k[1],e=k[2],q=k[3],f=Math.floor(t*o),j=Math.ceil(e*o),u=this.measureText(q).width,h;if(q!==undefined&&this.include_label){u+=(d+a);if(f-u>=0){f-=u;h="left"}else{j+=u;h="right"}}var s=p(f,j);if(s>=0){if(g[s]===undefined){g[s]=[]}g[s].push([f,j]);r[n]=s;m=Math.max(m,s)}else{}}return m+1}})};var painters_module=function(k,B){var r=function(M,E,K,D,J,H){if(H===undefined){H=4}var G=D-E;var F=J-K;var I=Math.floor(Math.sqrt(G*G+F*F)/H);var N=G/I;var L=F/I;var C;for(C=0;C<I;C++,E+=N,K+=L){if(C%2!==0){continue}M.fillRect(E,K,H,1)}};var s=function(E,D,C,H){var G=D-H/2,F=D+H/2,I=C-Math.sqrt(H*3/2);E.beginPath();E.moveTo(G,I);E.lineTo(F,I);E.lineTo(D,C);E.lineTo(G,I);E.strokeStyle=this.fillStyle;E.fill();E.stroke();E.closePath()};var o=function(E,G,C,D,F){this.data=E;this.view_start=G;this.view_end=C;this.prefs=extend({},this.default_prefs,D);this.mode=F};o.prototype.default_prefs={};var w=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};w.prototype.default_prefis={show_counts:false};w.prototype.draw=function(P,C,O){var H=this.view_start,R=this.view_end-this.view_start,Q=C/R;var M=this.data.data,L=this.data.delta,J=this.data.max,E=O;delta_x_px=Math.ceil(L*Q);P.save();for(var F=0,G=M.length;F<G;F++){var K=Math.floor((M[F][0]-H)*Q);var I=M[F][1];if(!I){continue}var N=I/J*O;P.fillStyle="black";P.fillRect(K,E-N,delta_x_px,N);var D=4;if(this.prefs.show_counts&&(P.measureText(I).width+D)<delta_x_px){P.fillStyle="#666";P.textAlign="center";P.fillText(I,K+(delta_x_px/2),10)}}P.restore()};var c=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};c.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};c.prototype.draw=function(R,Q,O){var J=false,K=this.prefs.min_value,H=this.prefs.max_value,N=H-K,D=O,E=this.view_start,P=this.view_end-this.view_start,F=Q/P,L=this.mode,V=this.data;R.save();var W=Math.round(O+K/N*O);if(L!=="Intensity"){R.fillStyle="#aaa";R.fillRect(0,W,Q,1)}R.beginPath();R.fillStyle=this.prefs.color;var U,I,G;if(V.length>1){G=Math.ceil((V[1][0]-V[0][0])*F)}else{G=10}for(var S=0,T=V.length;S<T;S++){U=Math.round((V[S][0]-E)*F);I=V[S][1];if(I===null){if(J&&L==="Filled"){R.lineTo(U,D)}J=false;continue}if(I<K){I=K}else{if(I>H){I=H}}if(L==="Histogram"){I=Math.round(I/N*D);R.fillRect(U,W,G,-I)}else{if(L==="Intensity"){I=255-Math.floor((I-K)/N*255);R.fillStyle="rgb("+I+","+I+","+I+")";R.fillRect(U,0,G,D)}else{I=Math.round(D-(I-K)/N*D);if(J){R.lineTo(U,I)}else{J=true;if(L==="Filled"){R.moveTo(U,D);R.lineTo(U,I)}else{R.moveTo(U,I)}}}}}if(L==="Filled"){if(J){R.lineTo(U,W);R.lineTo(0,W)}R.fill()}else{R.stroke()}var C=-1,M=-1;R.fillStyle=this.prefs.overflow_color;for(var S=0,T=V.length;S<T;S++){I=V[S][1];U=Math.round((V[S][0]-E)*F);x_minus_scaled=Math.round((V[S][0]-1-E)*F);if(M>=0&&(I===null||I<H)){R.fillRect(M,0,x_minus_scaled-M+1,2);M=-1}else{if(C>=0&&(I===null||I>K)){R.fillRect(C,O-2,x_minus_scaled-C+1,2);C=-1}}if(I!==null&&I>H&&M<0){M=U}else{if(I!==null&&I<K&&C<0){C=U}}}R.restore()};var q=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};q.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};extend(q.prototype,{get_required_height:function(D){var C=y_scale=this.get_row_height(),E=this.mode;if(E==="no_detail"||E==="Squish"||E==="Pack"){C=D*y_scale}return C+Math.max(Math.round(y_scale/2),5)},draw:function(O,F,N,K){var I=this.data,L=this.view_start,P=this.view_end;O.save();O.fillStyle=this.prefs.block_color;O.textAlign="right";var S=this.view_end-this.view_start,R=F/S,E=this.get_row_height();for(var H=0,J=I.length;H<J;H++){var Q=I[H],G=Q[0],C=Q[1],D=Q[2],M=(K&&K[G]!==undefined?K[G]:null);if((C<P&&D>L)&&(this.mode=="Dense"||M!==null)){this.draw_element(O,this.mode,Q,M,L,P,R,E,F)}}O.restore()}});var d=10,j=3,n=5,A=10,g=1,u=3,f=3,a=9,p=2,h="#ccc";var t=function(E,G,C,D,F){q.call(this,E,G,C,D,F)};extend(t.prototype,q.prototype,{get_row_height:function(){var D=this.mode,C;if(D==="Dense"){C=d}else{if(D==="no_detail"){C=j}else{if(D==="Squish"){C=n}else{C=A}}}return C},draw_element:function(O,H,W,J,Q,ag,ak,al,C){var T=W[0],ai=W[1],aa=W[2]-1,R=W[3],ab=Math.floor(Math.max(0,(ai-Q)*ak)),P=Math.ceil(Math.min(C,Math.max(0,(aa-Q)*ak))),Z=(H==="Dense"?0:(0+J))*al,N,ae,S=null,am=null,F=this.prefs.block_color,ad=this.prefs.label_color;if(H=="Dense"){J=1}if(H==="no_detail"){O.fillStyle=F;O.fillRect(ab,Z+5,P-ab,g)}else{var M=W[4],Y=W[5],ac=W[6],G=W[7];if(Y&&ac){S=Math.floor(Math.max(0,(Y-Q)*ak));am=Math.ceil(Math.min(C,Math.max(0,(ac-Q)*ak)))}var aj,U;if(H==="Squish"||H==="Dense"){aj=1;U=f}else{aj=5;U=a}if(!G){if(W.strand){if(W.strand==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand_inv")}else{if(W.strand==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand_inv")}}}else{O.fillStyle=F}O.fillRect(ab,Z,P-ab,U)}else{var L,V;if(H==="Squish"||H==="Dense"){O.fillStyle=h;L=Z+Math.floor(f/2)+1;V=1}else{if(M){var L=Z;var V=U;if(M==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand")}else{if(M==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand")}}}else{O.fillStyle=h;L+=(f/2)+1;V=1}}O.fillRect(ab,L,P-ab,V);for(var ah=0,E=G.length;ah<E;ah++){var I=G[ah],D=Math.floor(Math.max(0,(I[0]-Q)*ak)),X=Math.ceil(Math.min(C,Math.max((I[1]-1-Q)*ak)));if(D>X){continue}O.fillStyle=F;O.fillRect(D,Z+(U-aj)/2+1,X-D,aj);if(S!==undefined&&ac>Y&&!(D>am||X<S)){var af=Math.max(D,S),K=Math.min(X,am);O.fillRect(af,Z+1,K-af,U);if(G.length==1&&H=="Pack"){if(M==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand_inv")}else{if(M==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand_inv")}}if(af+14<K){af+=2;K-=2}O.fillRect(af,Z+1,K-af,U)}}}}if(H==="Pack"&&ai>Q){O.fillStyle=ad;if(Q===0&&ab-O.measureText(R).width<0){O.textAlign="left";O.fillText(R,P+p,Z+8)}else{O.textAlign="right";O.fillText(R,ab-p,Z+8)}O.fillStyle=F}}}});var b=function(E,G,C,D,F){q.call(this,E,G,C,D,F)};extend(b.prototype,q.prototype,{draw_element:function(V,Q,K,G,Y,E,N,W,T){var K=data[i],M=K[0],U=K[1],F=K[2]-1,P=K[3],I=Math.floor(Math.max(0,(U-Y)*N)),L=Math.ceil(Math.min(T,Math.max(0,(F-Y)*N))),H=(Q==="Dense"?0:(0+G))*W,C,Z,D=null,O=null;if(no_label){V.fillStyle=block_color;V.fillRect(I+left_offset,H+5,L-I,1)}else{var X=K[4],S=K[5],J=K[6];C=9;Z=1;V.fillRect(I+left_offset,H,L-I,C);if(Q!=="Dense"&&P!==undefined&&U>Y){V.fillStyle=label_color;if(Y===0&&I-V.measureText(P).width<0){V.textAlign="left";V.fillText(P,L+2+left_offset,H+8)}else{V.textAlign="right";V.fillText(P,I-2+left_offset,H+8)}V.fillStyle=block_color}var R=X+" / "+S;if(U>Y&&V.measureText(R).width<(L-I)){V.fillStyle="white";V.textAlign="center";V.fillText(R,left_offset+I+(L-I)/2,H+8);V.fillStyle=block_color}}}});var z=1001,m=1002,e=1003,y=1004,l=1005;var x=function(G,D){var I=G[0],H=G[1],F=D[0],E=D[1],C;if(I<F){if(H<F){C=z}else{if(H<=E){C=e}else{C=m}}}else{if(I>E){C=z}else{if(H<=E){C=l}else{C=y}}}return C};var v=function(F,H,C,E,G,D){q.call(this,F,H,C,E,G);this.ref_seq=D};v.prototype.default_prefs=extend({},q.prototype.default_prefs,{show_insertions:false});extend(v.prototype,q.prototype,{get_row_height:function(){var C,D=this.mode;if(D==="Dense"){C=d}else{if(D==="Squish"){C=n}else{C=A;if(this.prefs.show_insertions){C*=2}}}return C},draw_read:function(Z,U,P,ae,E,Y,M,J,I){Z.textAlign="center";var X=this,D=[ae,E],S=0,aa=0,W=0;ref_seq=this.ref_seq,char_width_px=Z.canvas.manager.char_width_px;var aj=[];if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){W=Math.round(P/2)}if(!M){M=[[0,J.length]]}for(var Q=0,ac=M.length;Q<ac;Q++){var N=M[Q],F="MIDNSHP=X"[N[0]],R=N[1];if(F==="H"||F==="S"){S-=R}var K=Y+S,ai=Math.floor(Math.max(0,(K-ae)*P)),L=Math.floor(Math.max(0,(K+R-ae)*P));if(ai===L){L+=1}switch(F){case"H":break;case"S":case"M":case"=":var T=x([K,K+R],D);if(T!==z){var V=J.slice(aa,aa+R);if(W>0){Z.fillStyle=this.prefs.block_color;Z.fillRect(ai-W,I+1,L-ai,9);Z.fillStyle=h;for(var ag=0,C=V.length;ag<C;ag++){if(this.prefs.show_differences&&ref_seq){var O=ref_seq[K-ae+ag];if(!O||O.toLowerCase()===V[ag].toLowerCase()){continue}}if(K+ag>=ae&&K+ag<=E){var ah=Math.floor(Math.max(0,(K+ag-ae)*P));Z.fillText(V[ag],ah,I+9)}}}else{Z.fillStyle=this.prefs.block_color;Z.fillRect(ai,I+4,L-ai,f)}}aa+=R;S+=R;break;case"N":Z.fillStyle=h;Z.fillRect(ai-W,I+5,L-ai,1);S+=R;break;case"D":Z.fillStyle="red";Z.fillRect(ai-W,I+4,L-ai,3);S+=R;break;case"P":break;case"I":var T=x([K,K+R],D),ad=ai-W;if(T!==z){var V=J.slice(aa,aa+R);if(this.prefs.show_insertions){var H=ai-(L-ai)/2;if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){Z.fillStyle="yellow";Z.fillRect(H-W,I-9,L-ai,9);aj[aj.length]={type:"triangle",data:[ad,I+4,5]};Z.fillStyle=h;switch(T){case (e):V=V.slice(ae-K);break;case (y):V=V.slice(0,K-E);break;case (l):break;case (m):V=V.slice(ae-K,K-E);break}for(var ag=0,C=V.length;ag<C;ag++){var ah=Math.floor(Math.max(0,(K+ag-ae)*P));Z.fillText(V[ag],ah-(L-ai)/2,I)}}else{Z.fillStyle="yellow";Z.fillRect(H,I+(this.mode!=="Dense"?2:5),L-ai,(U!=="Dense"?f:u))}}else{if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){aj[aj.length]={type:"text",data:[V.length,ad,I+9]}}else{}}}aa+=R;break;case"X":aa+=R;break}}Z.fillStyle="yellow";var af,G,ak;for(var ab=0;ab<aj.length;ab++){af=aj[ab];G=af.type;ak=af.data;if(G==="text"){Z.save();Z.font="bold "+Z.font;Z.fillText(ak[0],ak[1],ak[2]);Z.restore()}else{if(G=="triangle"){s(Z,ak[0],ak[1],ak[2])}}}},draw_element:function(V,Q,I,F,Y,D,M,W,T){var L=I[0],U=I[1],E=I[2],N=I[3],H=Math.floor(Math.max(0,(U-Y)*M)),J=Math.ceil(Math.min(T,Math.max(0,(E-Y)*M))),G=(Q==="Dense"?0:(0+F))*W,Z=this.prefs.block_color,K=this.prefs.label_color,S=0;if((Q==="Pack"||this.mode==="Auto")&&M>V.canvas.manager.char_width_px){var S=Math.round(M/2)}V.fillStyle=Z;if(I[5] instanceof Array){var R=Math.floor(Math.max(0,(I[4][0]-Y)*M)),P=Math.ceil(Math.min(T,Math.max(0,(I[4][1]-Y)*M))),O=Math.floor(Math.max(0,(I[5][0]-Y)*M)),C=Math.ceil(Math.min(T,Math.max(0,(I[5][1]-Y)*M)));if(I[4][1]>=Y&&I[4][0]<=D&&I[4][2]){this.draw_read(V,Q,M,Y,D,I[4][0],I[4][2],I[4][3],G)}if(I[5][1]>=Y&&I[5][0]<=D&&I[5][2]){this.draw_read(V,Q,M,Y,D,I[5][0],I[5][2],I[5][3],G)}if(O>P){V.fillStyle=h;r(V,P-S,G+5,O-S,G+5)}}else{V.fillStyle=Z;this.draw_read(V,Q,M,Y,D,U,I[4],I[5],G)}if(Q==="Pack"&&U>Y){V.fillStyle=this.prefs.label_color;var X=1;if(X===0&&H-V.measureText(N).width<0){V.textAlign="left";V.fillText(N,J+p-S,G+8)}else{V.textAlign="right";V.fillText(N,H-p-S,G+8)}V.fillStyle=Z}}});B.SummaryTreePainter=w;B.LinePainter=c;B.LinkedFeaturePainter=t;B.ReadPainter=v;B.VariantPainter=b};(function(d){var c={};var b=function(e){return c[e]};var a=function(f,g){var e={};g(b,e);c[f]=e};a("slotting",slotting_module);a("painters",painters_module);a("trackster",trackster_module);for(key in c.trackster){d[key]=c.trackster[key]}})(window);
\ No newline at end of file
+var extend=function(){var c=arguments[0];for(var b=1;b<arguments.length;b++){var a=arguments[b];for(key in a){c[key]=a[key]}}return c};var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(e,b){var g=e[0],f=e[1],d=b[0],c=b[1],a;if(g<d){if(f<d){a=BEFORE}else{if(f<=c){a=OVERLAP_START}else{a=CONTAINS}}}else{if(g>c){a=AFTER}else{if(f<=c){a=CONTAINED_BY}else{a=OVERLAP_END}}}return a};var is_overlap=function(c,b){var a=compute_overlap(c,b);return(a!==BEFORE&&a!==AFTER)};var trackster_module=function(f,R){var p=f("slotting"),G=f("painters");var X=function(Y,Z){this.document=Y;this.default_font=Z!==undefined?Z:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};extend(X.prototype,{load_pattern:function(Y,ac){var Z=this.patterns,aa=this.dummy_context,ab=new Image();ab.src=image_path+ac;ab.onload=function(){Z[Y]=aa.createPattern(ab,"repeat")}},get_pattern:function(Y){return this.patterns[Y]},new_canvas:function(){var Y=this.document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(Y)}Y.manager=this;return Y}});var B=function(Y,Z){Y.bind("drag",{handle:Z,relative:true},function(ad,ae){var ac=$(this).parent();var ab=ac.children();var aa;for(aa=0;aa<ab.length;aa++){if(ae.offsetY<$(ab.get(aa)).position().top){break}}if(aa===ab.length){if(this!==ab.get(aa-1)){ac.append(this)}}else{if(this!==ab.get(aa)){$(this).insertBefore(ab.get(aa))}}})};var h=function(aa,Y){var Z=Y-aa;return(Z<=2?0.01:(Z<=100?1:(Z<=1000?5:10)))};var C=9,z=10,M=C+2,w=100,D=12000,K=200,s=10,F=5000,t=100,n="There was an error in indexing this dataset. ",E="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",A="No data for this chrom/contig.",q="Currently indexing... please wait",v="Tool cannot be rerun: ",a="Loading data...",S="Ready for display",d=10,r=5,y=5;function u(Y){return Math.round(Y*1000)/1000}var c=function(Y){this.num_elements=Y;this.clear()};extend(c.prototype,{get:function(Z){var Y=this.key_ary.indexOf(Z);if(Y!==-1){this.move_key_to_end(Z,Y)}return this.obj_cache[Z]},set:function(Z,aa){if(!this.obj_cache[Z]){if(this.key_ary.length>=this.num_elements){var Y=this.key_ary.shift();delete this.obj_cache[Y]}this.key_ary.push(Z)}this.obj_cache[Z]=aa;return aa},move_key_to_end:function(Z,Y){this.key_ary.splice(Y,1);this.key_ary.push(Z)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var L=function(Z,Y,aa){c.call(this,Z);this.track=Y;this.subset=(aa!==undefined?aa:true)};extend(L.prototype,c.prototype,{load_data:function(ag,ah,ac,af,Z,ae){if(this.track.track_type=="ReferenceTrack"&&Z>1){return}var ab={chrom:ag,low:ah,high:ac,mode:af,resolution:Z,dataset_id:this.track.dataset_id,hda_ldda:this.track.hda_ldda};$.extend(ab,ae);if(this.track.filters_manager){var ai=[];var Y=this.track.filters_manager.filters;for(var ad=0;ad<Y.length;ad++){ai[ai.length]=Y[ad].name}ab.filter_cols=JSON.stringify(ai)}var aa=this;return $.getJSON(this.track.data_url,ab,function(aj){aa.set_data(ah,ac,af,aj)})},get_data:function(aa,Y,ad,ae,Z,ac){var ab=this.get(this.gen_key(Y,ad,ae));if(ab){return ab}ab=this.load_data(aa,Y,ad,ae,Z,ac);this.set_data(Y,ad,ae,ab);return ab},set_data:function(Z,aa,ab,Y){return this.set(this.gen_key(Z,aa,ab),Y)},gen_key:function(Y,aa,ab){var Z=Y+"_"+aa+"_"+ab;return Z},split_key:function(Y){return Y.split("_")}});var W=function(Y,ab,aa,Z,ac){this.container=Y;this.chrom=null;this.vis_id=aa;this.dbkey=Z;this.title=ab;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(ac);this.canvas_manager=new X(Y.get(0).ownerDocument);this.reset()};extend(W.prototype,{init:function(ab){var aa=this.container,Y=this;this.top_container=$("<div/>").addClass("top-container").appendTo(aa);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(aa);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(aa);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_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var Z=function(ac){if(ac.type==="focusout"||(ac.keyCode||ac.which)===13||(ac.keyCode||ac.which)===27){if((ac.keyCode||ac.which)!==27){Y.go_to($(this).val())}$(this).hide();$(this).val("");Y.location_span.show();Y.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",Z).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){Y.location_span.hide();Y.chrom_select.hide();Y.nav_input.val(Y.chrom+":"+Y.low+"-"+Y.high);Y.nav_input.css("display","inline-block");Y.nav_input.select();Y.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){Y.zoom_out();Y.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){Y.zoom_in();Y.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},ab);this.chrom_select.bind("change",function(){Y.change_chrom(Y.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(ac){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(ac){Y.zoom_in(ac.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ac,ad){this.current_x=ad.offsetX}).bind("drag",function(ac,ae){var af=ae.offsetX-this.current_x;this.current_x=ae.offsetX;var ad=Math.round(af/Y.viewport_container.width()*(Y.max_high-Y.max_low));Y.move_delta(-ad)});this.overview_close.bind("click",function(){for(var ad=0,ac=Y.tracks.length;ad<ac;ad++){Y.tracks[ad].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",Y.overview_box.height());Y.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(ac,ad){if(ac.clientX>Y.viewport_container.width()-16){return false}}).bind("dragstart",function(ac,ad){ad.original_low=Y.low;ad.current_height=ac.clientY;ad.current_x=ad.offsetX}).bind("drag",function(ae,ag){var ac=$(this);var ah=ag.offsetX-ag.current_x;var ad=ac.scrollTop()-(ae.clientY-ag.current_height);ac.scrollTop(ad);ag.current_height=ae.clientY;ag.current_x=ag.offsetX;var af=Math.round(ah/Y.viewport_container.width()*(Y.high-Y.low));Y.move_delta(af)}).bind("mousewheel",function(ae,ag,ad,ac){if(ad){var af=Math.round(-ad/Y.viewport_container.width()*(Y.high-Y.low));Y.move_delta(af)}});this.top_labeltrack.bind("dragstart",function(ac,ad){return $("<div />").css({height:Y.content_div.height()+Y.top_labeltrack.height()+Y.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ag,ah){$(ah.proxy).css({left:Math.min(ag.pageX,ah.startX),width:Math.abs(ag.pageX-ah.startX)});var ad=Math.min(ag.pageX,ah.startX)-Y.container.offset().left,ac=Math.max(ag.pageX,ah.startX)-Y.container.offset().left,af=(Y.high-Y.low),ae=Y.viewport_container.width();Y.update_location(Math.round(ad/ae*af)+Y.low,Math.round(ac/ae*af)+Y.low)}).bind("dragend",function(ah,ai){var ad=Math.min(ah.pageX,ai.startX),ac=Math.max(ah.pageX,ai.startX),af=(Y.high-Y.low),ae=Y.viewport_container.width(),ag=Y.low;Y.low=Math.round(ad/ae*af)+ag;Y.high=Math.round(ac/ae*af)+ag;$(ai.proxy).remove();Y.redraw()});this.add_label_track(new V(this,this.top_labeltrack));this.add_label_track(new V(this,this.nav_labeltrack));$(window).bind("resize",function(){Y.resize_window()});$(document).bind("redraw",function(){Y.redraw()});this.reset();$(window).trigger("resize")},update_location:function(Y,Z){this.location_span.text(commatize(Y)+" - "+commatize(Z));this.nav_input.val(this.chrom+":"+commatize(Y)+"-"+commatize(Z))},load_chroms:function(Z,aa){Z.num=t;$.extend(Z,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var Y=this;$.ajax({url:chrom_url,data:Z,dataType:"json",success:function(ac){if(ac.chrom_info.length===0){alert("Invalid chromosome: "+Z.chrom);return}if(ac.reference){Y.add_label_track(new x(Y))}Y.chrom_data=ac.chrom_info;var af='<option value="">Select Chrom/Contig</option>';for(var ae=0,ab=Y.chrom_data.length;ae<ab;ae++){var ad=Y.chrom_data[ae].chrom;af+='<option value="'+ad+'">'+ad+"</option>"}if(ac.prev_chroms){af+='<option value="previous">Previous '+t+"</option>"}if(ac.next_chroms){af+='<option value="next">Next '+t+"</option>"}Y.chrom_select.html(af);if(aa){aa()}Y.chrom_start_index=ac.start_index},error:function(){alert("Could not load chroms for this dbkey:",Y.dbkey)}})},change_chrom:function(ac,Z,ae){if(!ac||ac==="None"){return}var ab=this;if(ac==="previous"){ab.load_chroms({low:this.chrom_start_index-t});return}if(ac==="next"){ab.load_chroms({low:this.chrom_start_index+t});return}var ad=$.grep(ab.chrom_data,function(ag,ah){return ag.chrom===ac})[0];if(ad===undefined){ab.load_chroms({chrom:ac},function(){ab.change_chrom(ac,Z,ae)});return}else{if(ac!==ab.chrom){ab.chrom=ac;if(!ab.chrom){ab.intro_div.show()}else{ab.intro_div.hide()}ab.chrom_select.val(ab.chrom);ab.max_high=ad.len-1;ab.reset();ab.redraw(true);for(var af=0,Y=ab.tracks.length;af<Y;af++){var aa=ab.tracks[af];if(aa.init){aa.init()}}}if(Z!==undefined&&ae!==undefined){ab.low=Math.max(Z,0);ab.high=Math.min(ae,ab.max_high)}ab.reset_overview();ab.redraw()}},go_to:function(ac){var ag=this,Y,ab,Z=ac.split(":"),ae=Z[0],af=Z[1];if(af!==undefined){try{var ad=af.split("-");Y=parseInt(ad[0].replace(/,/g,""),10);ab=parseInt(ad[1].replace(/,/g,""),10)}catch(aa){return false}}ag.change_chrom(ae,Y,ab)},move_fraction:function(aa){var Y=this;var Z=Y.high-Y.low;this.move_delta(aa*Z)},move_delta:function(aa){var Y=this;var Z=Y.high-Y.low;if(Y.low-aa<Y.max_low){Y.low=Y.max_low;Y.high=Y.max_low+Z}else{if(Y.high-aa>Y.max_high){Y.high=Y.max_high;Y.low=Y.max_high-Z}else{Y.high-=aa;Y.low-=aa}}Y.redraw()},add_track:function(Y){Y.view=this;Y.track_id=this.track_id_counter;this.tracks.push(Y);if(Y.init){Y.init()}Y.container_div.attr("id","track_"+Y.track_id);B(Y.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(Y){Y.view=this;this.label_tracks.push(Y)},remove_track:function(Y){this.has_changes=true;Y.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(Y)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(af){var ae=this.high-this.low,ad=this.low,Z=this.high;if(ad<this.max_low){ad=this.max_low}if(Z>this.max_high){Z=this.max_high}if(this.high!==0&&ae<this.min_separation){Z=ad+this.min_separation}this.low=Math.floor(ad);this.high=Math.ceil(Z);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/K)/Math.LN10));this.zoom_res=Math.pow(s,Math.max(0,Math.ceil(Math.log(this.resolution,s)/Math.log(s))));var Y=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ac=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ag=13;this.overview_box.css({left:Y,width:Math.max(ag,ac)}).show();if(ac<ag){this.overview_box.css("left",Y-(ag-ac)/2)}if(this.overview_highlight){this.overview_highlight.css({left:Y,width:ac})}this.update_location(this.low,this.high);if(!af){for(var aa=0,ab=this.tracks.length;aa<ab;aa++){if(this.tracks[aa]&&this.tracks[aa].enabled){this.tracks[aa].draw()}}for(aa=0,ab=this.label_tracks.length;aa<ab;aa++){this.label_tracks[aa].draw()}}},zoom_in:function(Z,aa){if(this.max_high===0||this.high-this.low<this.min_separation){return}var ab=this.high-this.low,ac=ab/2+this.low,Y=(ab/this.zoom_factor)/2;if(Z){ac=Z/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ac-Y);this.high=Math.round(ac+Y);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var Z=this.high-this.low,aa=Z/2+this.low,Y=(Z*this.zoom_factor)/2;this.low=Math.round(aa-Y);this.high=Math.round(aa+Y);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 o=function(Z,ac){this.track=Z;this.name=ac.name;this.params=[];var ak=ac.params;for(var aa=0;aa<ak.length;aa++){var af=ak[aa],Y=af.name,aj=af.label,ab=unescape(af.html),ah=af.type;if(ah==="number"){this.params[this.params.length]=new g(Y,aj,ab,af.min,af.max)}else{if(ah=="select"){this.params[this.params.length]=new I(Y,aj,ab)}else{console.log("WARNING: unrecognized tool parameter type:",Y,ah)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(am){am.stopPropagation()}).bind("click",function(am){am.stopPropagation()}).bind("dblclick",function(am){am.stopPropagation()});var ai=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var ag=this.params;var ad=this;$.each(this.params,function(an,aq){var ap=$("<div>").addClass("param-row").appendTo(ad.parent_div);var am=$("<div>").addClass("param-label").text(aq.label).appendTo(ap);var ao=$("<div/>").addClass("slider").html(aq.html).appendTo(ap);$("<div style='clear: both;'/>").appendTo(ap)});this.parent_div.find("input").click(function(){$(this).select()});var al=$("<div>").addClass("slider-row").appendTo(this.parent_div);var ae=$("<input type='submit'>").attr("value","Run").appendTo(al);var ad=this;ae.click(function(){ad.run()})};extend(o.prototype,{get_param_values_dict:function(){var Y={};this.parent_div.find(":input").each(function(){var Z=$(this).attr("name"),aa=$(this).val();Y[Z]=JSON.stringify(aa)});return Y},get_param_values:function(){var Z=[];var Y={};this.parent_div.find(":input").each(function(){var aa=$(this).attr("name"),ab=$(this).val();if(aa){Z[Z.length]=ab}});return Z},run:function(){var Z={dataset_id:this.track.original_dataset_id,chrom:this.track.view.chrom,low:this.track.view.low,high:this.track.view.high,tool_id:this.name};$.extend(Z,this.get_param_values_dict());var ab=this.track,aa=Z.tool_id+ab.tool_region_and_parameters_str(Z.chrom,Z.low,Z.high),ac;if(ab.track_type==="FeatureTrack"){ac=new O(aa,view,ab.hda_ldda,undefined,{},{},ab)}this.track.add_track(ac);ac.content_div.text("Starting job.");var Y=function(){$.getJSON(run_tool_url,Z,function(ad){if(ad==="no converter"){ac.container_div.addClass("error");ac.content_div.text(E)}else{if(ad.error){ac.container_div.addClass("error");ac.content_div.text(v+ad.message)}else{if(ad==="pending"){ac.container_div.addClass("pending");ac.content_div.text("Converting input data so that it can be easily reused.");setTimeout(Y,2000)}else{ac.dataset_id=ad.dataset_id;ac.content_div.text("Running job.");ac.init()}}}})};Y()}});var I=function(Z,Y,aa){this.name=Z;this.label=Y;this.html=aa};var g=function(aa,Z,ac,ab,Y){I.call(this,aa,Z,ac);this.min=ab;this.max=Y};var j=function(Z,Y,aa){this.name=Z;this.index=Y;this.value=aa};var P=function(Z,Y){this.name=Z;this.index=Y;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.min=Number.MAX_VALUE;this.max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};extend(P.prototype,{applies_to:function(Y){if(Y.length>this.index){return true}return false},keep:function(Y){if(!this.applies_to(Y)){return true}var Z=parseInt(Y[this.index]);return(isNaN(Z)||(Z>=this.low&&Z<=this.high))},update_attrs:function(Z){var Y=false;if(!this.applies_to(Z)){return Y}if(Z[this.index]<this.min){this.min=Math.floor(Z[this.index]);Y=true}if(Z[this.index]>this.max){this.max=Math.ceil(Z[this.index]);Y=true}return Y},update_ui_elt:function(){var Z=this.slider.slider("option","min"),Y=this.slider.slider("option","max");if(this.min<Z||this.max>Y){this.slider.slider("option","min",this.min);this.slider.slider("option","max",this.max);this.slider.slider("option","step",h(this.min,this.max));this.slider.slider("option","values",[this.min,this.max])}}});var U=function(aa,ag){this.track=aa;this.filters=[];for(var ac=0;ac<ag.length;ac++){var Y=ag[ac];var Z=Y.name,af=Y.type,ad=Y.index;if(af==="int"||af==="float"){this.filters[ac]=new P(Z,ad)}else{this.filters[ac]=new j(Z,ad,af)}}var ae=function(ah,ai,aj){ah.click(function(){var ak=ai.text();max=parseFloat(aj.slider("option","max")),input_size=(max<=1?4:max<=1000000?max.toString().length:6),multi_value=false;if(aj.slider("option","values")){input_size=2*input_size+1;multi_value=true}ai.text("");$("<input type='text'/>").attr("size",input_size).attr("maxlength",input_size).attr("value",ak).appendTo(ai).focus().select().click(function(al){al.stopPropagation()}).blur(function(){$(this).remove();ai.text(ak)}).keyup(function(ap){if(ap.keyCode===27){$(this).trigger("blur")}else{if(ap.keyCode===13){var an=aj.slider("option","min"),al=aj.slider("option","max"),ao=function(aq){return(isNaN(aq)||aq>al||aq<an)},am=$(this).val();if(!multi_value){am=parseFloat(am);if(ao(am)){alert("Parameter value must be in the range ["+an+"-"+al+"]");return $(this)}}else{am=am.split("-");am=[parseFloat(am[0]),parseFloat(am[1])];if(ao(am[0])||ao(am[1])){alert("Parameter value must be in the range ["+an+"-"+al+"]");return $(this)}}aj.slider((multi_value?"values":"value"),am)}}})})};this.parent_div=$("<div/>").addClass("filters").hide();this.parent_div.bind("drag",function(ah){ah.stopPropagation()}).bind("click",function(ah){ah.stopPropagation()}).bind("dblclick",function(ah){ah.stopPropagation()});var ab=this;$.each(this.filters,function(an,ai){var ak=$("<div/>").addClass("slider-row").appendTo(ab.parent_div);var ah=$("<div/>").addClass("slider-label").appendTo(ak);var ap=$("<span/>").addClass("slider-name").text(ai.name+" ").appendTo(ah);var aj=$("<span/>");var al=$("<span/>").addClass("slider-value").appendTo(ah).append("[").append(aj).append("]");var ao=$("<div/>").addClass("slider").appendTo(ak);ai.control_element=$("<div/>").attr("id",ai.name+"-filter-control").appendTo(ao);var am=[0,0];ai.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(aq,ar){am=ar.values;aj.text(ar.values[0]+"-"+ar.values[1]);setTimeout(function(){if(ar.values[0]==am[0]&&ar.values[1]==am[1]){var at=ar.values;aj.text(at[0]+"-"+at[1]);ai.low=at[0];ai.high=at[1];ab.track.draw(true,true)}},50)},change:function(aq,ar){ai.control_element.slider("option","slide").call(ai.control_element,aq,ar)}});ai.slider=ai.control_element;ai.slider_label=aj;ae(al,aj,ai.control_element);$("<div style='clear: both;'/>").appendTo(ak)})};var T=function(Y){this.track=Y.track;this.params=Y.params;this.values={};if(Y.saved_values){this.restore_values(Y.saved_values)}this.onchange=Y.onchange};extend(T.prototype,{restore_values:function(Y){var Z=this;$.each(this.params,function(aa,ab){if(Y[ab.key]!==undefined){Z.values[ab.key]=Y[ab.key]}else{Z.values[ab.key]=ab.default_value}})},build_form:function(){var Z=this;var Y=$("<div />");$.each(this.params,function(ad,ab){if(!ab.hidden){var aa="param_"+ad;var ai=$("<div class='form-row' />").appendTo(Y);ai.append($("<label />").attr("for",aa).text(ab.label+":"));if(ab.type==="bool"){ai.append($('<input type="checkbox" />').attr("id",aa).attr("name",aa).attr("checked",Z.values[ab.key]))}else{if(ab.type==="color"){var af=Z.values[ab.key];var ae=$("<input />").attr("id",aa).attr("name",aa).val(af);var ag=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var ac=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(ag);var ah=$("<div/>").appendTo(ac).farbtastic({width:100,height:100,callback:ae,color:af});$("<div />").append(ae).append(ag).appendTo(ai).bind("click",function(aj){ag.css({left:$(this).position().left+($(ae).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){ag.hide();$(document).unbind("click.color-picker")});aj.stopPropagation()})}else{ai.append($("<input />").attr("id",aa).attr("name",aa).val(Z.values[ab.key]))}}}});return Y},update_from_form:function(Y){var aa=this;var Z=false;$.each(this.params,function(ab,ad){if(!ad.hidden){var ae="param_"+ab;var ac=Y.find("#"+ae).val();if(ad.type==="float"){ac=parseFloat(ac)}else{if(ad.type==="int"){ac=parseInt(ac)}else{if(ad.type==="bool"){ac=Y.find("#"+ae).is(":checked")}}}if(ac!==aa.values[ad.key]){aa.values[ad.key]=ac;Z=true}}});if(Z){this.onchange()}}});var b=function(aa,Z,Y){this.index=aa;this.resolution=Z;this.canvas=$("<div class='track-tile'/>").append(Y)};var m=function(aa,Z,Y,ab){b.call(this,aa,Z,Y);this.max_val=ab};var J=function(aa,Z,Y){b.call(this,aa,Z,Y)};var k=function(Z,Y,ac,aa,ab){this.name=Z;this.view=Y;this.parent_element=ac;this.data_url=(aa?aa:default_data_url);this.data_url_extra_params={};this.data_query_wait=(ab?ab:F);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(k.prototype,{init:function(){var Y=this;Y.enabled=false;Y.tile_cache.clear();Y.data_cache.clear();Y.initial_canvas=undefined;Y.content_div.css("height","auto");Y.container_div.removeClass("nodata error pending");if(!Y.dataset_id){return}$.getJSON(converted_datasets_state_url,{hda_ldda:Y.hda_ldda,dataset_id:Y.dataset_id,chrom:Y.view.chrom},function(Z){if(!Z||Z==="error"||Z.kind==="error"){Y.container_div.addClass("error");Y.content_div.text(n);if(Z.message){var ab=Y.view.tracks.indexOf(Y);var aa=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+Z.message+"</pre>",{Close:hide_modal})});Y.content_div.append(aa)}}else{if(Z==="no converter"){Y.container_div.addClass("error");Y.content_div.text(E)}else{if(Z==="no data"||(Z.data!==undefined&&(Z.data===null||Z.data.length===0))){Y.container_div.addClass("nodata");Y.content_div.text(A)}else{if(Z==="pending"){Y.container_div.addClass("pending");Y.content_div.text(q);setTimeout(function(){Y.init()},Y.data_query_wait)}else{if(Z.status==="data"){if(Z.valid_chroms){Y.valid_chroms=Z.valid_chroms;Y.make_name_popup_menu()}Y.content_div.text(S);if(Y.view.chrom){Y.content_div.text("");Y.content_div.css("height",Y.height_px+"px");Y.enabled=true;$.when(Y.predraw_init()).done(function(){Y.container_div.removeClass("nodata error pending");Y.draw()})}}}}}}})},predraw_init:function(){},update_name:function(Y){this.old_name=this.name;this.name=Y;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var H=function(ag,ae,ah){var Z=this,ai=Z.view;this.filters_manager=(ag!==undefined?new U(this,ag):undefined);this.filters_available=false;this.filters_visible=false;this.tool=(ae!==undefined&&obj_length(ae)>0?new o(this,ae):undefined);this.parent_track=ah;this.child_tracks=[];if(Z.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}Z.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();Z.container_div.append(Z.child_tracks_container);if(this.filters_manager){this.filters_div=this.filters_manager.parent_div;this.header_div.after(this.filters_div)}if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}if(Z.display_modes!==undefined){if(Z.mode_div===undefined){Z.mode_div=$("<div class='right-float menubutton popup' />").appendTo(Z.header_div);var ab=(Z.track_config&&Z.track_config.values.mode?Z.track_config.values.mode:Z.display_modes[0]);Z.mode=ab;Z.mode_div.text(ab);var aa=function(aj){Z.mode_div.text(aj);Z.mode=aj;Z.track_config.values.mode=aj;Z.tile_cache.clear();Z.draw()};var Y={};for(var ac=0,af=Z.display_modes.length;ac<af;ac++){var ad=Z.display_modes[ac];Y[ad]=function(aj){return function(){aa(aj)}}(ad)}make_popupmenu(Z.mode_div,Y)}else{Z.mode_div.hide()}}this.make_name_popup_menu()};extend(H.prototype,k.prototype,{make_name_popup_menu:function(){var Z=this;var Y={};Y["Edit configuration"]=function(){var af=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ad=function(){Z.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ae=function(ag){if((ag.keyCode||ag.which)===27){af()}else{if((ag.keyCode||ag.which)===13){ad()}}};$(window).bind("keypress.check_enter_esc",ae);show_modal("Configure Track",Z.track_config.build_form(),{Cancel:af,OK:ad})};if(Z.filters_available>0){var ac=(Z.filters_div.is(":visible")?"Hide filters":"Show filters");Y[ac]=function(){Z.filters_visible=(Z.filters_div.is(":visible"));Z.filters_div.toggle();Z.make_name_popup_menu()}}if(Z.tool){var ac=(Z.dynamic_tool_div.is(":visible")?"Hide tool":"Show tool");Y[ac]=function(){if(!Z.dynamic_tool_div.is(":visible")){Z.update_name(Z.name+Z.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";Z.revert_name()}Z.dynamic_tool_div.toggle();Z.make_name_popup_menu()}}if(Z.valid_chroms){Y["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+Z.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var aa=view;var ab=function(){$("#no-tracks").show()};if(this.parent_track){aa=this.parent_track;ab=function(){}}Y.Remove=function(){aa.remove_track(Z);if(aa.num_tracks===0){ab()}};make_popupmenu(Z.name_div,Y)},draw:function(Y,aa){var ar=this.view.low,ae=this.view.high,ag=ae-ar,ai=this.view.container.width(),ac=ai/ag,aj=this.view.resolution,ab=$("<div style='position: relative;'></div>"),ak=function(au,av,at){return au+"_"+av+"_"+at};if(!aa){this.content_div.children().remove()}this.content_div.append(ab);this.max_height=0;var am=Math.floor(ar/aj/K);var ad=[];var an=0;while((am*K*aj)<ae){var aq=ak(ai,ac,am);var af=this.tile_cache.get(aq);var ao=am*K*this.view.resolution;var Z=ao+K*this.view.resolution;if(!Y&&af){ad[ad.length]=af;this.show_tile(af,ab,ao,ac)}else{this.delayed_draw(Y,aq,am,aj,ab,ac,ad)}am+=1;an++}var ah=this;var ap=setInterval(function(){if(ad.length===an){clearInterval(ap);if(aa){var aw=ah.content_div.children();var ax=false;for(var av=aw.length-1,aB=0;av>=aB;av--){var au=$(aw[av]);if(ax){au.remove()}else{if(au.children().length!==0){ax=true}}}}if(ah.track_type=="FeatureTrack"&&ah.mode=="Histogram"){var aA=-1;for(var av=0;av<ad.length;av++){var aD=ad[av].max_val;if(aD>aA){aA=aD}}for(var av=0;av<ad.length;av++){if(ad[av].max_val!==aA){var aC=ad[av];aC.canvas.remove();ah.delayed_draw(true,ak(ai,ac,aC.index),aC.index,aC.resolution,ab,ac,[],{max:aA})}}}if(ah.filters_manager){var at=ah.filters_manager.filters;for(var az=0;az<at.length;az++){at[az].update_ui_elt()}var ay=false;if(ah.example_feature){for(var az=0;az<at.length;az++){if(at[az].applies_to(ah.example_feature)){ay=true;break}}}if(ah.filters_available!==ay){ah.filters_available=ay;if(!ah.filters_available){ah.filters_div.hide()}ah.make_name_popup_menu()}}}},50);for(var al=0;al<this.child_tracks.length;al++){this.child_tracks[al].draw(Y,aa)}},delayed_draw:function(Z,ag,aa,ac,ah,ak,ai,ad){var ab=this,ae=aa*K*ac,aj=ae+K*ac;var af=function(at,al,an,am,aq,ar,ao){var ap=ab.draw_tile(al,an,am,ar,ao);ab.tile_cache.set(ag,ap);ab.show_tile(ap,aq,ae,ar);ai[ai.length]=ap};var Y=setTimeout(function(){if(ae<=ab.view.high&&aj>=ab.view.low){var al=(Z?undefined:ab.tile_cache.get(ag));if(al){ab.show_tile(al,ah,ae,ak);ai[ai.length]=al}else{$.when(ab.data_cache.get_data(view.chrom,ae,aj,ab.mode,ac,ab.data_url_extra_params)).then(function(am){extend(am,ad);if(view.reference_track&&ak>view.canvas_manager.char_width_px){$.when(view.reference_track.data_cache.get_data(view.chrom,ae,aj,ab.mode,ac,view.reference_track.data_url_extra_params)).then(function(an){af(Y,am,ac,aa,ah,ak,an)})}else{af(Y,am,ac,aa,ah,ak)}})}}},50)},show_tile:function(ab,ae,ac,af){var Z=this;var aa=this.view.high-this.view.low,ad=(ac-this.view.low)*af;if(this.left_offset){ad-=this.left_offset}var Y=ab.canvas;Y.css({position:"absolute",top:0,left:ad,height:""});ae.append(Y);Z.max_height=Math.max(Z.max_height,Y.height());Z.content_div.css("height",Z.max_height+"px");ae.children().css("height",Z.max_height+"px")},set_overview:function(){var Y=this.view;if(this.initial_canvas&&this.is_overview){Y.overview_close.show();Y.overview_viewport.append(this.initial_canvas);Y.overview_highlight.show().height(this.initial_canvas.height());Y.overview_viewport.height(this.initial_canvas.height()+Y.overview_box.height())}$(window).trigger("resize")},tool_region_and_parameters_str:function(aa,Y,ab){var Z=this,ac=(aa!==undefined&&Y!==undefined&&ab!==undefined?aa+":"+Y+"-"+ab:"all");return" - region=["+ac+"], parameters=["+Z.tool.get_param_values().join(", ")+"]"},add_track:function(Y){Y.track_id=this.track_id+"_"+this.child_tracks.length;Y.container_div.attr("id","track_"+Y.track_id);this.child_tracks_container.append(Y.container_div);B(Y.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(Y);this.view.has_changes=true},remove_track:function(Y){Y.container_div.fadeOut("slow",function(){$(this).remove()})}});var V=function(Y,Z){this.track_type="LabelTrack";this.hidden=true;k.call(this,null,Y,Z);this.container_div.addClass("label-track")};extend(V.prototype,k.prototype,{draw:function(){var aa=this.view,ab=aa.high-aa.low,ae=Math.floor(Math.pow(10,Math.floor(Math.log(ab)/Math.log(10)))),Y=Math.floor(aa.low/ae)*ae,ac=this.view.container.width(),Z=$("<div style='position: relative; height: 1.3em;'></div>");while(Y<aa.high){var ad=(Y-aa.low)/ab*ac;Z.append($("<div class='label'>"+commatize(Y)+"</div>").css({position:"absolute",left:ad-1}));Y+=ae}this.content_div.children(":first").remove();this.content_div.append(Z)}});var x=function(Y){this.track_type="ReferenceTrack";this.hidden=true;k.call(this,null,Y,Y.top_labeltrack);H.call(this);Y.reference_track=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_url=reference_url;this.data_url_extra_params={dbkey:Y.dbkey};this.data_cache=new L(y,this,false);this.tile_cache=new c(r)};extend(x.prototype,H.prototype,{draw_tile:function(ag,ad,Z,ai){var ac=this,aa=K*ad;if(ai>this.view.canvas_manager.char_width_px){if(ag===null){ac.content_div.css("height","0px");return}var ab=this.view.canvas_manager.new_canvas();var ah=ab.getContext("2d");ab.width=Math.ceil(aa*ai+ac.left_offset);ab.height=ac.height_px;ah.font=ah.canvas.manager.default_font;ah.textAlign="center";for(var ae=0,af=ag.length;ae<af;ae++){var Y=Math.round(ae*ai);ah.fillText(ag[ae],Y+ac.left_offset,10)}return new b(Z,ad,ab)}this.content_div.css("height","0px")}});var l=function(ac,aa,ad,Y,ab){var Z=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";k.call(this,ac,aa,aa.viewport_container);H.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=ad;this.dataset_id=Y;this.original_dataset_id=Y;this.data_cache=new L(y,this);this.tile_cache=new c(r);this.track_config=new T({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:ab,onchange:function(){Z.vertical_range=Z.prefs.max_value-Z.prefs.min_value;$("#linetrack_"+Z.track_id+"_minval").text(Z.prefs.min_value);$("#linetrack_"+Z.track_id+"_maxval").text(Z.prefs.max_value);Z.tile_cache.clear();Z.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;this.add_resize_handle()};extend(l.prototype,H.prototype,{add_resize_handle:function(){var Y=this;var ab=false;var aa=false;var Z=$("<div class='track-resize'>");$(Y.container_div).hover(function(){ab=true;Z.show()},function(){ab=false;if(!aa){Z.hide()}});Z.hide().bind("dragstart",function(ac,ad){aa=true;ad.original_height=$(Y.content_div).height()}).bind("drag",function(ad,ae){var ac=Math.min(Math.max(ae.original_height+ae.deltaY,Y.min_height_px),Y.max_height_px);$(Y.content_div).css("height",ac);Y.height_px=ac;Y.draw(true)}).bind("dragend",function(ac,ad){Y.tile_cache.clear();aa=false;if(!ab){Z.hide()}Y.track_config.values.height=Y.height_px}).appendTo(Y.container_div)},predraw_init:function(){var Y=this,Z=Y.view.tracks.indexOf(Y);Y.vertical_range=undefined;return $.getJSON(Y.data_url,{stats:true,chrom:Y.view.chrom,low:null,high:null,hda_ldda:Y.hda_ldda,dataset_id:Y.dataset_id},function(aa){Y.container_div.addClass("line-track");var ac=aa.data;if(isNaN(parseFloat(Y.prefs.min_value))||isNaN(parseFloat(Y.prefs.max_value))){Y.prefs.min_value=ac.min;Y.prefs.max_value=ac.max;$("#track_"+Z+"_minval").val(Y.prefs.min_value);$("#track_"+Z+"_maxval").val(Y.prefs.max_value)}Y.vertical_range=Y.prefs.max_value-Y.prefs.min_value;Y.total_frequency=ac.total_frequency;Y.container_div.find(".yaxislabel").remove();var ad=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+Z+"_minval").text(u(Y.prefs.min_value));var ab=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+Z+"_maxval").text(u(Y.prefs.max_value));ab.css({position:"absolute",top:"24px",left:"10px"});ab.prependTo(Y.container_div);ad.css({position:"absolute",bottom:"2px",left:"10px"});ad.prependTo(Y.container_div)})},draw_tile:function(ai,ac,Z,ah){if(this.vertical_range===undefined){return}var ad=Z*K*ac,ab=K*ac,Y=Math.ceil(ab*ah),af=this.height_px;var aa=this.view.canvas_manager.new_canvas();aa.width=Y,aa.height=af;var ag=aa.getContext("2d");var ae=new G.LinePainter(ai.data,ad,ad+ab,this.prefs,this.mode);ae.draw(ag,Y,af);return new b(ab,ac,aa)}});var e=function(Y,ad,ac,ag,af,aa,ab,ae){var Z=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Histogram","Dense","Squish","Pack"];this.track_config=new T({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:af,onchange:function(){Z.tile_cache.clear();Z.draw()}});this.prefs=this.track_config.values;k.call(this,Y,ad,ad.viewport_container);H.call(this,aa,ab,ae);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=ac;this.dataset_id=ag;this.original_dataset_id=ag;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.inc_slots={};this.start_end_dct={};this.tile_cache=new c(d);this.data_cache=new L(20,this);this.left_offset=200;this.painter=G.LinkedFeaturePainter};extend(e.prototype,H.prototype,{update_auto_mode:function(Y){if(this.mode=="Auto"){if(Y=="no_detail"){Y="feature spans"}else{if(Y=="summary_tree"){Y="coverage histogram"}}this.mode_div.text("Auto ("+Y+")")}},incremental_slots:function(ac,Z,ab){var aa=this.view.canvas_manager.dummy_context,Y=this.inc_slots[ac];if(!Y||(Y.mode!==ab)){Y=new (p.FeatureSlotter)(ac,ab==="Pack",w,function(ad){return aa.measureText(ad)});Y.mode=ab;this.inc_slots[ac]=Y}return Y.slot_features(Z)},get_summary_tree_data:function(ac,af,aa,an){if(an>aa-af){an=aa-af}var aj=Math.floor((aa-af)/an),am=[],ab=0;var ad=0,ae=0,ai,al=0,ag=[],ak,ah;var Z=function(aq,ap,ar,ao){aq[0]=ap+ar*ao;aq[1]=ap+(ar+1)*ao};while(al<an&&ad!==ac.length){var Y=false;for(;al<an&&!Y;al++){Z(ag,af,al,aj);for(ae=ad;ae<ac.length;ae++){ai=ac[ae].slice(1,3);if(is_overlap(ai,ag)){Y=true;break}}if(Y){break}}data_start_index=ae;am[am.length]=ak=[ag[0],0];for(;ae<ac.length;ae++){ai=ac[ae].slice(1,3);if(is_overlap(ai,ag)){ak[1]++}else{break}}if(ak[1]>ab){ab=ak[1]}al++}return{max:ab,delta:aj,data:am}},draw_tile:function(al,au,ay,ah,ab){var aq=this,aA=ay*K*au,Z=(ay+1)*K*au,an=Z-aA,ar=Math.ceil(an*ah),ap=this.mode,aE=25,ac=this.left_offset,am,ad;if(ap==="Auto"){if(al.dataset_type==="summary_tree"){ap=al.dataset_type}else{if(al.extra_info==="no_detail"){ap="no_detail"}else{var aD=al.data;if(this.view.high-this.view.low>D){ap="Squish"}else{ap="Pack"}}}this.update_auto_mode(ap)}if(ap==="summary_tree"||ap==="Histogram"){ad=this.summary_draw_height;this.container_div.find(".yaxislabel").remove();var Y=$("<div />").addClass("yaxislabel");Y.text(al.max);Y.css({position:"absolute",top:"22px",left:"10px"});Y.prependTo(this.container_div);var aa=this.view.canvas_manager.new_canvas();aa.width=ar+ac;aa.height=ad+M;if(al.dataset_type!="summary_tree"){var ai=this.get_summary_tree_data(al.data,aA,Z,200);if(al.max){ai.max=al.max}al=ai}var aB=new G.SummaryTreePainter(al,aA,Z,this.prefs);var at=aa.getContext("2d");at.translate(ac,M);aB.draw(at,ar,ad);return new m(ay,au,aa,al.max)}var am,af=1;if(ap==="no_detail"||ap==="Squish"||ap==="Pack"){af=this.incremental_slots(ah,al.data,ap);am=this.inc_slots[ah].slots}var ag=[];if(al.data){var aj=this.filters_manager.filters;for(var av=0,ax=al.data.length;av<ax;av++){var ae=al.data[av];var aw=false;var ak;for(var az=0,aC=aj.length;az<aC;az++){ak=aj[az];ak.update_attrs(ae);if(!ak.keep(ae)){aw=true;break}}if(!aw){ag.push(ae)}}}var aB=new (this.painter)(ag,aA,Z,this.prefs,ap,ab);var ad=aB.get_required_height(af)+z;var aa=this.view.canvas_manager.new_canvas();aa.width=ar+ac;aa.height=ad;var at=aa.getContext("2d");at.fillStyle=this.prefs.block_color;at.font=at.canvas.manager.default_font;at.textAlign="right";this.container_div.find(".yaxislabel").remove();if(al.message){$(aa).css({"border-top":"1px solid red"});at.fillStyle="red";at.textAlign="left";var ao=at.textBaseline;at.textBaseline="top";at.fillText(al.message,ac,0);at.textBaseline=ao;if(!al.data){return new b(ay,au,aa,ad)}}this.example_feature=(al.data.length?al.data[0]:undefined);at.translate(ac,z);aB.draw(at,ar,ad,am);return new J(ay,au,aa)}});var N=function(ab,Z,ad,Y,aa,ac){e.call(this,ab,Z,ad,Y,aa,ac);this.track_type="VcfTrack";this.painter=G.VariantPainter};extend(N.prototype,H.prototype,e.prototype);var Q=function(ab,Z,ad,Y,aa,ac){e.call(this,ab,Z,ad,Y,aa,ac);this.track_config=new T({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_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:aa,onchange:function(){this.track.tile_cache.clear();this.track.draw()}});this.prefs=this.track_config.values;this.track_type="ReadTrack";this.painter=G.ReadPainter;this.make_name_popup_menu()};extend(Q.prototype,H.prototype,e.prototype);var O=function(ac,aa,ae,Y,ab,ad,Z){e.call(this,ac,aa,ae,Y,ab,ad,{},Z);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};extend(O.prototype,H.prototype,e.prototype,{predraw_init:function(){var Z=this;var Y=function(){if(Z.data_cache.size()===0){setTimeout(Y,300)}else{Z.data_url=default_data_url;Z.data_query_wait=F;Z.dataset_state_url=converted_datasets_state_url;$.getJSON(Z.dataset_state_url,{dataset_id:Z.dataset_id,hda_ldda:Z.hda_ldda},function(aa){})}};Y()}});R.View=W;R.LineTrack=l;R.FeatureTrack=e;R.ReadTrack=Q};var slotting_module=function(c,b){var d=2,a=5;b.FeatureSlotter=function(h,g,e,f){this.slots={};this.start_end_dct={};this.w_scale=h;this.include_label=g;this.max_rows=e;this.measureText=f};extend(b.FeatureSlotter.prototype,{slot_features:function(l){var o=this.w_scale,r=this.slots,g=this.start_end_dct,x=[],z=[],m=0,y=this.max_rows;for(var v=0,w=l.length;v<w;v++){var k=l[v],n=k[0];if(r[n]!==undefined){m=Math.max(m,r[n]);z.push(r[n])}else{x.push(v)}}var p=function(F,G){for(var E=0;E<=y;E++){var C=false,H=g[E];if(H!==undefined){for(var B=0,D=H.length;B<D;B++){var A=H[B];if(G>A[0]&&F<A[1]){C=true;break}}}if(!C){return E}}return -1};for(var v=0,w=x.length;v<w;v++){var k=l[x[v]],n=k[0],t=k[1],e=k[2],q=k[3],f=Math.floor(t*o),j=Math.ceil(e*o),u=this.measureText(q).width,h;if(q!==undefined&&this.include_label){u+=(d+a);if(f-u>=0){f-=u;h="left"}else{j+=u;h="right"}}var s=p(f,j);if(s>=0){if(g[s]===undefined){g[s]=[]}g[s].push([f,j]);r[n]=s;m=Math.max(m,s)}else{}}return m+1}})};var painters_module=function(j,v){var o=function(G,y,E,x,D,B){if(B===undefined){B=4}var A=x-y;var z=D-E;var C=Math.floor(Math.sqrt(A*A+z*z)/B);var H=A/C;var F=z/C;var w;for(w=0;w<C;w++,y+=H,E+=F){if(w%2!==0){continue}G.fillRect(y,E,B,1)}};var p=function(z,x,w,C){var B=x-C/2,A=x+C/2,D=w-Math.sqrt(C*3/2);z.beginPath();z.moveTo(B,D);z.lineTo(A,D);z.lineTo(x,w);z.lineTo(B,D);z.strokeStyle=this.fillStyle;z.fill();z.stroke();z.closePath()};var l=function(y,A,w,x,z){this.data=y;this.view_start=A;this.view_end=w;this.prefs=extend({},this.default_prefs,x);this.mode=z};l.prototype.default_prefs={};var t=function(y,A,w,x,z){l.call(this,y,A,w,x,z)};t.prototype.default_prefs={show_counts:false};t.prototype.draw=function(L,w,K){var D=this.view_start,N=this.view_end-this.view_start,M=w/N;var I=this.data.data,H=this.data.delta,F=this.data.max,A=K;delta_x_px=Math.ceil(H*M);L.save();for(var B=0,C=I.length;B<C;B++){var G=Math.floor((I[B][0]-D)*M);var E=I[B][1];if(!E){continue}var J=E/F*K;if(E!==0&&J<1){J=1}L.fillStyle="black";L.fillRect(G,A-J,delta_x_px,J);var z=4;if(this.prefs.show_counts&&(L.measureText(E).width+z)<delta_x_px){L.fillStyle="#666";L.textAlign="center";L.fillText(E,G+(delta_x_px/2),10)}}L.restore()};var c=function(y,A,w,x,z){l.call(this,y,A,w,x,z)};c.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};c.prototype.draw=function(M,L,J){var E=false,F=this.prefs.min_value,C=this.prefs.max_value,I=C-F,x=J,z=this.view_start,K=this.view_end-this.view_start,A=L/K,G=this.mode,Q=this.data;M.save();var R=Math.round(J+F/I*J);if(G!=="Intensity"){M.fillStyle="#aaa";M.fillRect(0,R,L,1)}M.beginPath();M.fillStyle=this.prefs.color;var P,D,B;if(Q.length>1){B=Math.ceil((Q[1][0]-Q[0][0])*A)}else{B=10}for(var N=0,O=Q.length;N<O;N++){P=Math.round((Q[N][0]-z)*A);D=Q[N][1];if(D===null){if(E&&G==="Filled"){M.lineTo(P,x)}E=false;continue}if(D<F){D=F}else{if(D>C){D=C}}if(G==="Histogram"){D=Math.round(D/I*x);M.fillRect(P,R,B,-D)}else{if(G==="Intensity"){D=255-Math.floor((D-F)/I*255);M.fillStyle="rgb("+D+","+D+","+D+")";M.fillRect(P,0,B,x)}else{D=Math.round(x-(D-F)/I*x);if(E){M.lineTo(P,D)}else{E=true;if(G==="Filled"){M.moveTo(P,x);M.lineTo(P,D)}else{M.moveTo(P,D)}}}}}if(G==="Filled"){if(E){M.lineTo(P,R);M.lineTo(0,R)}M.fill()}else{M.stroke()}var w=-1,H=-1;M.fillStyle=this.prefs.overflow_color;for(var N=0,O=Q.length;N<O;N++){D=Q[N][1];P=Math.round((Q[N][0]-z)*A);x_minus_scaled=Math.round((Q[N][0]-1-z)*A);if(H>=0&&(D===null||D<C)){M.fillRect(H,0,x_minus_scaled-H+1,2);H=-1}else{if(w>=0&&(D===null||D>F)){M.fillRect(w,J-2,x_minus_scaled-w+1,2);w=-1}}if(D!==null&&D>C&&H<0){H=P}else{if(D!==null&&D<F&&w<0){w=P}}}M.restore()};var n=function(y,A,w,x,z){l.call(this,y,A,w,x,z)};n.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};extend(n.prototype,{get_required_height:function(x){var w=y_scale=this.get_row_height(),y=this.mode;if(y==="no_detail"||y==="Squish"||y==="Pack"){w=x*y_scale}return w+Math.max(Math.round(y_scale/2),5)},draw:function(I,z,H,E){var C=this.data,F=this.view_start,J=this.view_end;I.save();I.fillStyle=this.prefs.block_color;I.textAlign="right";var M=this.view_end-this.view_start,L=z/M,y=this.get_row_height();for(var B=0,D=C.length;B<D;B++){var K=C[B],A=K[0],w=K[1],x=K[2],G=(E&&E[A]!==undefined?E[A]:null);if((w<J&&x>F)&&(this.mode=="Dense"||G!==null)){this.draw_element(I,this.mode,K,G,F,J,L,y,z)}}I.restore()}});var d=10,h=3,k=5,u=10,f=1,r=3,e=3,a=9,m=2,g="#ccc";var q=function(y,A,w,x,z){n.call(this,y,A,w,x,z)};extend(q.prototype,n.prototype,{get_row_height:function(){var x=this.mode,w;if(x==="Dense"){w=d}else{if(x==="no_detail"){w=h}else{if(x==="Squish"){w=k}else{w=u}}}return w},draw_element:function(I,B,Q,D,K,aa,ae,af,w){var N=Q[0],ac=Q[1],U=Q[2],L=Q[3],V=Math.floor(Math.max(0,(ac-K)*ae)),J=Math.ceil(Math.min(w,Math.max(0,(U-K)*ae))),T=(B==="Dense"?0:(0+D))*af,H,Y,M=null,ag=null,z=this.prefs.block_color,X=this.prefs.label_color;if(B=="Dense"){D=1}if(B==="no_detail"){I.fillStyle=z;I.fillRect(V,T+5,J-V,f)}else{var G=Q[4],S=Q[5],W=Q[6],A=Q[7];if(S&&W){M=Math.floor(Math.max(0,(S-K)*ae));ag=Math.ceil(Math.min(w,Math.max(0,(W-K)*ae)))}var ad,O;if(B==="Squish"||B==="Dense"){ad=1;O=e}else{ad=5;O=a}if(!A){if(Q.strand){if(Q.strand==="+"){I.fillStyle=I.canvas.manager.get_pattern("right_strand_inv")}else{if(Q.strand==="-"){I.fillStyle=I.canvas.manager.get_pattern("left_strand_inv")}}}else{I.fillStyle=z}I.fillRect(V,T,J-V,O)}else{var F,P;if(B==="Squish"||B==="Dense"){I.fillStyle=g;F=T+Math.floor(e/2)+1;P=1}else{if(G){var F=T;var P=O;if(G==="+"){I.fillStyle=I.canvas.manager.get_pattern("right_strand")}else{if(G==="-"){I.fillStyle=I.canvas.manager.get_pattern("left_strand")}}}else{I.fillStyle=g;F+=(e/2)+1;P=1}}I.fillRect(V,F,J-V,P);for(var ab=0,y=A.length;ab<y;ab++){var C=A[ab],x=Math.floor(Math.max(0,(C[0]-K)*ae)),R=Math.ceil(Math.min(w,Math.max((C[1]-K)*ae)));if(x>R){continue}I.fillStyle=z;I.fillRect(x,T+(O-ad)/2+1,R-x,ad);if(M!==undefined&&W>S&&!(x>ag||R<M)){var Z=Math.max(x,M),E=Math.min(R,ag);I.fillRect(Z,T+1,E-Z,O);if(A.length==1&&B=="Pack"){if(G==="+"){I.fillStyle=I.canvas.manager.get_pattern("right_strand_inv")}else{if(G==="-"){I.fillStyle=I.canvas.manager.get_pattern("left_strand_inv")}}if(Z+14<E){Z+=2;E-=2}I.fillRect(Z,T+1,E-Z,O)}}}}if(B==="Pack"&&ac>K){I.fillStyle=X;if(K===0&&V-I.measureText(L).width<0){I.textAlign="left";I.fillText(L,J+m,T+8)}else{I.textAlign="right";I.fillText(L,V-m,T+8)}I.fillStyle=z}}}});var b=function(y,A,w,x,z){n.call(this,y,A,w,x,z)};extend(b.prototype,n.prototype,{draw_element:function(P,K,E,A,S,y,H,Q,N){var E=data[i],G=E[0],O=E[1],z=E[2],J=E[3],C=Math.floor(Math.max(0,(O-S)*H)),F=Math.ceil(Math.min(N,Math.max(0,(z-S)*H))),B=(K==="Dense"?0:(0+A))*Q,w,T,x=null,I=null;if(no_label){P.fillStyle=block_color;P.fillRect(C+left_offset,B+5,F-C,1)}else{var R=E[4],M=E[5],D=E[6];w=9;T=1;P.fillRect(C+left_offset,B,F-C,w);if(K!=="Dense"&&J!==undefined&&O>S){P.fillStyle=label_color;if(S===0&&C-P.measureText(J).width<0){P.textAlign="left";P.fillText(J,F+2+left_offset,B+8)}else{P.textAlign="right";P.fillText(J,C-2+left_offset,B+8)}P.fillStyle=block_color}var L=R+" / "+M;if(O>S&&P.measureText(L).width<(F-C)){P.fillStyle="white";P.textAlign="center";P.fillText(L,left_offset+C+(F-C)/2,B+8);P.fillStyle=block_color}}}});var s=function(z,B,w,y,A,x){n.call(this,z,B,w,y,A);this.ref_seq=x};s.prototype.default_prefs=extend({},n.prototype.default_prefs,{show_insertions:false});extend(s.prototype,n.prototype,{get_row_height:function(){var w,x=this.mode;if(x==="Dense"){w=d}else{if(x==="Squish"){w=k}else{w=u;if(this.prefs.show_insertions){w*=2}}}return w},draw_read:function(S,N,J,X,y,R,G,D,C){S.textAlign="center";var Q=this,x=[X,y],M=0,T=0,P=0;ref_seq=this.ref_seq,char_width_px=S.canvas.manager.char_width_px;var ac=[];if((N==="Pack"||this.mode==="Auto")&&D!==undefined&&J>char_width_px){P=Math.round(J/2)}if(!G){G=[[0,D.length]]}for(var K=0,V=G.length;K<V;K++){var H=G[K],z="MIDNSHP=X"[H[0]],L=H[1];if(z==="H"||z==="S"){M-=L}var E=R+M,ab=Math.floor(Math.max(0,(E-X)*J)),F=Math.floor(Math.max(0,(E+L-X)*J));if(ab===F){F+=1}switch(z){case"H":break;case"S":case"M":case"=":if(is_overlap([E,E+L],x)){var O=D.slice(T,T+L);if(P>0){S.fillStyle=this.prefs.block_color;S.fillRect(ab-P,C+1,F-ab,9);S.fillStyle=g;for(var Z=0,w=O.length;Z<w;Z++){if(this.prefs.show_differences&&ref_seq){var I=ref_seq[E-X+Z];if(!I||I.toLowerCase()===O[Z].toLowerCase()){continue}}if(E+Z>=X&&E+Z<=y){var aa=Math.floor(Math.max(0,(E+Z-X)*J));S.fillText(O[Z],aa,C+9)}}}else{S.fillStyle=this.prefs.block_color;S.fillRect(ab,C+4,F-ab,e)}}T+=L;M+=L;break;case"N":S.fillStyle=g;S.fillRect(ab-P,C+5,F-ab,1);M+=L;break;case"D":S.fillStyle="red";S.fillRect(ab-P,C+4,F-ab,3);M+=L;break;case"P":break;case"I":var W=ab-P;if(is_overlap([E,E+L],x)){var O=D.slice(T,T+L);if(this.prefs.show_insertions){var B=ab-(F-ab)/2;if((N==="Pack"||this.mode==="Auto")&&D!==undefined&&J>char_width_px){S.fillStyle="yellow";S.fillRect(B-P,C-9,F-ab,9);ac[ac.length]={type:"triangle",data:[W,C+4,5]};S.fillStyle=g;switch(seq_tile_overlap){case (OVERLAP_START):O=O.slice(X-E);break;case (OVERLAP_END):O=O.slice(0,E-y);break;case (CONTAINED_BY):break;case (CONTAINS):O=O.slice(X-E,E-y);break}for(var Z=0,w=O.length;Z<w;Z++){var aa=Math.floor(Math.max(0,(E+Z-X)*J));S.fillText(O[Z],aa-(F-ab)/2,C)}}else{S.fillStyle="yellow";S.fillRect(B,C+(this.mode!=="Dense"?2:5),F-ab,(N!=="Dense"?e:r))}}else{if((N==="Pack"||this.mode==="Auto")&&D!==undefined&&J>char_width_px){ac[ac.length]={type:"text",data:[O.length,W,C+9]}}else{}}}T+=L;break;case"X":T+=L;break}}S.fillStyle="yellow";var Y,A,ad;for(var U=0;U<ac.length;U++){Y=ac[U];A=Y.type;ad=Y.data;if(A==="text"){S.save();S.font="bold "+S.font;S.fillText(ad[0],ad[1],ad[2]);S.restore()}else{if(A=="triangle"){p(S,ad[0],ad[1],ad[2])}}}},draw_element:function(P,K,C,z,S,x,G,Q,N){var F=C[0],O=C[1],y=C[2],H=C[3],B=Math.floor(Math.max(0,(O-S)*G)),D=Math.ceil(Math.min(N,Math.max(0,(y-S)*G))),A=(K==="Dense"?0:(0+z))*Q,T=this.prefs.block_color,E=this.prefs.label_color,M=0;if((K==="Pack"||this.mode==="Auto")&&G>P.canvas.manager.char_width_px){var M=Math.round(G/2)}P.fillStyle=T;if(C[5] instanceof Array){var L=Math.floor(Math.max(0,(C[4][0]-S)*G)),J=Math.ceil(Math.min(N,Math.max(0,(C[4][1]-S)*G))),I=Math.floor(Math.max(0,(C[5][0]-S)*G)),w=Math.ceil(Math.min(N,Math.max(0,(C[5][1]-S)*G)));if(C[4][1]>=S&&C[4][0]<=x&&C[4][2]){this.draw_read(P,K,G,S,x,C[4][0],C[4][2],C[4][3],A)}if(C[5][1]>=S&&C[5][0]<=x&&C[5][2]){this.draw_read(P,K,G,S,x,C[5][0],C[5][2],C[5][3],A)}if(I>J){P.fillStyle=g;o(P,J-M,A+5,I-M,A+5)}}else{P.fillStyle=T;this.draw_read(P,K,G,S,x,O,C[4],C[5],A)}if(K==="Pack"&&O>S){P.fillStyle=this.prefs.label_color;var R=1;if(R===0&&B-P.measureText(H).width<0){P.textAlign="left";P.fillText(H,D+m-M,A+8)}else{P.textAlign="right";P.fillText(H,B-m-M,A+8)}P.fillStyle=T}}});v.SummaryTreePainter=t;v.LinePainter=c;v.LinkedFeaturePainter=q;v.ReadPainter=s;v.VariantPainter=b};(function(d){var c={};var b=function(e){return c[e]};var a=function(f,g){var e={};g(b,e);c[f]=e};a("slotting",slotting_module);a("painters",painters_module);a("trackster",trackster_module);for(key in c.trackster){d[key]=c.trackster[key]}})(window);
\ No newline at end of file
--- a/static/scripts/trackster.js Thu Apr 14 10:37:42 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 14:29:32 2011 -0400
@@ -1311,9 +1311,9 @@
* Tiles drawn by tracks.
*/
var Tile = function(index, resolution, canvas) {
- // Wrap element in div for background
this.index = index;
this.resolution = resolution;
+ // Wrap element in div for background.
this.canvas = $("<div class='track-tile'/>").append(canvas);
};
@@ -1743,7 +1743,9 @@
//
// If mode is Histogram and tiles do not share max, redraw tiles as necessary using new max.
//
- if (track.mode == "Histogram") {
+ // HACK: use track type b/c LineTrack histograms are different; what's needed is different
+ // post-draw actions for different line tracks.
+ if (track.track_type == "FeatureTrack" && track.mode == "Histogram") {
// Get global max.
var global_max = -1;
for (var i = 0; i < drawn_tiles.length; i++) {
@@ -1826,7 +1828,7 @@
var draw_and_show_tile = function(id, result, resolution, tile_index, parent_element, w_scale, seq_data) {
// DEBUG: this is still called too many times when moving slowly,
// console.log( "draw_and_show_tile", resolution, tile_index, w_scale );
- var tile = track.draw_tile(result, resolution, tile_index, parent_element, w_scale, seq_data);
+ var tile = track.draw_tile(result, resolution, tile_index, w_scale, seq_data);
track.tile_cache.set(key, tile);
track.show_tile(tile, parent_element, tile_low, w_scale);
drawn_tiles[drawn_tiles.length] = tile;
@@ -1882,9 +1884,9 @@
}
var tile_element = tile.canvas;
tile_element.css({ position: 'absolute', top: 0, left: left, height: '' });
-
- // Setup and show tile element.
parent_element.append(tile_element);
+
+ // Set track height.
track.max_height = Math.max(track.max_height, tile_element.height());
track.content_div.css("height", track.max_height + "px");
parent_element.children().css("height", track.max_height + "px");
@@ -1984,7 +1986,7 @@
/**
* Draw ReferenceTrack tile.
*/
- draw_tile: function(seq, resolution, tile_index, parent_element, w_scale) {
+ draw_tile: function(seq, resolution, tile_index, w_scale) {
var track = this,
tile_length = DENSITY * resolution;
@@ -2122,7 +2124,7 @@
/**
* Draw LineTrack tile.
*/
- draw_tile: function(result, resolution, tile_index, parent_element, w_scale) {
+ draw_tile: function(result, resolution, tile_index, w_scale) {
if (this.vertical_range === undefined) {
return;
}
@@ -2312,7 +2314,7 @@
/**
* Draw FeatureTrack tile.
*/
- draw_tile: function(result, resolution, tile_index, parent_element, w_scale, ref_seq) {
+ draw_tile: function(result, resolution, tile_index, w_scale, ref_seq) {
var track = this,
tile_low = tile_index * DENSITY * resolution,
tile_high = ( tile_index + 1 ) * DENSITY * resolution,
@@ -2343,7 +2345,7 @@
var data = result.data;
// if ( (data.length && data.length < 4) ||
// (this.view.high - this.view.low > MIN_SQUISH_VIEW_WIDTH) ) {
- if ( this.view.high - this.view.low > MIN_SQUISH_VIEW_WIDTH ) {
+ if ( this.view.high - this.view.low > MIN_SQUISH_VIEW_WIDTH ) {
mode = "Squish";
} else {
mode = "Pack";
@@ -2354,9 +2356,7 @@
// Drawing the summary tree (feature coverage histogram)
if (mode === "summary_tree" || mode === "Histogram") {
- // Set height of parent_element
required_height = this.summary_draw_height;
- parent_element.parent().css("height", Math.max(this.height_px, required_height) + "px");
// Add label to container div showing maximum count
// TODO: this shouldn't be done at the tile level
this.container_div.find(".yaxislabel").remove();
@@ -2428,7 +2428,6 @@
canvas.width = width + left_offset;
canvas.height = required_height;
- 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.getContext("2d");
ctx.fillStyle = this.prefs.block_color;
@@ -2452,7 +2451,7 @@
// If there's no data, return.
if (!result.data) {
- return new Tile(tile_index, resolution, canvas);
+ return new Tile(tile_index, resolution, canvas, required_height);
}
}
@@ -2460,8 +2459,8 @@
this.example_feature = (result.data.length ? result.data[0] : undefined);
// Draw features
- ctx.translate( left_offset, ERROR_PADDING );
- painter.draw( ctx, width, required_height, slots );
+ ctx.translate(left_offset, ERROR_PADDING);
+ painter.draw(ctx, width, required_height, slots);
return new FeatureTrackTile(tile_index, resolution, canvas);
}
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: refactor so that summary_tree and Histogram modes use the same code.
by Bitbucket 14 Apr '11
by Bitbucket 14 Apr '11
14 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/9203be6a16b3/
changeset: r5388:9203be6a16b3
user: jgoecks
date: 2011-04-14 16:37:42
summary: Trackster: refactor so that summary_tree and Histogram modes use the same code.
affected #: 1 file (1.3 KB)
--- a/static/scripts/trackster.js Thu Apr 14 10:05:00 2011 -0400
+++ b/static/scripts/trackster.js Thu Apr 14 10:37:42 2011 -0400
@@ -2353,7 +2353,7 @@
}
// Drawing the summary tree (feature coverage histogram)
- if ( mode === "summary_tree" ) {
+ if (mode === "summary_tree" || mode === "Histogram") {
// Set height of parent_element
required_height = this.summary_draw_height;
parent_element.parent().css("height", Math.max(this.height_px, required_height) + "px");
@@ -2369,44 +2369,22 @@
canvas.width = width + left_offset;
// Extra padding at top of summary tree
canvas.height = required_height + SUMMARY_TREE_TOP_PADDING;
+
+ // Get summary tree data if necessary and set max if there is one.
+ if (result.dataset_type != "summary_tree") {
+ var st_data = this.get_summary_tree_data(result.data, tile_low, tile_high, 200);
+ if (result.max) {
+ st_data.max = result.max;
+ }
+ result = st_data;
+ }
// Paint summary tree into canvas
- var painter = new painters.SummaryTreePainter( result, tile_low, tile_high, this.prefs );
- var ctx = canvas.getContext("2d");
- // Deal with left_offset by translating
- ctx.translate( left_offset, SUMMARY_TREE_TOP_PADDING );
- painter.draw( ctx, width, required_height );
- return new SummaryTreeTile(tile_index, resolution, canvas, result.max);
- }
-
- // Drawing coverage histogram. This is different from summary tree because data can feature
- // details, but user has requested a histogram.
- if (mode === "Histogram") {
- // Set height of parent_element
- required_height = this.summary_draw_height;
- parent_element.parent().css("height", Math.max(this.height_px, required_height) + "px");
- // Add label to container div showing maximum count
- // TODO: this shouldn't be done at the tile level
- this.container_div.find(".yaxislabel").remove();
- var max_label = $("<div />").addClass('yaxislabel');
- max_label.text( result.max );
- max_label.css({ position: "absolute", top: "22px", left: "10px" });
- max_label.prependTo(this.container_div);
- // Create canvas
- var canvas = this.view.canvas_manager.new_canvas();
- canvas.width = width + left_offset;
- // Extra padding at top of summary tree
- canvas.height = required_height + SUMMARY_TREE_TOP_PADDING;
- // Paint summary tree into canvas.
- var binned_data = this.get_summary_tree_data(result.data, tile_low, tile_high, 200);
- if (result.max) {
- binned_data.max = result.max;
- }
- var painter = new painters.SummaryTreePainter(binned_data, tile_low, tile_high, this.prefs);
+ var painter = new painters.SummaryTreePainter(result, tile_low, tile_high, this.prefs);
var ctx = canvas.getContext("2d");
// Deal with left_offset by translating
ctx.translate(left_offset, SUMMARY_TREE_TOP_PADDING);
painter.draw(ctx, width, required_height);
- return new SummaryTreeTile(tile_index, resolution, canvas, binned_data.max);
+ return new SummaryTreeTile(tile_index, resolution, canvas, result.max);
}
// Start dealing with row-by-row tracks
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: Fix bug that prevented workflows with runtime parameters from being exported.
by Bitbucket 14 Apr '11
by Bitbucket 14 Apr '11
14 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/835656900dd0/
changeset: r5387:835656900dd0
user: jgoecks
date: 2011-04-14 16:05:00
summary: Fix bug that prevented workflows with runtime parameters from being exported.
affected #: 1 file (5 bytes)
--- a/lib/galaxy/web/controllers/workflow.py Thu Apr 14 09:02:20 2011 -0400
+++ b/lib/galaxy/web/controllers/workflow.py Thu Apr 14 10:05:00 2011 -0400
@@ -1587,7 +1587,7 @@
for name, val in module.state.inputs.items():
input_type = type( val )
if input_type == RuntimeValue:
- step['inputs'].append( { "name" : name, "description" : "runtime parameter for tool %s" % module.get_name() } )
+ step_dict['inputs'].append( { "name" : name, "description" : "runtime parameter for tool %s" % module.get_name() } )
elif input_type == dict:
# Input type is described by a dict, e.g. indexed parameters.
for partname, partval in val.items():
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
3 new changesets in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/3504e971d8b8/
changeset: r5384:3504e971d8b8
user: Martijn Vermaat
date: 2011-04-14 12:14:30
summary: Adds filtering to input selection on run workflow page.
affected #: 2 files (2.3 KB)
--- a/static/june_2007_style/blue/base.css Thu Apr 14 01:13:10 2011 +0200
+++ b/static/june_2007_style/blue/base.css Thu Apr 14 12:14:30 2011 +0200
@@ -172,4 +172,4 @@
.text-and-autocomplete-select{background:url(fugue.png) no-repeat right -364px;}
.icon-button.multiinput{background:url(../images/documents-stack.png) no-repeat;cursor:pointer;float:none;display:inline-block;margin-left:10px;}
.icon-button.multiinput.disabled{background:url(../images/documents-stack-faded.png) no-repeat;cursor:auto;}
-.workflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
+.workflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;padding-left:5px;}
--- a/templates/workflow/run.mako Thu Apr 14 01:13:10 2011 +0200
+++ b/templates/workflow/run.mako Thu Apr 14 12:14:30 2011 +0200
@@ -21,6 +21,7 @@
}
}
function toggle_multiinput(select) {
+ var placeholder;
if (select.attr('multiple')) {
$('.multiinput').removeClass('disabled');
if (select.val()) {
@@ -28,12 +29,16 @@
} else {
select.val($('option:last', select).val());
}
- select.removeAttr('multiple');
+ select.removeAttr('multiple').removeAttr('size');
+ placeholder = 'type to filter';
} else {
$('.multiinput').addClass('disabled');
$('.multiinput', select.parent().prev()).removeClass('disabled');
- select.attr('multiple', 'multiple');
+ select.attr('multiple', 'multiple').attr('size', 8);
+ placeholder = 'type to filter, [enter] to select all';
}
+ $('input.multiinput-filter', select.parent()).attr(
+ 'placeholder', placeholder);
}
$( "select[refresh_on_change='true']").change( function() {
$( "#tool_form" ).submit();
@@ -58,6 +63,7 @@
});
$('select[name*="|input"]').removeAttr('multiple').each(function(i, s) {
var select = $(s);
+ var new_width = select.width() + 20;
select.parent().prev().append(
$('<span class="icon-button multiinput"></span>').click(function() {
if ($(this).hasClass('disabled')) return;
@@ -68,6 +74,44 @@
'files. Each selected file will have an ' +
'instance of the workflow.').tipsy({gravity:'s'})
);
+ var filter = $('<input type="text" class="multiinput-filter" ' +
+ 'placeholder="type to filter">');
+ var filter_timeout = false;
+ var original_rows = select.find('option');
+ var previous_filter = '';
+ // Todo: might have to choose keypress, depending on browser
+ filter.keydown(function(e) {
+ var filter_select = function() {
+ var f = $.trim(filter.val());
+ var filtered_rows = original_rows;
+ if (f.length >= 1) {
+ filtered_rows = original_rows.filter(function() {
+ return new RegExp(f, 'ig').test($(this).text());
+ });
+ }
+ select.html('');
+ select.html(filtered_rows);
+ };
+ if (e.which == 13) { // 13 = enter key
+ e.preventDefault();
+ multi = select.attr('multiple');
+ if (typeof multi !== 'undefined' && multi !== false) {
+ if (!select.find('option:not(:selected)').length) {
+ select.find('option').removeAttr('selected');
+ } else {
+ select.find('option').attr('selected', 'selected');
+ }
+ }
+ return;
+ }
+ if (filter.val() != previous_filter) {
+ if (filter_timeout) clearTimeout(filter_timeout);
+ timeout = setTimeout(filter_select, 300);
+ previous_filter = filter.val();
+ }
+ }).width(new_width).css('display', 'block');
+ select.after(filter);
+ select.width(new_width);
});
});
</script>
http://bitbucket.org/galaxy/galaxy-central/changeset/d6fda5e30200/
changeset: r5385:d6fda5e30200
user: Martijn Vermaat
date: 2011-04-14 14:23:28
summary: Give input selection and filtering a minimum width (run tool form).
affected #: 1 file (15 bytes)
--- a/templates/workflow/run.mako Thu Apr 14 12:14:30 2011 +0200
+++ b/templates/workflow/run.mako Thu Apr 14 14:23:28 2011 +0200
@@ -63,7 +63,7 @@
});
$('select[name*="|input"]').removeAttr('multiple').each(function(i, s) {
var select = $(s);
- var new_width = select.width() + 20;
+ var new_width = Math.max(200, select.width()) + 20;
select.parent().prev().append(
$('<span class="icon-button multiinput"></span>').click(function() {
if ($(this).hasClass('disabled')) return;
http://bitbucket.org/galaxy/galaxy-central/changeset/67a19816034b/
changeset: r5386:67a19816034b
user: dannon
date: 2011-04-14 15:02:20
summary: Merge!
affected #: 2 files (2.3 KB)
--- a/static/june_2007_style/blue/base.css Thu Apr 14 08:09:48 2011 -0400
+++ b/static/june_2007_style/blue/base.css Thu Apr 14 09:02:20 2011 -0400
@@ -172,4 +172,4 @@
.text-and-autocomplete-select{background:url(fugue.png) no-repeat right -364px;}
.icon-button.multiinput{background:url(../images/documents-stack.png) no-repeat;cursor:pointer;float:none;display:inline-block;margin-left:10px;}
.icon-button.multiinput.disabled{background:url(../images/documents-stack-faded.png) no-repeat;cursor:auto;}
-.workflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
+.workflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;padding-left:5px;}
--- a/templates/workflow/run.mako Thu Apr 14 08:09:48 2011 -0400
+++ b/templates/workflow/run.mako Thu Apr 14 09:02:20 2011 -0400
@@ -21,6 +21,7 @@
}
}
function toggle_multiinput(select) {
+ var placeholder;
if (select.attr('multiple')) {
$('.multiinput').removeClass('disabled');
if (select.val()) {
@@ -28,12 +29,16 @@
} else {
select.val($('option:last', select).val());
}
- select.removeAttr('multiple');
+ select.removeAttr('multiple').removeAttr('size');
+ placeholder = 'type to filter';
} else {
$('.multiinput').addClass('disabled');
$('.multiinput', select.parent().prev()).removeClass('disabled');
- select.attr('multiple', 'multiple');
+ select.attr('multiple', 'multiple').attr('size', 8);
+ placeholder = 'type to filter, [enter] to select all';
}
+ $('input.multiinput-filter', select.parent()).attr(
+ 'placeholder', placeholder);
}
$( "select[refresh_on_change='true']").change( function() {
$( "#tool_form" ).submit();
@@ -58,6 +63,7 @@
});
$('select[name*="|input"]').removeAttr('multiple').each(function(i, s) {
var select = $(s);
+ var new_width = Math.max(200, select.width()) + 20;
select.parent().prev().append(
$('<span class="icon-button multiinput"></span>').click(function() {
if ($(this).hasClass('disabled')) return;
@@ -68,6 +74,44 @@
'files. Each selected file will have an ' +
'instance of the workflow.').tipsy({gravity:'s'})
);
+ var filter = $('<input type="text" class="multiinput-filter" ' +
+ 'placeholder="type to filter">');
+ var filter_timeout = false;
+ var original_rows = select.find('option');
+ var previous_filter = '';
+ // Todo: might have to choose keypress, depending on browser
+ filter.keydown(function(e) {
+ var filter_select = function() {
+ var f = $.trim(filter.val());
+ var filtered_rows = original_rows;
+ if (f.length >= 1) {
+ filtered_rows = original_rows.filter(function() {
+ return new RegExp(f, 'ig').test($(this).text());
+ });
+ }
+ select.html('');
+ select.html(filtered_rows);
+ };
+ if (e.which == 13) { // 13 = enter key
+ e.preventDefault();
+ multi = select.attr('multiple');
+ if (typeof multi !== 'undefined' && multi !== false) {
+ if (!select.find('option:not(:selected)').length) {
+ select.find('option').removeAttr('selected');
+ } else {
+ select.find('option').attr('selected', 'selected');
+ }
+ }
+ return;
+ }
+ if (filter.val() != previous_filter) {
+ if (filter_timeout) clearTimeout(filter_timeout);
+ timeout = setTimeout(filter_select, 300);
+ previous_filter = filter.val();
+ }
+ }).width(new_width).css('display', 'block');
+ select.after(filter);
+ select.width(new_width);
});
});
</script>
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: fubar: Changes to allow all test outputs generated by twill to be saved to a folder pointed to by
by Bitbucket 14 Apr '11
by Bitbucket 14 Apr '11
14 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/b9cff3fbd170/
changeset: r5383:b9cff3fbd170
user: fubar
date: 2011-04-14 14:09:48
summary: Changes to allow all test outputs generated by twill to be saved to a folder pointed to by
an environment variable "GALAXY_TEST_SAVE" if defined before running functional tests
If the environment variable is empty, all tests procede as usual and test outputs are deleted
without saving
affected #: 3 files (770 bytes)
--- a/scripts/functional_tests.py Wed Apr 13 19:14:21 2011 -0400
+++ b/scripts/functional_tests.py Thu Apr 14 08:09:48 2011 -0400
@@ -47,6 +47,8 @@
galaxy_test_host = os.environ.get( 'GALAXY_TEST_HOST', default_galaxy_test_host )
galaxy_test_port = os.environ.get( 'GALAXY_TEST_PORT', None )
+ galaxy_test_save = os.environ.get( 'GALAXY_TEST_SAVE', None)
+
if 'HTTP_ACCEPT_LANGUAGE' not in os.environ:
os.environ['HTTP_ACCEPT_LANGUAGE'] = default_galaxy_locales
galaxy_test_file_dir = os.environ.get( 'GALAXY_TEST_FILE_DIR', default_galaxy_test_file_dir )
@@ -126,10 +128,14 @@
print "Database connection:", database_connection
- # What requires these?
+ # What requires these?
+ # handy for (eg) functional tests to save outputs?
+ if galaxy_test_save:
+ os.environ['GALAXY_TEST_SAVE'] = galaxy_test_save
+ # pass in through script setenv
+ # will leave a copy of ALL test validate files
os.environ['GALAXY_TEST_HOST'] = galaxy_test_host
os.environ['GALAXY_TEST_FILE_DIR'] = galaxy_test_file_dir
-
# ---- Build Application --------------------------------------------------
app = None
--- a/test/base/twilltestcase.py Wed Apr 13 19:14:21 2011 -0400
+++ b/test/base/twilltestcase.py Thu Apr 14 08:09:48 2011 -0400
@@ -32,7 +32,14 @@
self.port = os.environ.get( 'GALAXY_TEST_PORT' )
self.url = "http://%s:%s" % ( self.host, self.port )
self.file_dir = os.environ.get( 'GALAXY_TEST_FILE_DIR' )
+ self.keepOutdir = os.environ.get( 'GALAXY_TEST_SAVE', '' )
+ if self.keepOutdir > '':
+ try:
+ os.makedirs(self.keepOutdir)
+ except:
+ pass
self.home()
+
#self.set_history()
# Functions associated with files
@@ -632,6 +639,10 @@
self.visit_page( "display?hid=" + hid )
data = self.last_page()
file( temp_name, 'wb' ).write(data)
+ if self.keepOutdir > '':
+ ofn = os.path.join(self.keepOutdir,os.path.basename(local_name))
+ shutil.copy(temp_name,ofn)
+ log.debug('## GALAXY_TEST_SAVE=%s. saved %s' % (self.keepOutdir,ofn))
try:
# have to nest try-except in try-finally to handle 2.4
try:
--- a/tools/rgenetics/rgQC.xml Wed Apr 13 19:14:21 2011 -0400
+++ b/tools/rgenetics/rgQC.xml Thu Apr 14 08:09:48 2011 -0400
@@ -28,6 +28,7 @@
</param><param name='title' value='rgQCtest1' /><output name='html_file' file='rgtestouts/rgQC/rgQCtest1.html' ftype='html' lines_diff='300'>
+ <param name="dbkey" value="hg18" /><extra_files type="file" name='tinywga_All_Paged.pdf' value="rgtestouts/rgQC/tinywga_All_Paged.pdf" compare="sim_size" delta = "100000"/><extra_files type="file" name='tinywga.log' value="rgtestouts/rgQC/tinywga.log" compare="diff" lines_diff="15"/><extra_files type="file" name='tinywga.frq' value="rgtestouts/rgQC/tinywga.frq" compare="diff" />
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
2 new changesets in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/74875168e6da/
changeset: r5381:74875168e6da
user: Martijn Vermaat
date: 2011-04-14 01:13:10
summary: Typo.
affected #: 1 file (1 byte)
--- a/static/june_2007_style/blue/base.css Thu Apr 14 01:04:40 2011 +0200
+++ b/static/june_2007_style/blue/base.css Thu Apr 14 01:13:10 2011 +0200
@@ -172,4 +172,4 @@
.text-and-autocomplete-select{background:url(fugue.png) no-repeat right -364px;}
.icon-button.multiinput{background:url(../images/documents-stack.png) no-repeat;cursor:pointer;float:none;display:inline-block;margin-left:10px;}
.icon-button.multiinput.disabled{background:url(../images/documents-stack-faded.png) no-repeat;cursor:auto;}
-.worflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
+.workflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
http://bitbucket.org/galaxy/galaxy-central/changeset/8a0522fff4f7/
changeset: r5382:8a0522fff4f7
user: dannon
date: 2011-04-14 01:14:21
summary: Merge.
affected #: 1 file (1 byte)
--- a/static/june_2007_style/blue/base.css Wed Apr 13 19:07:22 2011 -0400
+++ b/static/june_2007_style/blue/base.css Wed Apr 13 19:14:21 2011 -0400
@@ -172,4 +172,4 @@
.text-and-autocomplete-select{background:url(fugue.png) no-repeat right -364px;}
.icon-button.multiinput{background:url(../images/documents-stack.png) no-repeat;cursor:pointer;float:none;display:inline-block;margin-left:10px;}
.icon-button.multiinput.disabled{background:url(../images/documents-stack-faded.png) no-repeat;cursor:auto;}
-.worflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
+.workflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
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
5 new changesets in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/56fc50970fc3/
changeset: r5376:56fc50970fc3
user: dannon
date: 2011-04-13 22:35:08
summary: Bugfix for workflow run not reloading history, icon for document stack.
affected #: 2 files (803 bytes)
Binary file static/images/documents-stack.png has changed
--- a/templates/workflow/run_complete.mako Wed Apr 13 16:05:34 2011 -0400
+++ b/templates/workflow/run_complete.mako Wed Apr 13 16:35:08 2011 -0400
@@ -17,4 +17,10 @@
%endfor
%endfor
</div>
-</div>
\ No newline at end of file
+</div>
+
+<script type="text/javascript">
+ if ( parent.frames && parent.frames.galaxy_history ) {
+ parent.frames.galaxy_history.location.href="${h.url_for( controller='root', action='history' )}";
+ }
+</script>
http://bitbucket.org/galaxy/galaxy-central/changeset/9a72df515de1/
changeset: r5377:9a72df515de1
user: dannon
date: 2011-04-13 22:46:36
summary: Faded document stack icon.
affected #: 1 file (587 bytes)
Binary file static/images/documents-stack-faded.png has changed
http://bitbucket.org/galaxy/galaxy-central/changeset/a946c7e60d1f/
changeset: r5378:a946c7e60d1f
user: dannon
date: 2011-04-14 01:05:45
summary: Merge.
affected #: 1 file (1.8 KB)
--- a/static/scripts/trackster.js Wed Apr 13 16:46:36 2011 -0400
+++ b/static/scripts/trackster.js Wed Apr 13 19:05:45 2011 -0400
@@ -741,7 +741,7 @@
this.high = Math.ceil(high);
// 10^log10(range / DENSITY) Close approximation for browser window, assuming DENSITY = window width
- this.resolution = Math.pow( 10, Math.ceil( Math.log( (this.high - this.low) / 200 ) / Math.LN10 ) );
+ this.resolution = Math.pow( 10, Math.ceil( Math.log( (this.high - this.low) / DENSITY ) / Math.LN10 ) );
this.zoom_res = Math.pow( FEATURE_LEVELS, Math.max(0,Math.ceil( Math.log( this.resolution, FEATURE_LEVELS ) / Math.log(FEATURE_LEVELS) )));
// Overview
@@ -1016,14 +1016,16 @@
return false;
},
/**
- * Returns true iff element is in [low, high]; range is inclusive.
+ * Returns true if (a) element's value is in [low, high] (range is inclusive)
+ * or (b) if value is non-numeric and hence unfilterable.
*/
keep: function(element) {
if ( !this.applies_to( element ) ) {
// No element to filter on.
return true;
}
- return (element[this.index] >= this.low && element[this.index] <= this.high);
+ var val = parseInt(element[this.index]);
+ return (isNaN(val) || (val >= this.low && val <= this.high));
},
/**
* Update filter's min and max values based on element's values.
@@ -1306,11 +1308,22 @@
});
/**
- * Tiles for TiledTracks.
+ * Tiles drawn by tracks.
*/
-var Tile = function(track, canvas) {
- this.track = track;
- this.canvas = canvas;
+var Tile = function(index, resolution, canvas) {
+ // Wrap element in div for background
+ this.index = index;
+ this.resolution = resolution;
+ this.canvas = $("<div class='track-tile'/>").append(canvas);
+};
+
+var SummaryTreeTile = function(index, resolution, canvas, max_val) {
+ Tile.call(this, index, resolution, canvas);
+ this.max_val = max_val;
+};
+
+var FeatureTrackTile = function(index, resolution, canvas) {
+ Tile.call(this, index, resolution, canvas);
};
/**
@@ -1669,30 +1682,33 @@
// w_scale units are pixels per base.
w_scale = width / range,
resolution = this.view.resolution,
- parent_element = $("<div style='position: relative;'></div>");
+ parent_element = $("<div style='position: relative;'></div>"),
+ gen_key = function(width, w_scale, tile_index) {
+ return width + '_' + w_scale + '_' + tile_index;
+ };
if (!clear_after) { this.content_div.children().remove(); }
this.content_div.append( parent_element );
this.max_height = 0;
// Index of first tile that overlaps visible region
var tile_index = Math.floor( low / resolution / DENSITY );
- // A set of setTimeout() ids used when drawing tiles. Each ID indicates
- // a tile has been requested to be drawn or is being drawn.
- var draw_tile_dict = {};
+ // A list of tiles drawn/retrieved.
+ var drawn_tiles = [];
+ var tile_count = 0
while ( ( tile_index * DENSITY * resolution ) < high ) {
// Check in cache
- var key = width + '_' + w_scale + '_' + tile_index;
+ var key = gen_key(width, w_scale, tile_index);
var cached = this.tile_cache.get(key);
var tile_low = tile_index * DENSITY * this.view.resolution;
var tile_high = tile_low + DENSITY * this.view.resolution;
- // console.log(cached, this.tile_cache);
if ( !force && cached ) {
+ drawn_tiles[drawn_tiles.length] = cached;
this.show_tile(cached, parent_element, tile_low, w_scale);
} else {
- this.delayed_draw(force, key, tile_low, tile_high, tile_index,
- resolution, parent_element, w_scale, draw_tile_dict);
+ this.delayed_draw(force, key, tile_index, resolution, parent_element, w_scale, drawn_tiles);
}
tile_index += 1;
+ tile_count++;
}
//
@@ -1700,7 +1716,7 @@
//
var track = this;
var intervalId = setInterval(function() {
- if (obj_length(draw_tile_dict) === 0) {
+ if (drawn_tiles.length === tile_count) {
// All tiles have been drawn.
clearInterval(intervalId);
@@ -1725,6 +1741,29 @@
}
//
+ // If mode is Histogram and tiles do not share max, redraw tiles as necessary using new max.
+ //
+ if (track.mode == "Histogram") {
+ // Get global max.
+ var global_max = -1;
+ for (var i = 0; i < drawn_tiles.length; i++) {
+ var cur_max = drawn_tiles[i].max_val;
+ if (cur_max > global_max) {
+ global_max = cur_max;
+ }
+ }
+
+ for (var i = 0; i < drawn_tiles.length; i++) {
+ if (drawn_tiles[i].max_val !== global_max) {
+ var tile = drawn_tiles[i];
+ tile.canvas.remove();
+ track.delayed_draw(true, gen_key(width, w_scale, tile.index), tile.index,
+ tile.resolution, parent_element, w_scale, [], { max: global_max });
+ }
+ }
+ }
+
+ //
// Update filter attributes, UI.
//
@@ -1755,6 +1794,19 @@
track.make_name_popup_menu();
}
}
+
+ // Store initial canvas in case we need to use it for overview
+ /* This is completely broken, just saves the first tile it sees
+ regardless of if it should be the overview
+ if (!track.initial_canvas && !window.G_vmlCanvasManager) {
+ track.initial_canvas = $(tile_element).clone();
+ var src_ctx = tile_element.get(0).getContext("2d");
+ var tgt_ctx = track.initial_canvas.get(0).getContext("2d");
+ var data = src_ctx.getImageData(0, 0, src_ctx.canvas.width, src_ctx.canvas.height);
+ tgt_ctx.putImageData(data, 0, 0);
+ track.set_overview();
+ }
+ */
}
}, 50);
@@ -1765,44 +1817,28 @@
this.child_tracks[i].draw(force, clear_after);
}
},
- delayed_draw: function(force, key, tile_low, tile_high, tile_index, resolution, parent_element, w_scale, draw_tile_dict) {
- var track = this;
- // Put a 50ms delay on drawing so that if the user scrolls fast, we don't load extra data
+ delayed_draw: function(force, key, tile_index, resolution, parent_element, w_scale, drawn_tiles, more_tile_data) {
+ var track = this,
+ tile_low = tile_index * DENSITY * resolution,
+ tile_high = tile_low + DENSITY * resolution;
+
+ // Helper method.
var draw_and_show_tile = function(id, result, resolution, tile_index, parent_element, w_scale, seq_data) {
// DEBUG: this is still called too many times when moving slowly,
// console.log( "draw_and_show_tile", resolution, tile_index, w_scale );
- returned_tile = track.draw_tile(result, resolution, tile_index, parent_element, w_scale, seq_data)
-
- // Wrap element in div for background
- var wrapper_element = $("<div class='track-tile'>").prepend(returned_tile);
- tile_element = wrapper_element;
-
- track.tile_cache.set(key, tile_element);
- track.show_tile(tile_element, parent_element, tile_low, w_scale);
-
- // TODO: this should go in a post-draw function.
- // Store initial canvas in case we need to use it for overview
- /* This is completely broken, just saves the first tile it sees
- regardless of if it should be the overview
- if (!track.initial_canvas && !window.G_vmlCanvasManager) {
- track.initial_canvas = $(tile_element).clone();
- var src_ctx = tile_element.get(0).getContext("2d");
- var tgt_ctx = track.initial_canvas.get(0).getContext("2d");
- var data = src_ctx.getImageData(0, 0, src_ctx.canvas.width, src_ctx.canvas.height);
- tgt_ctx.putImageData(data, 0, 0);
- track.set_overview();
- }
- */
-
- delete draw_tile_dict[id];
+ var tile = track.draw_tile(result, resolution, tile_index, parent_element, w_scale, seq_data);
+ track.tile_cache.set(key, tile);
+ track.show_tile(tile, parent_element, tile_low, w_scale);
+ drawn_tiles[drawn_tiles.length] = tile;
};
+ // Put a 50ms delay on drawing so that if the user scrolls fast, we don't load extra data
var id = setTimeout(function() {
if (tile_low <= track.view.high && tile_high >= track.view.low) {
// Show/draw tile: check cache for tile; if tile not in cache, draw it.
- var tile_element = (force ? undefined : track.tile_cache.get(key));
- if (tile_element) {
- track.show_tile(tile_element, parent_element, tile_low, w_scale);
- delete draw_tile_dict[id];
+ var tile = (force ? undefined : track.tile_cache.get(key));
+ if (tile) {
+ track.show_tile(tile, parent_element, tile_low, w_scale);
+ drawn_tiles[drawn_tiles.length] = tile;
}
else {
//
@@ -1810,6 +1846,7 @@
//
$.when(track.data_cache.get_data(view.chrom, tile_low, tile_high, track.mode,
resolution, track.data_url_extra_params)).then(function(tile_data) {
+ extend(tile_data, more_tile_data);
// If sequence data needed, get that and draw. Otherwise draw.
if (view.reference_track && w_scale > view.canvas_manager.char_width_px) {
$.when(view.reference_track.data_cache.get_data(view.chrom, tile_low, tile_high,
@@ -1825,12 +1862,11 @@
}
}
}, 50);
- draw_tile_dict[id] = true;
},
/**
* Show track tile and perform associated actions.
*/
- show_tile: function(tile_element, parent_element, tile_low, w_scale) {
+ show_tile: function(tile, parent_element, tile_low, w_scale) {
// Readability.
var track = this;
@@ -1844,6 +1880,7 @@
if (this.left_offset) {
left -= this.left_offset;
}
+ var tile_element = tile.canvas;
tile_element.css({ position: 'absolute', top: 0, left: left, height: '' });
// Setup and show tile element.
@@ -1966,7 +2003,7 @@
var c_start = Math.round(c * w_scale);
ctx.fillText(seq[c], c_start + track.left_offset, 10);
}
- return canvas;
+ return new Tile(tile_index, resolution, canvas);
}
this.content_div.css("height", "0px");
}
@@ -2106,7 +2143,7 @@
this.prefs, this.mode );
painter.draw( ctx, width, height );
- return canvas;
+ return new Tile(tile_length, resolution, canvas);
}
});
@@ -2196,11 +2233,14 @@
* position. Return value is a dict with keys 'data', 'delta' (bin size) and 'max.' Data
* is a two-item list; first item is bin start, second is bin's count.
*/
- get_summary_tree_data: function(data, low, high, bin_size) {
- var num_bins = Math.floor((high - low)/bin_size),
+ get_summary_tree_data: function(data, low, high, num_bins) {
+ if (num_bins > high - low) {
+ num_bins = high - low;
+ }
+ var bin_size = Math.floor((high - low)/num_bins),
bins = [],
max_count = 0;
-
+
/*
// For debugging:
for (var i = 0; i < data.length; i++)
@@ -2335,8 +2375,7 @@
// Deal with left_offset by translating
ctx.translate( left_offset, SUMMARY_TREE_TOP_PADDING );
painter.draw( ctx, width, required_height );
- // Canvas element is returned
- return canvas;
+ return new SummaryTreeTile(tile_index, resolution, canvas, result.max);
}
// Drawing coverage histogram. This is different from summary tree because data can feature
@@ -2359,13 +2398,15 @@
canvas.height = required_height + SUMMARY_TREE_TOP_PADDING;
// Paint summary tree into canvas.
var binned_data = this.get_summary_tree_data(result.data, tile_low, tile_high, 200);
+ if (result.max) {
+ binned_data.max = result.max;
+ }
var painter = new painters.SummaryTreePainter(binned_data, tile_low, tile_high, this.prefs);
var ctx = canvas.getContext("2d");
// Deal with left_offset by translating
ctx.translate(left_offset, SUMMARY_TREE_TOP_PADDING);
painter.draw(ctx, width, required_height);
- // Canvas element is returned
- return canvas;
+ return new SummaryTreeTile(tile_index, resolution, canvas, binned_data.max);
}
// Start dealing with row-by-row tracks
@@ -2433,7 +2474,7 @@
// If there's no data, return.
if (!result.data) {
- return canvas;
+ return new Tile(tile_index, resolution, canvas);
}
}
@@ -2444,7 +2485,7 @@
ctx.translate( left_offset, ERROR_PADDING );
painter.draw( ctx, width, required_height, slots );
- return canvas;
+ return new FeatureTrackTile(tile_index, resolution, canvas);
}
});
@@ -2558,7 +2599,7 @@
this.include_label = include_label;
this.max_rows = max_rows;
this.measureText = measureText;
-}
+};
/**
* Slot a set of features, `this.slots` will be updated with slots by id, and
@@ -2704,7 +2745,7 @@
// ---- Painters ----
var painters_module = function(require, exports){
-
+
/**
* Draw a dashed line on a canvas using filled rectangles. This function is based on:
* http://vetruvet.blogspot.com/2010/10/drawing-dashed-lines-on-html5-canvas.h…
@@ -2776,7 +2817,7 @@
Painter.call( this, data, view_start, view_end, prefs, mode );
}
-SummaryTreePainter.prototype.default_prefis = { show_counts: false };
+SummaryTreePainter.prototype.default_prefs = { show_counts: false };
SummaryTreePainter.prototype.draw = function( ctx, width, height ) {
@@ -2790,16 +2831,15 @@
// max rectangle is required_height.
base_y = height;
delta_x_px = Math.ceil(delta * w_scale);
-
ctx.save();
for (var i = 0, len = points.length; i < len; i++) {
-
var x = Math.floor( (points[i][0] - view_start) * w_scale );
var y = points[i][1];
if (!y) { continue; }
- var y_px = y / max * height;
+ var y_px = y / max * height
+ if (y !== 0 && y_px < 1) { y_px = 1; }
ctx.fillStyle = "black";
ctx.fillRect( x, base_y - y_px, delta_x_px, y_px );
@@ -2991,7 +3031,7 @@
}
});
-// Contstants specific to feature tracks moved here (HACKING, these should
+// Constants specific to feature tracks moved here (HACKING, these should
// basically all be configuration options)
var DENSE_TRACK_HEIGHT = 10,
NO_DETAIL_TRACK_HEIGHT = 3,
@@ -3034,8 +3074,7 @@
var
feature_uid = feature[0],
feature_start = feature[1],
- // -1 b/c intervals are half-open.
- feature_end = feature[2] - 1,
+ feature_end = feature[2],
feature_name = feature[3],
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)) ),
@@ -3134,8 +3173,7 @@
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) ),
- // -1 b/c intervals are half-open.
- block_end = Math.ceil( Math.min(width, Math.max((block[1] - 1 - 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; }
@@ -3199,8 +3237,7 @@
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_end = feature[2],
feature_name = feature[3],
// All features need a start, end, and vertical center.
f_start = Math.floor( Math.max(0, (feature_start - tile_low) * w_scale) ),
http://bitbucket.org/galaxy/galaxy-central/changeset/1c5796258fb5/
changeset: r5379:1c5796258fb5
user: Martijn Vermaat
date: 2011-04-14 01:04:40
summary: Run a workflow on a selection of multiple inputs, one invocation for each.
- Makes input selections in the run workflow form support multiple
selection.
- If multiple inputs are selected, a workflow invocation is executed for
each selected input.
- Only of of the workflow inputs can have a multiple selection.
affected #: 6 files (3.8 KB)
--- a/lib/galaxy/tools/parameters/basic.py Wed Apr 13 16:46:36 2011 -0400
+++ b/lib/galaxy/tools/parameters/basic.py Thu Apr 14 01:04:40 2011 +0200
@@ -1421,6 +1421,14 @@
else:
return "No dataset"
+ def validate( self, value, history=None ):
+ for validator in self.validators:
+ if value and self.multiple and isinstance(value, list):
+ for v in value:
+ validator.validate( v, history )
+ else:
+ validator.validate( value, history )
+
def get_dependencies( self ):
"""
Get the *names* of the other params this param depends on.
--- a/lib/galaxy/web/controllers/workflow.py Wed Apr 13 16:46:36 2011 -0400
+++ b/lib/galaxy/web/controllers/workflow.py Thu Apr 14 01:04:40 2011 +0200
@@ -1262,96 +1262,117 @@
if kwargs:
# If kwargs were provided, the states for each step should have
# been POSTed
- for step in workflow.steps:
- step.upgrade_messages = {}
- # Connections by input name
- step.input_connections_by_name = \
- dict( ( conn.input_name, conn ) for conn in step.input_connections )
- # Extract just the arguments for this step by prefix
- p = "%s|" % step.id
- l = len(p)
- step_args = dict( ( k[l:], v ) for ( k, v ) in kwargs.iteritems() if k.startswith( p ) )
- step_errors = None
- if step.type == 'tool' or step.type is None:
- module = module_factory.from_workflow_step( trans, step )
- # Fix any missing parameters
- step.upgrade_messages = module.check_and_update_state()
- if step.upgrade_messages:
- has_upgrade_messages = True
- # Any connected input needs to have value DummyDataset (these
- # are not persisted so we need to do it every time)
- module.add_dummy_datasets( connections=step.input_connections )
- # Get the tool
- tool = module.tool
- # Get the state
- step.state = state = module.state
- # Get old errors
- old_errors = state.inputs.pop( "__errors__", {} )
- # Update the state
- step_errors = tool.update_state( trans, tool.inputs, step.state.inputs, step_args,
- update_only=True, old_errors=old_errors )
- else:
- module = step.module = module_factory.from_workflow_step( trans, step )
- state = step.state = module.decode_runtime_state( trans, step_args.pop( "tool_state" ) )
- step_errors = module.update_runtime_state( trans, state, step_args )
- if step_errors:
- errors[step.id] = state.inputs["__errors__"] = step_errors
- if 'run_workflow' in kwargs and not errors:
- new_history = None
- if 'new_history' in kwargs:
- if 'new_history_name' in kwargs and kwargs['new_history_name'] != '':
- nh_name = kwargs['new_history_name']
+ # Get the kwarg keys for data inputs
+ input_keys = filter(lambda a: a.endswith('|input'), kwargs)
+ # Example: prefixed='2|input'
+ # Check if one of them is a list
+ multiple_input_key = None
+ multiple_inputs = [None]
+ for input_key in input_keys:
+ if isinstance(kwargs[input_key], list):
+ multiple_input_key = input_key
+ multiple_inputs = kwargs[input_key]
+ # List to gather values for the template
+ invocations=[]
+ for input_number, single_input in enumerate(multiple_inputs):
+ # Example: single_input='1', single_input='2', etc...
+ # 'Fix' the kwargs, to have only the input for this iteration
+ if multiple_input_key:
+ kwargs[multiple_input_key] = single_input
+ for step in workflow.steps:
+ step.upgrade_messages = {}
+ # Connections by input name
+ step.input_connections_by_name = \
+ dict( ( conn.input_name, conn ) for conn in step.input_connections )
+ # Extract just the arguments for this step by prefix
+ p = "%s|" % step.id
+ l = len(p)
+ step_args = dict( ( k[l:], v ) for ( k, v ) in kwargs.iteritems() if k.startswith( p ) )
+ step_errors = None
+ if step.type == 'tool' or step.type is None:
+ module = module_factory.from_workflow_step( trans, step )
+ # Fix any missing parameters
+ step.upgrade_messages = module.check_and_update_state()
+ if step.upgrade_messages:
+ has_upgrade_messages = True
+ # Any connected input needs to have value DummyDataset (these
+ # are not persisted so we need to do it every time)
+ module.add_dummy_datasets( connections=step.input_connections )
+ # Get the tool
+ tool = module.tool
+ # Get the state
+ step.state = state = module.state
+ # Get old errors
+ old_errors = state.inputs.pop( "__errors__", {} )
+ # Update the state
+ step_errors = tool.update_state( trans, tool.inputs, step.state.inputs, step_args,
+ update_only=True, old_errors=old_errors )
else:
- nh_name = "History from %s workflow" % workflow.name
- new_history = trans.app.model.History( user=trans.user, name=nh_name )
- trans.sa_session.add( new_history )
- # Run each step, connecting outputs to inputs
- workflow_invocation = model.WorkflowInvocation()
- workflow_invocation.workflow = workflow
- outputs = odict()
- for i, step in enumerate( workflow.steps ):
- # Execute module
- job = None
- if step.type == 'tool' or step.type is None:
- tool = trans.app.toolbox.tools_by_id[ step.tool_id ]
- input_values = step.state.inputs
- # Connect up
- def callback( input, value, prefixed_name, prefixed_label ):
- if isinstance( input, DataToolParameter ):
- if prefixed_name in step.input_connections_by_name:
- conn = step.input_connections_by_name[ prefixed_name ]
- return outputs[ conn.output_step.id ][ conn.output_name ]
- visit_input_values( tool.inputs, step.state.inputs, callback )
- # Execute it
- job, out_data = tool.execute( trans, step.state.inputs, history=new_history)
- outputs[ step.id ] = out_data
- # Create new PJA associations with the created job, to be run on completion.
- # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
- # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
- replacement_dict = {}
- for k, v in kwargs.iteritems():
- if k.startswith('wf_parm|'):
- replacement_dict[k[8:]] = v
- for pja in step.post_job_actions:
- if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict)
- else:
- job.add_post_job_action(pja)
- else:
- job, out_data = step.module.execute( trans, step.state )
- outputs[ step.id ] = out_data
- # Record invocation
- workflow_invocation_step = model.WorkflowInvocationStep()
- workflow_invocation_step.workflow_invocation = workflow_invocation
- workflow_invocation_step.workflow_step = step
- workflow_invocation_step.job = job
- # All jobs ran sucessfully, so we can save now
- trans.sa_session.add( workflow_invocation )
- trans.sa_session.flush()
- return trans.fill_template( "workflow/run_complete.mako",
- workflow=stored,
- outputs=outputs,
- new_history=new_history )
+ # Fix this for multiple inputs
+ module = step.module = module_factory.from_workflow_step( trans, step )
+ state = step.state = module.decode_runtime_state( trans, step_args.pop( "tool_state" ) )
+ step_errors = module.update_runtime_state( trans, state, step_args )
+ if step_errors:
+ errors[step.id] = state.inputs["__errors__"] = step_errors
+ if 'run_workflow' in kwargs and not errors:
+ new_history = None
+ if 'new_history' in kwargs:
+ if 'new_history_name' in kwargs and kwargs['new_history_name'] != '':
+ nh_name = kwargs['new_history_name']
+ else:
+ nh_name = "History from %s workflow" % workflow.name
+ if multiple_input_key:
+ nh_name = '%s %d' % (nh_name, input_number + 1)
+ new_history = trans.app.model.History( user=trans.user, name=nh_name )
+ trans.sa_session.add( new_history )
+ # Run each step, connecting outputs to inputs
+ workflow_invocation = model.WorkflowInvocation()
+ workflow_invocation.workflow = workflow
+ outputs = odict()
+ for i, step in enumerate( workflow.steps ):
+ # Execute module
+ job = None
+ if step.type == 'tool' or step.type is None:
+ tool = trans.app.toolbox.tools_by_id[ step.tool_id ]
+ input_values = step.state.inputs
+ # Connect up
+ def callback( input, value, prefixed_name, prefixed_label ):
+ if isinstance( input, DataToolParameter ):
+ if prefixed_name in step.input_connections_by_name:
+ conn = step.input_connections_by_name[ prefixed_name ]
+ return outputs[ conn.output_step.id ][ conn.output_name ]
+ visit_input_values( tool.inputs, step.state.inputs, callback )
+ # Execute it
+ job, out_data = tool.execute( trans, step.state.inputs, history=new_history)
+ outputs[ step.id ] = out_data
+ # Create new PJA associations with the created job, to be run on completion.
+ # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
+ # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
+ replacement_dict = {}
+ for k, v in kwargs.iteritems():
+ if k.startswith('wf_parm|'):
+ replacement_dict[k[8:]] = v
+ for pja in step.post_job_actions:
+ if pja.action_type in ActionBox.immediate_actions:
+ ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict)
+ else:
+ job.add_post_job_action(pja)
+ else:
+ job, out_data = step.module.execute( trans, step.state )
+ outputs[ step.id ] = out_data
+ # Record invocation
+ workflow_invocation_step = model.WorkflowInvocationStep()
+ workflow_invocation_step.workflow_invocation = workflow_invocation
+ workflow_invocation_step.workflow_step = step
+ workflow_invocation_step.job = job
+ # All jobs ran sucessfully, so we can save now
+ trans.sa_session.add( workflow_invocation )
+ invocations.append({'outputs': outputs,
+ 'new_history': new_history})
+ trans.sa_session.flush()
+ return trans.fill_template( "workflow/run_complete.mako",
+ workflow=stored,
+ invocations=invocations )
else:
# Prepare each step
missing_tools = []
@@ -1816,4 +1837,4 @@
cleanup( prefix, input.cases[current_case].inputs, group_values )
cleanup( "", inputs, values )
return associations
-
\ No newline at end of file
+
--- a/lib/galaxy/workflow/modules.py Wed Apr 13 16:46:36 2011 -0400
+++ b/lib/galaxy/workflow/modules.py Thu Apr 14 01:04:40 2011 +0200
@@ -131,7 +131,7 @@
def get_runtime_inputs( self, filter_set=['data'] ):
label = self.state.get( "name", "Input Dataset" )
- return dict( input=DataToolParameter( None, Element( "param", name="input", label=label, type="data", format=', '.join(filter_set) ) ) )
+ return dict( input=DataToolParameter( None, Element( "param", name="input", label=label, multiple=True, type="data", format=', '.join(filter_set) ) ) )
def get_runtime_state( self ):
state = DefaultToolState()
state.inputs = dict( input=None )
--- a/static/june_2007_style/blue/base.css Wed Apr 13 16:46:36 2011 -0400
+++ b/static/june_2007_style/blue/base.css Thu Apr 14 01:04:40 2011 +0200
@@ -170,3 +170,6 @@
.editable-text{cursor:pointer;}
.editable-text:hover{cursor:text;border:dotted #999999 1px;}
.text-and-autocomplete-select{background:url(fugue.png) no-repeat right -364px;}
+.icon-button.multiinput{background:url(../images/documents-stack.png) no-repeat;cursor:pointer;float:none;display:inline-block;margin-left:10px;}
+.icon-button.multiinput.disabled{background:url(../images/documents-stack-faded.png) no-repeat;cursor:auto;}
+.worflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
--- a/templates/workflow/run.mako Wed Apr 13 16:46:36 2011 -0400
+++ b/templates/workflow/run.mako Thu Apr 14 01:04:40 2011 +0200
@@ -2,7 +2,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "jquery.autocomplete" )}
+ ${h.js( "jquery.autocomplete", "jquery.tipsy" )}
<script type="text/javascript">
$( function() {
function show_tool_body(title){
@@ -20,6 +20,21 @@
show_tool_body(title);
}
}
+ function toggle_multiinput(select) {
+ if (select.attr('multiple')) {
+ $('.multiinput').removeClass('disabled');
+ if (select.val()) {
+ select.val(select.val()[0]);
+ } else {
+ select.val($('option:last', select).val());
+ }
+ select.removeAttr('multiple');
+ } else {
+ $('.multiinput').addClass('disabled');
+ $('.multiinput', select.parent().prev()).removeClass('disabled');
+ select.attr('multiple', 'multiple');
+ }
+ }
$( "select[refresh_on_change='true']").change( function() {
$( "#tool_form" ).submit();
});
@@ -41,6 +56,19 @@
$("#new_history_cbx").click(function(){
$("#new_history_input").toggle(this.checked);
});
+ $('select[name*="|input"]').removeAttr('multiple').each(function(i, s) {
+ var select = $(s);
+ select.parent().prev().append(
+ $('<span class="icon-button multiinput"></span>').click(function() {
+ if ($(this).hasClass('disabled')) return;
+ toggle_multiinput(select);
+ select.focus();
+ }).attr('original-title',
+ 'Enable/disable selection of multiple input ' +
+ 'files. Each selected file will have an ' +
+ 'instance of the workflow.').tipsy({gravity:'s'})
+ );
+ });
});
</script></%def>
--- a/templates/workflow/run_complete.mako Wed Apr 13 16:46:36 2011 -0400
+++ b/templates/workflow/run_complete.mako Thu Apr 14 01:04:40 2011 +0200
@@ -2,21 +2,25 @@
<div class="donemessagelarge">
Successfully ran workflow "${workflow.name}". The following datasets have been added to the queue:
- %if new_history:
- These datasets will appear in a new history:
- <a target='galaxy_history' href="${h.url_for( controller='history', action='list', operation="Switch", id=trans.security.encode_id(new_history.id), use_panels=False, show_deleted=False )}">
- '${h.to_unicode(new_history.name)}'.
- </a>
- %endif
- <div style="padding-left: 10px;">
- %for step_outputs in outputs.itervalues():
- %for data in step_outputs.itervalues():
- %if not new_history or data.history == new_history:
- <p><strong>${data.hid}</strong>: ${data.name}</p>
- %endif
- %endfor
- %endfor
- </div>
+ %for invocation in invocations:
+ <div class="workflow-invocation-complete">
+ %if invocation['new_history']:
+ <p>These datasets will appear in a new history:
+ <a target='galaxy_history' href="${h.url_for( controller='history', action='list', operation="Switch", id=trans.security.encode_id(invocation['new_history'].id), use_panels=False, show_deleted=False )}">
+ '${h.to_unicode(invocation['new_history'].name)}'.
+ </a></p>
+ %endif
+ <div style="padding-left: 10px;">
+ %for step_outputs in invocation['outputs'].itervalues():
+ %for data in step_outputs.itervalues():
+ %if not invocation['new_history'] or data.history == invocation['new_history']:
+ <p><strong>${data.hid}</strong>: ${data.name}</p>
+ %endif
+ %endfor
+ %endfor
+ </div>
+ </div>
+ %endfor
</div><script type="text/javascript">
http://bitbucket.org/galaxy/galaxy-central/changeset/383258d637cb/
changeset: r5380:383258d637cb
user: dannon
date: 2011-04-14 01:07:22
summary: Merge.
affected #: 6 files (3.8 KB)
--- a/lib/galaxy/tools/parameters/basic.py Wed Apr 13 19:05:45 2011 -0400
+++ b/lib/galaxy/tools/parameters/basic.py Wed Apr 13 19:07:22 2011 -0400
@@ -1421,6 +1421,14 @@
else:
return "No dataset"
+ def validate( self, value, history=None ):
+ for validator in self.validators:
+ if value and self.multiple and isinstance(value, list):
+ for v in value:
+ validator.validate( v, history )
+ else:
+ validator.validate( value, history )
+
def get_dependencies( self ):
"""
Get the *names* of the other params this param depends on.
--- a/lib/galaxy/web/controllers/workflow.py Wed Apr 13 19:05:45 2011 -0400
+++ b/lib/galaxy/web/controllers/workflow.py Wed Apr 13 19:07:22 2011 -0400
@@ -1262,96 +1262,117 @@
if kwargs:
# If kwargs were provided, the states for each step should have
# been POSTed
- for step in workflow.steps:
- step.upgrade_messages = {}
- # Connections by input name
- step.input_connections_by_name = \
- dict( ( conn.input_name, conn ) for conn in step.input_connections )
- # Extract just the arguments for this step by prefix
- p = "%s|" % step.id
- l = len(p)
- step_args = dict( ( k[l:], v ) for ( k, v ) in kwargs.iteritems() if k.startswith( p ) )
- step_errors = None
- if step.type == 'tool' or step.type is None:
- module = module_factory.from_workflow_step( trans, step )
- # Fix any missing parameters
- step.upgrade_messages = module.check_and_update_state()
- if step.upgrade_messages:
- has_upgrade_messages = True
- # Any connected input needs to have value DummyDataset (these
- # are not persisted so we need to do it every time)
- module.add_dummy_datasets( connections=step.input_connections )
- # Get the tool
- tool = module.tool
- # Get the state
- step.state = state = module.state
- # Get old errors
- old_errors = state.inputs.pop( "__errors__", {} )
- # Update the state
- step_errors = tool.update_state( trans, tool.inputs, step.state.inputs, step_args,
- update_only=True, old_errors=old_errors )
- else:
- module = step.module = module_factory.from_workflow_step( trans, step )
- state = step.state = module.decode_runtime_state( trans, step_args.pop( "tool_state" ) )
- step_errors = module.update_runtime_state( trans, state, step_args )
- if step_errors:
- errors[step.id] = state.inputs["__errors__"] = step_errors
- if 'run_workflow' in kwargs and not errors:
- new_history = None
- if 'new_history' in kwargs:
- if 'new_history_name' in kwargs and kwargs['new_history_name'] != '':
- nh_name = kwargs['new_history_name']
+ # Get the kwarg keys for data inputs
+ input_keys = filter(lambda a: a.endswith('|input'), kwargs)
+ # Example: prefixed='2|input'
+ # Check if one of them is a list
+ multiple_input_key = None
+ multiple_inputs = [None]
+ for input_key in input_keys:
+ if isinstance(kwargs[input_key], list):
+ multiple_input_key = input_key
+ multiple_inputs = kwargs[input_key]
+ # List to gather values for the template
+ invocations=[]
+ for input_number, single_input in enumerate(multiple_inputs):
+ # Example: single_input='1', single_input='2', etc...
+ # 'Fix' the kwargs, to have only the input for this iteration
+ if multiple_input_key:
+ kwargs[multiple_input_key] = single_input
+ for step in workflow.steps:
+ step.upgrade_messages = {}
+ # Connections by input name
+ step.input_connections_by_name = \
+ dict( ( conn.input_name, conn ) for conn in step.input_connections )
+ # Extract just the arguments for this step by prefix
+ p = "%s|" % step.id
+ l = len(p)
+ step_args = dict( ( k[l:], v ) for ( k, v ) in kwargs.iteritems() if k.startswith( p ) )
+ step_errors = None
+ if step.type == 'tool' or step.type is None:
+ module = module_factory.from_workflow_step( trans, step )
+ # Fix any missing parameters
+ step.upgrade_messages = module.check_and_update_state()
+ if step.upgrade_messages:
+ has_upgrade_messages = True
+ # Any connected input needs to have value DummyDataset (these
+ # are not persisted so we need to do it every time)
+ module.add_dummy_datasets( connections=step.input_connections )
+ # Get the tool
+ tool = module.tool
+ # Get the state
+ step.state = state = module.state
+ # Get old errors
+ old_errors = state.inputs.pop( "__errors__", {} )
+ # Update the state
+ step_errors = tool.update_state( trans, tool.inputs, step.state.inputs, step_args,
+ update_only=True, old_errors=old_errors )
else:
- nh_name = "History from %s workflow" % workflow.name
- new_history = trans.app.model.History( user=trans.user, name=nh_name )
- trans.sa_session.add( new_history )
- # Run each step, connecting outputs to inputs
- workflow_invocation = model.WorkflowInvocation()
- workflow_invocation.workflow = workflow
- outputs = odict()
- for i, step in enumerate( workflow.steps ):
- # Execute module
- job = None
- if step.type == 'tool' or step.type is None:
- tool = trans.app.toolbox.tools_by_id[ step.tool_id ]
- input_values = step.state.inputs
- # Connect up
- def callback( input, value, prefixed_name, prefixed_label ):
- if isinstance( input, DataToolParameter ):
- if prefixed_name in step.input_connections_by_name:
- conn = step.input_connections_by_name[ prefixed_name ]
- return outputs[ conn.output_step.id ][ conn.output_name ]
- visit_input_values( tool.inputs, step.state.inputs, callback )
- # Execute it
- job, out_data = tool.execute( trans, step.state.inputs, history=new_history)
- outputs[ step.id ] = out_data
- # Create new PJA associations with the created job, to be run on completion.
- # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
- # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
- replacement_dict = {}
- for k, v in kwargs.iteritems():
- if k.startswith('wf_parm|'):
- replacement_dict[k[8:]] = v
- for pja in step.post_job_actions:
- if pja.action_type in ActionBox.immediate_actions:
- ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict)
- else:
- job.add_post_job_action(pja)
- else:
- job, out_data = step.module.execute( trans, step.state )
- outputs[ step.id ] = out_data
- # Record invocation
- workflow_invocation_step = model.WorkflowInvocationStep()
- workflow_invocation_step.workflow_invocation = workflow_invocation
- workflow_invocation_step.workflow_step = step
- workflow_invocation_step.job = job
- # All jobs ran sucessfully, so we can save now
- trans.sa_session.add( workflow_invocation )
- trans.sa_session.flush()
- return trans.fill_template( "workflow/run_complete.mako",
- workflow=stored,
- outputs=outputs,
- new_history=new_history )
+ # Fix this for multiple inputs
+ module = step.module = module_factory.from_workflow_step( trans, step )
+ state = step.state = module.decode_runtime_state( trans, step_args.pop( "tool_state" ) )
+ step_errors = module.update_runtime_state( trans, state, step_args )
+ if step_errors:
+ errors[step.id] = state.inputs["__errors__"] = step_errors
+ if 'run_workflow' in kwargs and not errors:
+ new_history = None
+ if 'new_history' in kwargs:
+ if 'new_history_name' in kwargs and kwargs['new_history_name'] != '':
+ nh_name = kwargs['new_history_name']
+ else:
+ nh_name = "History from %s workflow" % workflow.name
+ if multiple_input_key:
+ nh_name = '%s %d' % (nh_name, input_number + 1)
+ new_history = trans.app.model.History( user=trans.user, name=nh_name )
+ trans.sa_session.add( new_history )
+ # Run each step, connecting outputs to inputs
+ workflow_invocation = model.WorkflowInvocation()
+ workflow_invocation.workflow = workflow
+ outputs = odict()
+ for i, step in enumerate( workflow.steps ):
+ # Execute module
+ job = None
+ if step.type == 'tool' or step.type is None:
+ tool = trans.app.toolbox.tools_by_id[ step.tool_id ]
+ input_values = step.state.inputs
+ # Connect up
+ def callback( input, value, prefixed_name, prefixed_label ):
+ if isinstance( input, DataToolParameter ):
+ if prefixed_name in step.input_connections_by_name:
+ conn = step.input_connections_by_name[ prefixed_name ]
+ return outputs[ conn.output_step.id ][ conn.output_name ]
+ visit_input_values( tool.inputs, step.state.inputs, callback )
+ # Execute it
+ job, out_data = tool.execute( trans, step.state.inputs, history=new_history)
+ outputs[ step.id ] = out_data
+ # Create new PJA associations with the created job, to be run on completion.
+ # PJA Parameter Replacement (only applies to immediate actions-- rename specifically, for now)
+ # Pass along replacement dict with the execution of the PJA so we don't have to modify the object.
+ replacement_dict = {}
+ for k, v in kwargs.iteritems():
+ if k.startswith('wf_parm|'):
+ replacement_dict[k[8:]] = v
+ for pja in step.post_job_actions:
+ if pja.action_type in ActionBox.immediate_actions:
+ ActionBox.execute(trans.app, trans.sa_session, pja, job, replacement_dict)
+ else:
+ job.add_post_job_action(pja)
+ else:
+ job, out_data = step.module.execute( trans, step.state )
+ outputs[ step.id ] = out_data
+ # Record invocation
+ workflow_invocation_step = model.WorkflowInvocationStep()
+ workflow_invocation_step.workflow_invocation = workflow_invocation
+ workflow_invocation_step.workflow_step = step
+ workflow_invocation_step.job = job
+ # All jobs ran sucessfully, so we can save now
+ trans.sa_session.add( workflow_invocation )
+ invocations.append({'outputs': outputs,
+ 'new_history': new_history})
+ trans.sa_session.flush()
+ return trans.fill_template( "workflow/run_complete.mako",
+ workflow=stored,
+ invocations=invocations )
else:
# Prepare each step
missing_tools = []
@@ -1816,4 +1837,4 @@
cleanup( prefix, input.cases[current_case].inputs, group_values )
cleanup( "", inputs, values )
return associations
-
\ No newline at end of file
+
--- a/lib/galaxy/workflow/modules.py Wed Apr 13 19:05:45 2011 -0400
+++ b/lib/galaxy/workflow/modules.py Wed Apr 13 19:07:22 2011 -0400
@@ -131,7 +131,7 @@
def get_runtime_inputs( self, filter_set=['data'] ):
label = self.state.get( "name", "Input Dataset" )
- return dict( input=DataToolParameter( None, Element( "param", name="input", label=label, type="data", format=', '.join(filter_set) ) ) )
+ return dict( input=DataToolParameter( None, Element( "param", name="input", label=label, multiple=True, type="data", format=', '.join(filter_set) ) ) )
def get_runtime_state( self ):
state = DefaultToolState()
state.inputs = dict( input=None )
--- a/static/june_2007_style/blue/base.css Wed Apr 13 19:05:45 2011 -0400
+++ b/static/june_2007_style/blue/base.css Wed Apr 13 19:07:22 2011 -0400
@@ -170,3 +170,6 @@
.editable-text{cursor:pointer;}
.editable-text:hover{cursor:text;border:dotted #999999 1px;}
.text-and-autocomplete-select{background:url(fugue.png) no-repeat right -364px;}
+.icon-button.multiinput{background:url(../images/documents-stack.png) no-repeat;cursor:pointer;float:none;display:inline-block;margin-left:10px;}
+.icon-button.multiinput.disabled{background:url(../images/documents-stack-faded.png) no-repeat;cursor:auto;}
+.worflow-invocation-complete{border:solid 1px #6A6;border-left-width:5px;margin:10px 0;}
--- a/templates/workflow/run.mako Wed Apr 13 19:05:45 2011 -0400
+++ b/templates/workflow/run.mako Wed Apr 13 19:07:22 2011 -0400
@@ -2,7 +2,7 @@
<%def name="javascripts()">
${parent.javascripts()}
- ${h.js( "jquery.autocomplete" )}
+ ${h.js( "jquery.autocomplete", "jquery.tipsy" )}
<script type="text/javascript">
$( function() {
function show_tool_body(title){
@@ -20,6 +20,21 @@
show_tool_body(title);
}
}
+ function toggle_multiinput(select) {
+ if (select.attr('multiple')) {
+ $('.multiinput').removeClass('disabled');
+ if (select.val()) {
+ select.val(select.val()[0]);
+ } else {
+ select.val($('option:last', select).val());
+ }
+ select.removeAttr('multiple');
+ } else {
+ $('.multiinput').addClass('disabled');
+ $('.multiinput', select.parent().prev()).removeClass('disabled');
+ select.attr('multiple', 'multiple');
+ }
+ }
$( "select[refresh_on_change='true']").change( function() {
$( "#tool_form" ).submit();
});
@@ -41,6 +56,19 @@
$("#new_history_cbx").click(function(){
$("#new_history_input").toggle(this.checked);
});
+ $('select[name*="|input"]').removeAttr('multiple').each(function(i, s) {
+ var select = $(s);
+ select.parent().prev().append(
+ $('<span class="icon-button multiinput"></span>').click(function() {
+ if ($(this).hasClass('disabled')) return;
+ toggle_multiinput(select);
+ select.focus();
+ }).attr('original-title',
+ 'Enable/disable selection of multiple input ' +
+ 'files. Each selected file will have an ' +
+ 'instance of the workflow.').tipsy({gravity:'s'})
+ );
+ });
});
</script></%def>
--- a/templates/workflow/run_complete.mako Wed Apr 13 19:05:45 2011 -0400
+++ b/templates/workflow/run_complete.mako Wed Apr 13 19:07:22 2011 -0400
@@ -2,21 +2,25 @@
<div class="donemessagelarge">
Successfully ran workflow "${workflow.name}". The following datasets have been added to the queue:
- %if new_history:
- These datasets will appear in a new history:
- <a target='galaxy_history' href="${h.url_for( controller='history', action='list', operation="Switch", id=trans.security.encode_id(new_history.id), use_panels=False, show_deleted=False )}">
- '${h.to_unicode(new_history.name)}'.
- </a>
- %endif
- <div style="padding-left: 10px;">
- %for step_outputs in outputs.itervalues():
- %for data in step_outputs.itervalues():
- %if not new_history or data.history == new_history:
- <p><strong>${data.hid}</strong>: ${data.name}</p>
- %endif
- %endfor
- %endfor
- </div>
+ %for invocation in invocations:
+ <div class="workflow-invocation-complete">
+ %if invocation['new_history']:
+ <p>These datasets will appear in a new history:
+ <a target='galaxy_history' href="${h.url_for( controller='history', action='list', operation="Switch", id=trans.security.encode_id(invocation['new_history'].id), use_panels=False, show_deleted=False )}">
+ '${h.to_unicode(invocation['new_history'].name)}'.
+ </a></p>
+ %endif
+ <div style="padding-left: 10px;">
+ %for step_outputs in invocation['outputs'].itervalues():
+ %for data in step_outputs.itervalues():
+ %if not invocation['new_history'] or data.history == invocation['new_history']:
+ <p><strong>${data.hid}</strong>: ${data.name}</p>
+ %endif
+ %endfor
+ %endfor
+ </div>
+ </div>
+ %endfor
</div><script type="text/javascript">
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/acee660871cd/
changeset: r5375:acee660871cd
user: jgoecks
date: 2011-04-14 00:09:07
summary: Add Tile objects to trackster to support better tracking of Tile data properties; use SummaryTreeTile objects to ensure that feature track coverage histograms are drawn with the same max. Some refactoring of TiledTrack.draw() done as well for simplicity. Finally, fixed typos and GFF display bugs.
affected #: 1 file (1.8 KB)
--- a/static/scripts/trackster.js Wed Apr 13 16:05:34 2011 -0400
+++ b/static/scripts/trackster.js Wed Apr 13 18:09:07 2011 -0400
@@ -741,7 +741,7 @@
this.high = Math.ceil(high);
// 10^log10(range / DENSITY) Close approximation for browser window, assuming DENSITY = window width
- this.resolution = Math.pow( 10, Math.ceil( Math.log( (this.high - this.low) / 200 ) / Math.LN10 ) );
+ this.resolution = Math.pow( 10, Math.ceil( Math.log( (this.high - this.low) / DENSITY ) / Math.LN10 ) );
this.zoom_res = Math.pow( FEATURE_LEVELS, Math.max(0,Math.ceil( Math.log( this.resolution, FEATURE_LEVELS ) / Math.log(FEATURE_LEVELS) )));
// Overview
@@ -1016,14 +1016,16 @@
return false;
},
/**
- * Returns true iff element is in [low, high]; range is inclusive.
+ * Returns true if (a) element's value is in [low, high] (range is inclusive)
+ * or (b) if value is non-numeric and hence unfilterable.
*/
keep: function(element) {
if ( !this.applies_to( element ) ) {
// No element to filter on.
return true;
}
- return (element[this.index] >= this.low && element[this.index] <= this.high);
+ var val = parseInt(element[this.index]);
+ return (isNaN(val) || (val >= this.low && val <= this.high));
},
/**
* Update filter's min and max values based on element's values.
@@ -1306,11 +1308,22 @@
});
/**
- * Tiles for TiledTracks.
+ * Tiles drawn by tracks.
*/
-var Tile = function(track, canvas) {
- this.track = track;
- this.canvas = canvas;
+var Tile = function(index, resolution, canvas) {
+ // Wrap element in div for background
+ this.index = index;
+ this.resolution = resolution;
+ this.canvas = $("<div class='track-tile'/>").append(canvas);
+};
+
+var SummaryTreeTile = function(index, resolution, canvas, max_val) {
+ Tile.call(this, index, resolution, canvas);
+ this.max_val = max_val;
+};
+
+var FeatureTrackTile = function(index, resolution, canvas) {
+ Tile.call(this, index, resolution, canvas);
};
/**
@@ -1669,30 +1682,33 @@
// w_scale units are pixels per base.
w_scale = width / range,
resolution = this.view.resolution,
- parent_element = $("<div style='position: relative;'></div>");
+ parent_element = $("<div style='position: relative;'></div>"),
+ gen_key = function(width, w_scale, tile_index) {
+ return width + '_' + w_scale + '_' + tile_index;
+ };
if (!clear_after) { this.content_div.children().remove(); }
this.content_div.append( parent_element );
this.max_height = 0;
// Index of first tile that overlaps visible region
var tile_index = Math.floor( low / resolution / DENSITY );
- // A set of setTimeout() ids used when drawing tiles. Each ID indicates
- // a tile has been requested to be drawn or is being drawn.
- var draw_tile_dict = {};
+ // A list of tiles drawn/retrieved.
+ var drawn_tiles = [];
+ var tile_count = 0
while ( ( tile_index * DENSITY * resolution ) < high ) {
// Check in cache
- var key = width + '_' + w_scale + '_' + tile_index;
+ var key = gen_key(width, w_scale, tile_index);
var cached = this.tile_cache.get(key);
var tile_low = tile_index * DENSITY * this.view.resolution;
var tile_high = tile_low + DENSITY * this.view.resolution;
- // console.log(cached, this.tile_cache);
if ( !force && cached ) {
+ drawn_tiles[drawn_tiles.length] = cached;
this.show_tile(cached, parent_element, tile_low, w_scale);
} else {
- this.delayed_draw(force, key, tile_low, tile_high, tile_index,
- resolution, parent_element, w_scale, draw_tile_dict);
+ this.delayed_draw(force, key, tile_index, resolution, parent_element, w_scale, drawn_tiles);
}
tile_index += 1;
+ tile_count++;
}
//
@@ -1700,7 +1716,7 @@
//
var track = this;
var intervalId = setInterval(function() {
- if (obj_length(draw_tile_dict) === 0) {
+ if (drawn_tiles.length === tile_count) {
// All tiles have been drawn.
clearInterval(intervalId);
@@ -1725,6 +1741,29 @@
}
//
+ // If mode is Histogram and tiles do not share max, redraw tiles as necessary using new max.
+ //
+ if (track.mode == "Histogram") {
+ // Get global max.
+ var global_max = -1;
+ for (var i = 0; i < drawn_tiles.length; i++) {
+ var cur_max = drawn_tiles[i].max_val;
+ if (cur_max > global_max) {
+ global_max = cur_max;
+ }
+ }
+
+ for (var i = 0; i < drawn_tiles.length; i++) {
+ if (drawn_tiles[i].max_val !== global_max) {
+ var tile = drawn_tiles[i];
+ tile.canvas.remove();
+ track.delayed_draw(true, gen_key(width, w_scale, tile.index), tile.index,
+ tile.resolution, parent_element, w_scale, [], { max: global_max });
+ }
+ }
+ }
+
+ //
// Update filter attributes, UI.
//
@@ -1755,6 +1794,19 @@
track.make_name_popup_menu();
}
}
+
+ // Store initial canvas in case we need to use it for overview
+ /* This is completely broken, just saves the first tile it sees
+ regardless of if it should be the overview
+ if (!track.initial_canvas && !window.G_vmlCanvasManager) {
+ track.initial_canvas = $(tile_element).clone();
+ var src_ctx = tile_element.get(0).getContext("2d");
+ var tgt_ctx = track.initial_canvas.get(0).getContext("2d");
+ var data = src_ctx.getImageData(0, 0, src_ctx.canvas.width, src_ctx.canvas.height);
+ tgt_ctx.putImageData(data, 0, 0);
+ track.set_overview();
+ }
+ */
}
}, 50);
@@ -1765,44 +1817,28 @@
this.child_tracks[i].draw(force, clear_after);
}
},
- delayed_draw: function(force, key, tile_low, tile_high, tile_index, resolution, parent_element, w_scale, draw_tile_dict) {
- var track = this;
- // Put a 50ms delay on drawing so that if the user scrolls fast, we don't load extra data
+ delayed_draw: function(force, key, tile_index, resolution, parent_element, w_scale, drawn_tiles, more_tile_data) {
+ var track = this,
+ tile_low = tile_index * DENSITY * resolution,
+ tile_high = tile_low + DENSITY * resolution;
+
+ // Helper method.
var draw_and_show_tile = function(id, result, resolution, tile_index, parent_element, w_scale, seq_data) {
// DEBUG: this is still called too many times when moving slowly,
// console.log( "draw_and_show_tile", resolution, tile_index, w_scale );
- returned_tile = track.draw_tile(result, resolution, tile_index, parent_element, w_scale, seq_data)
-
- // Wrap element in div for background
- var wrapper_element = $("<div class='track-tile'>").prepend(returned_tile);
- tile_element = wrapper_element;
-
- track.tile_cache.set(key, tile_element);
- track.show_tile(tile_element, parent_element, tile_low, w_scale);
-
- // TODO: this should go in a post-draw function.
- // Store initial canvas in case we need to use it for overview
- /* This is completely broken, just saves the first tile it sees
- regardless of if it should be the overview
- if (!track.initial_canvas && !window.G_vmlCanvasManager) {
- track.initial_canvas = $(tile_element).clone();
- var src_ctx = tile_element.get(0).getContext("2d");
- var tgt_ctx = track.initial_canvas.get(0).getContext("2d");
- var data = src_ctx.getImageData(0, 0, src_ctx.canvas.width, src_ctx.canvas.height);
- tgt_ctx.putImageData(data, 0, 0);
- track.set_overview();
- }
- */
-
- delete draw_tile_dict[id];
+ var tile = track.draw_tile(result, resolution, tile_index, parent_element, w_scale, seq_data);
+ track.tile_cache.set(key, tile);
+ track.show_tile(tile, parent_element, tile_low, w_scale);
+ drawn_tiles[drawn_tiles.length] = tile;
};
+ // Put a 50ms delay on drawing so that if the user scrolls fast, we don't load extra data
var id = setTimeout(function() {
if (tile_low <= track.view.high && tile_high >= track.view.low) {
// Show/draw tile: check cache for tile; if tile not in cache, draw it.
- var tile_element = (force ? undefined : track.tile_cache.get(key));
- if (tile_element) {
- track.show_tile(tile_element, parent_element, tile_low, w_scale);
- delete draw_tile_dict[id];
+ var tile = (force ? undefined : track.tile_cache.get(key));
+ if (tile) {
+ track.show_tile(tile, parent_element, tile_low, w_scale);
+ drawn_tiles[drawn_tiles.length] = tile;
}
else {
//
@@ -1810,6 +1846,7 @@
//
$.when(track.data_cache.get_data(view.chrom, tile_low, tile_high, track.mode,
resolution, track.data_url_extra_params)).then(function(tile_data) {
+ extend(tile_data, more_tile_data);
// If sequence data needed, get that and draw. Otherwise draw.
if (view.reference_track && w_scale > view.canvas_manager.char_width_px) {
$.when(view.reference_track.data_cache.get_data(view.chrom, tile_low, tile_high,
@@ -1825,12 +1862,11 @@
}
}
}, 50);
- draw_tile_dict[id] = true;
},
/**
* Show track tile and perform associated actions.
*/
- show_tile: function(tile_element, parent_element, tile_low, w_scale) {
+ show_tile: function(tile, parent_element, tile_low, w_scale) {
// Readability.
var track = this;
@@ -1844,6 +1880,7 @@
if (this.left_offset) {
left -= this.left_offset;
}
+ var tile_element = tile.canvas;
tile_element.css({ position: 'absolute', top: 0, left: left, height: '' });
// Setup and show tile element.
@@ -1966,7 +2003,7 @@
var c_start = Math.round(c * w_scale);
ctx.fillText(seq[c], c_start + track.left_offset, 10);
}
- return canvas;
+ return new Tile(tile_index, resolution, canvas);
}
this.content_div.css("height", "0px");
}
@@ -2106,7 +2143,7 @@
this.prefs, this.mode );
painter.draw( ctx, width, height );
- return canvas;
+ return new Tile(tile_length, resolution, canvas);
}
});
@@ -2196,11 +2233,14 @@
* position. Return value is a dict with keys 'data', 'delta' (bin size) and 'max.' Data
* is a two-item list; first item is bin start, second is bin's count.
*/
- get_summary_tree_data: function(data, low, high, bin_size) {
- var num_bins = Math.floor((high - low)/bin_size),
+ get_summary_tree_data: function(data, low, high, num_bins) {
+ if (num_bins > high - low) {
+ num_bins = high - low;
+ }
+ var bin_size = Math.floor((high - low)/num_bins),
bins = [],
max_count = 0;
-
+
/*
// For debugging:
for (var i = 0; i < data.length; i++)
@@ -2335,8 +2375,7 @@
// Deal with left_offset by translating
ctx.translate( left_offset, SUMMARY_TREE_TOP_PADDING );
painter.draw( ctx, width, required_height );
- // Canvas element is returned
- return canvas;
+ return new SummaryTreeTile(tile_index, resolution, canvas, result.max);
}
// Drawing coverage histogram. This is different from summary tree because data can feature
@@ -2359,13 +2398,15 @@
canvas.height = required_height + SUMMARY_TREE_TOP_PADDING;
// Paint summary tree into canvas.
var binned_data = this.get_summary_tree_data(result.data, tile_low, tile_high, 200);
+ if (result.max) {
+ binned_data.max = result.max;
+ }
var painter = new painters.SummaryTreePainter(binned_data, tile_low, tile_high, this.prefs);
var ctx = canvas.getContext("2d");
// Deal with left_offset by translating
ctx.translate(left_offset, SUMMARY_TREE_TOP_PADDING);
painter.draw(ctx, width, required_height);
- // Canvas element is returned
- return canvas;
+ return new SummaryTreeTile(tile_index, resolution, canvas, binned_data.max);
}
// Start dealing with row-by-row tracks
@@ -2433,7 +2474,7 @@
// If there's no data, return.
if (!result.data) {
- return canvas;
+ return new Tile(tile_index, resolution, canvas);
}
}
@@ -2444,7 +2485,7 @@
ctx.translate( left_offset, ERROR_PADDING );
painter.draw( ctx, width, required_height, slots );
- return canvas;
+ return new FeatureTrackTile(tile_index, resolution, canvas);
}
});
@@ -2558,7 +2599,7 @@
this.include_label = include_label;
this.max_rows = max_rows;
this.measureText = measureText;
-}
+};
/**
* Slot a set of features, `this.slots` will be updated with slots by id, and
@@ -2704,7 +2745,7 @@
// ---- Painters ----
var painters_module = function(require, exports){
-
+
/**
* Draw a dashed line on a canvas using filled rectangles. This function is based on:
* http://vetruvet.blogspot.com/2010/10/drawing-dashed-lines-on-html5-canvas.h…
@@ -2776,7 +2817,7 @@
Painter.call( this, data, view_start, view_end, prefs, mode );
}
-SummaryTreePainter.prototype.default_prefis = { show_counts: false };
+SummaryTreePainter.prototype.default_prefs = { show_counts: false };
SummaryTreePainter.prototype.draw = function( ctx, width, height ) {
@@ -2790,16 +2831,15 @@
// max rectangle is required_height.
base_y = height;
delta_x_px = Math.ceil(delta * w_scale);
-
ctx.save();
for (var i = 0, len = points.length; i < len; i++) {
-
var x = Math.floor( (points[i][0] - view_start) * w_scale );
var y = points[i][1];
if (!y) { continue; }
- var y_px = y / max * height;
+ var y_px = y / max * height
+ if (y !== 0 && y_px < 1) { y_px = 1; }
ctx.fillStyle = "black";
ctx.fillRect( x, base_y - y_px, delta_x_px, y_px );
@@ -2991,7 +3031,7 @@
}
});
-// Contstants specific to feature tracks moved here (HACKING, these should
+// Constants specific to feature tracks moved here (HACKING, these should
// basically all be configuration options)
var DENSE_TRACK_HEIGHT = 10,
NO_DETAIL_TRACK_HEIGHT = 3,
@@ -3034,8 +3074,7 @@
var
feature_uid = feature[0],
feature_start = feature[1],
- // -1 b/c intervals are half-open.
- feature_end = feature[2] - 1,
+ feature_end = feature[2],
feature_name = feature[3],
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)) ),
@@ -3134,8 +3173,7 @@
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) ),
- // -1 b/c intervals are half-open.
- block_end = Math.ceil( Math.min(width, Math.max((block[1] - 1 - 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; }
@@ -3199,8 +3237,7 @@
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_end = feature[2],
feature_name = feature[3],
// All features need a start, end, and vertical center.
f_start = Math.floor( Math.max(0, (feature_start - tile_low) * w_scale) ),
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: Streamline the process of importing library datasets into histories:
by Bitbucket 13 Apr '11
by Bitbucket 13 Apr '11
13 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/1ff9cb03b742/
changeset: r5374:1ff9cb03b742
user: greg
date: 2011-04-13 22:05:34
summary: Streamline the process of importing library datasets into histories:
1) Allow imports from the admin view instead of just the Data Libraries view.
2) Add a new 1-click option when acting on multiple selected library datasets to import them into the current history.
3) when importing selected library datasets into selected histories, make the current history selected by default.
4) Add the ability to import the current library dataset into a selected history when viewing the library dataset info page.
affected #: 4 files (2.0 KB)
--- a/lib/galaxy/web/controllers/library_common.py Wed Apr 13 13:52:05 2011 -0400
+++ b/lib/galaxy/web/controllers/library_common.py Wed Apr 13 16:05:34 2011 -0400
@@ -858,7 +858,7 @@
message += "Click the Go button at the bottom of this page to edit the permissions on these datasets if necessary."
default_action = 'manage_permissions'
else:
- default_action = 'import_to_histories'
+ default_action = 'import_to_current_history'
trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -1238,7 +1238,7 @@
message += "Click the Go button at the bottom of this page to edit the permissions on these datasets if necessary."
default_action = 'manage_permissions'
else:
- default_action = 'import_to_histories'
+ default_action = 'import_to_current_history'
return trans.response.send_redirect( web.url_for( controller='library_common',
action='browse_library',
cntrller=cntrller,
@@ -1547,6 +1547,7 @@
error = False
is_admin = trans.user_is_admin() and cntrller == 'library_admin'
current_user_roles = trans.get_current_user_roles()
+ current_history = trans.get_history()
if not ldda_ids:
error = True
message = 'You must select at least one dataset.'
@@ -1554,16 +1555,27 @@
error = True
message = 'You must select an action to perform on the selected datasets.'
else:
- if action == 'import_to_histories':
+ if action in [ 'import_to_current_history', 'import_to_histories' ]:
+ new_kwd = {}
+ if action == 'import_to_current_history':
+ encoded_current_history_id = trans.security.encode_id( current_history.id )
+ selected_history_id = encoded_current_history_id
+ new_kwd[ 'do_action' ] = action
+ new_kwd[ 'target_history_ids' ] = encoded_current_history_id
+ new_kwd[ 'import_datasets_to_histories_button' ] = 'Import library datasets'
+ else:
+ selected_history_id = ''
return trans.response.send_redirect( web.url_for( controller='library_common',
action='import_datasets_to_histories',
cntrller=cntrller,
library_id=library_id,
+ selected_history_id=selected_history_id,
ldda_ids=ldda_ids,
use_panels=use_panels,
show_deleted=show_deleted,
message=message,
- status=status ) )
+ status=status,
+ **new_kwd ) )
if action == 'move':
if library_id in [ 'none', 'None', None ]:
source_library_id = ''
@@ -1808,8 +1820,10 @@
status = params.get( 'status', 'done' )
show_deleted = util.string_as_bool( params.get( 'show_deleted', False ) )
use_panels = util.string_as_bool( params.get( 'use_panels', False ) )
+ action = params.get( 'do_action', None )
user = trans.get_user()
current_history = trans.get_history()
+ selected_history_id = params.get( 'selected_history_id', trans.security.encode_id( current_history.id ) )
if library_id:
library = trans.sa_session.query( trans.model.Library ).get( trans.security.decode_id( library_id ) )
else:
@@ -1886,11 +1900,20 @@
target_histories = [ current_history ]
if user:
target_histories = user.active_histories
+ if action == 'import_to_current_history' and library_id:
+ # To streamline this as much as possible, go back to browsing the library.
+ return trans.response.send_redirect( web.url_for( controller='library_common',
+ action='browse_library',
+ cntrller=cntrller,
+ id=library_id,
+ message=util.sanitize_text( message ),
+ status=status ) )
return trans.fill_template( "/library/common/import_datasets_to_histories.mako",
cntrller=cntrller,
library=library,
- current_history=trans.get_history(),
+ current_history=current_history,
ldda_ids=ldda_ids,
+ selected_history_id=selected_history_id,
target_history_ids=target_history_ids,
source_lddas=source_lddas,
target_histories=target_histories,
--- a/templates/library/common/common.mako Wed Apr 13 13:52:05 2011 -0400
+++ b/templates/library/common/common.mako Wed Apr 13 16:05:34 2011 -0400
@@ -403,11 +403,12 @@
For selected datasets:
<select name="do_action" id="action_on_selected_items">
%if can_import_to_histories:
- %if not is_admin and default_action == 'import_to_histories':
- <option value="import_to_histories" selected>Import to histories</option>
+ %if default_action == 'import_to_current_history':
+ <option value="import_to_current_history" selected>Import to current history</option>
%else:
- <option value="import_to_histories">Import to histories</option>
+ <option value="import_to_current_history">Import to current history</option>
%endif
+ <option value="import_to_histories">Import to histories</option>
%endif
%if can_manage_permissions:
%if not is_admin and default_action == 'manage_permissions':
--- a/templates/library/common/import_datasets_to_histories.mako Wed Apr 13 13:52:05 2011 -0400
+++ b/templates/library/common/import_datasets_to_histories.mako Wed Apr 13 16:05:34 2011 -0400
@@ -50,16 +50,19 @@
<div class="toolFormBody"><div class="form-row" id="single-destination"><select id="single-dest-select" name="target_history_ids">
- <option value=""></option>
%for i, target_history in enumerate( target_histories ):
<%
encoded_id = trans.security.encode_id( target_history.id )
+ if encoded_id == selected_history_id:
+ selected_text = " selected"
+ else:
+ selected_text = ""
if target_history == current_history:
current_history_text = " (current history)"
else:
current_history_text = ""
%>
- <option value="${encoded_id}">${i + 1}: ${h.truncate( target_history.name, 30 )}${current_history_text}</option>
+ <option value="${encoded_id}"${selected_text}>${i + 1}: ${h.truncate( target_history.name, 30 )}${current_history_text}</option>
%endfor
</select><br/><br/>
--- a/templates/library/common/ldda_info.mako Wed Apr 13 13:52:05 2011 -0400
+++ b/templates/library/common/ldda_info.mako Wed Apr 13 16:05:34 2011 -0400
@@ -65,8 +65,8 @@
%if current_version and can_modify:
<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( ldda.library_dataset.folder.id ), replace_id=trans.security.encode_id( ldda.library_dataset.id ) )}">Upload a new version of this dataset</a>
%endif
- %if cntrller=='library' and ldda.has_data():
- <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 ), ldda_ids=trans.security.encode_id( ldda.id ), use_panels=use_panels, show_deleted=show_deleted )}">Select histories to import this dataset</a>
+ %if ldda.has_data():
+ <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 ), ldda_ids=trans.security.encode_id( ldda.id ), use_panels=use_panels, show_deleted=show_deleted )}">Import this dataset into selected histories</a><a class="action-button" href="${h.url_for( controller='library_common', action='download_dataset_from_folder', cntrller=cntrller, id=trans.security.encode_id( ldda.id ), library_id=trans.security.encode_id( library.id ), use_panels=use_panels, show_deleted=show_deleted )}">Download this dataset</a>
%endif
%if show_associated_hdas_and_lddas:
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/f1a250bbff0b/
changeset: r5373:f1a250bbff0b
user: greg
date: 2011-04-13 19:52:05
summary: 1. Add support for manual file transfer from external services to a Galaxy data library using scp. This is currently enabled via the enable_beta_job_managers flag. This should not currently be used because it hits the db significantly to determine if dererred jobs are queued for running. The plan is to use messaging for this, but that approach is not yet implemented. Rabbit mq is still being used to enable manual file transfer to Galaxy data libraries when the enable_beta_job_managers flag is not set.
2. Clean up the code that renders the jquery file browser plugin - things work much cleaner now. One remaining item is handing the issue where rsh / ssh keys are not set. Also clean up a lot of code related to manual file transfers in the requests_admin controller.
3. In addition to the new ManualDataTransferPlugin, add the Pacific Biosciences SMRTPortalPlugin that automatically transfers files produced by SMRT Portal to a Galaxy data library.
4. Add the external service type config for Pac Bio SMRT Portal version 1.1.0.
affected #: 17 files (6.9 KB)
--- a/external_service_types/454_life_sciences.xml Tue Apr 12 23:41:06 2011 -0400
+++ b/external_service_types/454_life_sciences.xml Wed Apr 13 13:52:05 2011 -0400
@@ -3,7 +3,7 @@
<version>1</version><data_transfer_settings>
- <data_transfer type='scp' automatic_transfer='False' host='host' user_name='user_name' password='password' data_location='data_location' />
+ <data_transfer protocol='scp' automatic_transfer='False' host='host' user_name='user_name' password='password' data_location='data_location' /></data_transfer_settings><run_details>
--- a/external_service_types/applied_biosystems_solid.xml Tue Apr 12 23:41:06 2011 -0400
+++ b/external_service_types/applied_biosystems_solid.xml Wed Apr 13 13:52:05 2011 -0400
@@ -3,7 +3,7 @@
<version>3</version><data_transfer_settings>
- <data_transfer type='scp' automatic_transfer='False' host='host' user_name='user_name' password='password' data_location='data_location' rename_dataset='rename_dataset' />
+ <data_transfer protocol='scp' automatic_transfer='False' host='host' user_name='user_name' password='password' data_location='data_location' rename_dataset='rename_dataset' /></data_transfer_settings><run_details>
@@ -31,7 +31,7 @@
<field name="dataset2_name" type="text" label="Sample run output 2" description="" value="Quality file" required="True" /><field name="dataset2_datatype" type="text" label="Sample run datatype 2" description="" value="qual" required="True" /><field name="dataset3_name" type="text" label="Sample run output 3" description="" value="STATS file" required="True" />
- <field name="dataset3_datatype" type="text" label="Sample run datatype 3" description="" value="stats" required="True" />
+ <field name="dataset3_datatype" type="text" label="Sample run datatype 3" description="" value="txt" required="True" /></fields></form>
--- a/external_service_types/simple_unknown_sequencer.xml Tue Apr 12 23:41:06 2011 -0400
+++ b/external_service_types/simple_unknown_sequencer.xml Wed Apr 13 13:52:05 2011 -0400
@@ -7,7 +7,7 @@
<description></description><version></version><data_transfer_settings>
- <data_transfer type='scp' automatic_transfer='False' host='host' user_name='user_name' password='password' data_location='data_location'/>
+ <data_transfer protocol='scp' automatic_transfer='False' host='host' user_name='user_name' password='password' data_location='data_location'/></data_transfer_settings><form type="external_service" name="Simple unknown sequencer form" description=""><fields>
--- a/lib/galaxy/jobs/deferred/__init__.py Tue Apr 12 23:41:06 2011 -0400
+++ b/lib/galaxy/jobs/deferred/__init__.py Wed Apr 13 13:52:05 2011 -0400
@@ -26,7 +26,6 @@
self.monitor_thread = threading.Thread( target=self.__monitor )
self.monitor_thread.start()
log.info( 'Deferred job queue started' )
-
def _load_plugins( self ):
for fname in os.listdir( os.path.dirname( __file__ ) ):
if not fname.startswith( '_' ) and fname.endswith( '.py' ):
@@ -53,7 +52,6 @@
self.plugins[obj] = plugin( self.app )
self.plugins[obj].job_states = self.job_states
log.debug( 'Loaded deferred job plugin: %s' % display_name )
-
def __check_jobs_at_startup( self ):
waiting_jobs = self.sa_session.query( model.DeferredJob ) \
.filter( model.DeferredJob.state == model.DeferredJob.states.WAITING ).all()
@@ -66,7 +64,6 @@
# Pass the job ID as opposed to the job, since the monitor thread
# needs to load it in its own threadlocal scoped session.
self.waiting_jobs.append( job.id )
-
def __monitor( self ):
while self.running:
try:
@@ -75,7 +72,6 @@
log.exception( 'Exception in monitor_step' )
self.sleeper.sleep( 1 )
log.info( 'job queue stopped' )
-
def __monitor_step( self ):
# TODO: Querying the database with this frequency is bad, we need message passing
new_jobs = self.sa_session.query( model.DeferredJob ) \
@@ -121,7 +117,6 @@
else:
new_waiting.append( job )
self.waiting_jobs = new_waiting
-
def __check_job_plugin( self, job ):
if job.plugin not in self.plugins:
log.error( 'Invalid deferred job plugin: %s' ) % job.plugin
@@ -130,15 +125,12 @@
self.sa_session.flush()
return False
return True
-
def __check_if_ready_to_run( self, job ):
return self.plugins[job.plugin].check_job( job )
-
def __fail_job( self, job ):
job.state = model.DeferredJob.states.ERROR
self.sa_session.add( job )
self.sa_session.flush()
-
def shutdown( self ):
self.running = False
self.sleeper.wake()
@@ -158,3 +150,34 @@
self.condition.acquire()
self.condition.notify()
self.condition.release()
+
+class FakeTrans( object ):
+ """A fake trans for calling the external set metadata tool"""
+ def __init__( self, app, history=None, user=None):
+ class Dummy( object ):
+ def __init__( self ):
+ self.id = None
+ self.app = app
+ self.sa_session = app.model.context.current
+ self.dummy = Dummy()
+ self.history = history
+ self.user = user
+ self.model = app.model
+ def get_galaxy_session( self ):
+ return self.dummy
+ def log_event( self, message, tool_id=None ):
+ pass
+ def get_current_user_roles( self ):
+ if self.user:
+ return self.user.all_roles()
+ else:
+ return []
+ def db_dataset_for( self, dbkey ):
+ if self.history is None:
+ return None
+ datasets = self.sa_session.query( self.app.model.HistoryDatasetAssociation ) \
+ .filter_by( deleted=False, history_id=self.history.id, extension="len" )
+ for ds in datasets:
+ if dbkey == ds.dbkey:
+ return ds
+ return None
--- a/lib/galaxy/jobs/transfer_manager.py Tue Apr 12 23:41:06 2011 -0400
+++ b/lib/galaxy/jobs/transfer_manager.py Wed Apr 13 13:52:05 2011 -0400
@@ -24,11 +24,20 @@
self.restarter = threading.Thread( target=self.__restarter )
self.restarter.start()
def new( self, path=None, **kwd ):
- if 'url' not in kwd:
- raise Exception( 'Missing required parameter "url".' )
- # try: except JSON:
- transfer_job = self.app.model.TransferJob( state=self.app.model.TransferJob.states.NEW,
- params=kwd )
+ if 'protocol' not in kwd:
+ raise Exception( 'Missing required parameter "protocol".' )
+ protocol = kwd[ 'protocol' ]
+ if protocol in [ 'http', 'https' ]:
+ if 'url' not in kwd:
+ raise Exception( 'Missing required parameter "url".' )
+ transfer_job = self.app.model.TransferJob( state=self.app.model.TransferJob.states.NEW, params=kwd )
+ elif protocol == 'scp':
+ # TODO: add more checks here?
+ if 'sample_dataset_id' not in kwd:
+ raise Exception( 'Missing required parameter "sample_dataset_id".' )
+ if 'file_path' not in kwd:
+ raise Exception( 'Missing required parameter "file_path".' )
+ transfer_job = self.app.model.TransferJob( state=self.app.model.TransferJob.states.NEW, params=kwd )
self.sa_session.add( transfer_job )
self.sa_session.flush()
return transfer_job
@@ -48,6 +57,8 @@
self.sa_session.add_all( transfer_jobs )
self.sa_session.flush()
for tj in transfer_jobs:
+ params_dict = tj.params
+ protocol = params_dict[ 'protocol' ]
# The transfer script should daemonize fairly quickly - if this is
# not the case, this process will need to be moved to a
# non-blocking method.
@@ -101,7 +112,7 @@
if tj_state['state'] in self.app.model.TransferJob.terminal_states:
log.debug( 'Transfer job %s is in terminal state: %s' % ( tj_state['transfer_job_id'], tj_state['state'] ) )
elif tj_state['state'] == self.app.model.TransferJob.states.PROGRESS and 'percent' in tj_state:
- log.debug( 'Transfer job %s is %s%% complete' % ( tj_state['transfer_job_id'], tj_state['percent'] ) )
+ log.debug( 'Transfer job %s is %s%% complete' % ( tj_state[ 'transfer_job_id' ], tj_state[ 'percent' ] ) )
if len( rval ) == 1:
return rval[0]
return rval
--- a/lib/galaxy/model/__init__.py Tue Apr 12 23:41:06 2011 -0400
+++ b/lib/galaxy/model/__init__.py Wed Apr 13 13:52:05 2011 -0400
@@ -1796,7 +1796,9 @@
self.comment = comment
class ExternalService( object ):
- data_transfer_types = Bunch( SCP = 'scp' )
+ data_transfer_protocol = Bunch( HTTP = 'http',
+ HTTPS = 'https',
+ SCP = 'scp' )
def __init__( self, name=None, description=None, external_service_type_id=None, version=None, form_definition_id=None, form_values_id=None, deleted=None ):
self.name = name
self.description = description
@@ -1812,8 +1814,8 @@
trans.app.external_service_types.reload( self.external_service_type_id )
self.data_transfer = {}
external_service_type = self.get_external_service_type( trans )
- for data_transfer_type, data_transfer_obj in external_service_type.data_transfer.items():
- if data_transfer_type == self.data_transfer_types.SCP:
+ for data_transfer_protocol, data_transfer_obj in external_service_type.data_transfer.items():
+ if data_transfer_protocol == self.data_transfer_protocol.SCP:
scp_configs = {}
automatic_transfer = data_transfer_obj.config.get( 'automatic_transfer', 'false' )
scp_configs[ 'automatic_transfer' ] = util.string_as_bool( automatic_transfer )
@@ -1822,7 +1824,7 @@
scp_configs[ 'password' ] = self.form_values.content.get( data_transfer_obj.config.get( 'password', '' ), '' )
scp_configs[ 'data_location' ] = self.form_values.content.get( data_transfer_obj.config.get( 'data_location', '' ), '' )
scp_configs[ 'rename_dataset' ] = self.form_values.content.get( data_transfer_obj.config.get( 'rename_dataset', '' ), '' )
- self.data_transfer[ self.data_transfer_types.SCP ] = scp_configs
+ self.data_transfer[ self.data_transfer_protocol.SCP ] = scp_configs
def populate_actions( self, trans, item, param_dict=None ):
return self.get_external_service_type( trans ).actions.populate( self, item, param_dict=param_dict )
@@ -1992,14 +1994,14 @@
def print_ticks( d ):
pass
error_msg = 'Error encountered in determining the file size of %s on the external_service.' % filepath
- if not scp_configs['host'] or not scp_configs['user_name'] or not scp_configs['password']:
+ if not scp_configs[ 'host' ] or not scp_configs[ 'user_name' ] or not scp_configs[ 'password' ]:
return error_msg
login_str = '%s@%s' % ( scp_configs['user_name'], scp_configs['host'] )
cmd = 'ssh %s "du -sh \'%s\'"' % ( login_str, filepath )
try:
output = pexpect.run( cmd,
- events={ '.ssword:*': scp_configs['password']+'\r\n',
- pexpect.TIMEOUT:print_ticks},
+ events={ '.ssword:*' : scp_configs['password'] + '\r\n',
+ pexpect.TIMEOUT : print_ticks },
timeout=10 )
except Exception, e:
return error_msg
@@ -2013,7 +2015,7 @@
def run_details( self ):
# self.runs is a list of SampleRunAssociations ordered descending on update_time.
if self.runs:
- # Always use the lates run details template, self.runs[0] is a SampleRunAssociation
+ # Always use the latest run details template, self.runs[0] is a SampleRunAssociation
return self.runs[0]
# Inherit this sample's RequestType run details, if one exists.
return self.request.type.run_details
--- a/lib/galaxy/sample_tracking/data_transfer.py Tue Apr 12 23:41:06 2011 -0400
+++ b/lib/galaxy/sample_tracking/data_transfer.py Wed Apr 13 13:52:05 2011 -0400
@@ -14,11 +14,11 @@
# TODO: The 'automatic_transfer' setting is for future use. If set to True, we will need to
# ensure the sample has an associated destination data library before it moves to a certain state
# ( e.g., Run started ).
- self.config['automatic_transfer'] = elem.get( 'automatic_transfer' )
- self.config['host'] = elem.get( 'host' )
- self.config['user_name'] = elem.get( 'user_name' )
- self.config['password'] = elem.get( 'password' )
- self.config['data_location'] = elem.get( 'data_location' )
+ self.config[ 'automatic_transfer' ] = elem.get( 'automatic_transfer' )
+ self.config[ 'host' ] = elem.get( 'host' )
+ self.config[ 'user_name' ] = elem.get( 'user_name' )
+ self.config[ 'password' ] = elem.get( 'password' )
+ self.config[ 'data_location' ] = elem.get( 'data_location' )
# 'rename_dataset' is optional and it may not be defined in all external types
# It is only used is AB SOLiD external service type for now
rename_dataset = elem.get( 'rename_dataset', None )
--- a/lib/galaxy/sample_tracking/external_service_types.py Tue Apr 12 23:41:06 2011 -0400
+++ b/lib/galaxy/sample_tracking/external_service_types.py Wed Apr 13 13:52:05 2011 -0400
@@ -86,17 +86,18 @@
data_transfer_settings_elem = root.find( 'data_transfer_settings' )
# Currently only data transfer using scp is supported.
for data_transfer_elem in data_transfer_settings_elem.findall( "data_transfer" ):
- if data_transfer_elem.get( 'type' ) == model.ExternalService.data_transfer_types.SCP:
- scp_data_transfer = data_transfer_factories[ model.ExternalService.data_transfer_types.SCP ]
+ if data_transfer_elem.get( 'protocol' ) == model.ExternalService.data_transfer_protocol.SCP:
+ scp_data_transfer = data_transfer_factories[ model.ExternalService.data_transfer_protocol.SCP ]
scp_data_transfer.parse( self.config_file, data_transfer_elem )
- self.data_transfer[ model.ExternalService.data_transfer_types.SCP ] = scp_data_transfer
+ self.data_transfer[ model.ExternalService.data_transfer_protocol.SCP ] = scp_data_transfer
def parse_run_details( self, root ):
self.run_details = {}
run_details_elem = root.find( 'run_details' )
if run_details_elem:
results_elem = run_details_elem.find( 'results' )
if results_elem:
- # get the list of resulting datatypes
+ # Get the list of resulting datatypes
+ # TODO: the 'results_urls' attribute is only useful if the transfer protocol is http(s), so check if that is the case.
self.run_details[ 'results' ], self.run_details[ 'results_urls' ] = self.parse_run_details_results( results_elem )
def parse_run_details_results( self, root ):
datatypes_dict = {}
--- a/lib/galaxy/web/controllers/external_service.py Tue Apr 12 23:41:06 2011 -0400
+++ b/lib/galaxy/web/controllers/external_service.py Wed Apr 13 13:52:05 2011 -0400
@@ -176,7 +176,6 @@
trans.sa_session.add( external_service )
trans.sa_session.add( external_service.form_values )
trans.sa_session.flush()
- external_service.load_data_transfer_settings( trans )
else:
# We're saving a newly created external_service
external_service_type = self.get_external_service_type( trans, external_service_type_id )
--- a/lib/galaxy/web/controllers/requests_admin.py Tue Apr 12 23:41:06 2011 -0400
+++ b/lib/galaxy/web/controllers/requests_admin.py Wed Apr 13 13:52:05 2011 -0400
@@ -351,22 +351,11 @@
request_id = kwd.get( 'request_id', None )
external_service_id = kwd.get( 'external_service_id', None )
files = []
- def handle_error( **kwd ):
- kwd[ 'status' ] = 'error'
- return trans.response.send_redirect( web.url_for( controller='requests_admin',
- action='select_datasets_to_transfer',
- **kwd ) )
- try:
- request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
- except:
- return invalid_id_redirect( trans, 'requests_admin', request_id )
- try:
- external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
- except:
- return invalid_id_redirect( trans, 'requests_admin', external_service_id, 'external_service', action='browse_external_services' )
- # load the data transfer settings
+ request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
+ external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
+ # Load the data transfer settings
external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_types.SCP ]
+ scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
selected_datasets_to_transfer = util.restore_text( params.get( 'selected_datasets_to_transfer', '' ) )
if selected_datasets_to_transfer:
selected_datasets_to_transfer = selected_datasets_to_transfer.split(',')
@@ -383,10 +372,13 @@
if params.get( 'select_datasets_to_transfer_button', False ):
# Get the sample that was sequenced to produce these datasets.
if sample_id == 'none':
+ del kwd[ 'select_datasets_to_transfer_button' ]
message = 'Select the sample that was sequenced to produce the datasets you want to transfer.'
kwd[ 'message' ] = message
- del kwd[ 'select_datasets_to_transfer_button' ]
- handle_error( **kwd )
+ kwd[ 'status' ] = 'error'
+ return trans.response.send_redirect( web.url_for( controller='requests_admin',
+ action='select_datasets_to_transfer',
+ **kwd ) )
if not sample.library:
# Display an error if a sample has been selected that
# has not yet been associated with a destination library.
@@ -399,7 +391,7 @@
status=status,
message=message ) )
# Save the sample datasets
- sample_dataset_file_names = self.__save_sample_datasets( trans, sample, selected_datasets_to_transfer, external_service )
+ sample_dataset_file_names = self.__create_sample_datasets( trans, sample, selected_datasets_to_transfer, external_service )
if sample_dataset_file_names:
message = 'Datasets (%s) have been selected for sample (%s)' % \
( str( sample_dataset_file_names )[1:-1].replace( "'", "" ), sample.name )
@@ -426,24 +418,31 @@
# Avoid caching
trans.response.headers['Pragma'] = 'no-cache'
trans.response.headers['Expires'] = '0'
- request = trans.sa_session.query( trans.model.Request ).get( int( id ) )
- external_service = trans.sa_session.query( trans.model.ExternalService ).get( int( external_service_id ) )
+ request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
+ external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_types.SCP ]
- cmd = 'ssh %s@%s "ls -oghp \'%s\'"' % ( scp_configs['user_name'],
- scp_configs['host'],
+ scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
+ cmd = 'ssh %s@%s "ls -oghp \'%s\'"' % ( scp_configs[ 'user_name' ],
+ scp_configs[ 'host' ],
folder_path )
+ # TODO: this currently requires rsh / ssh keys to be set. If they are not, the process
+ # hangs. Add an event that handles the authentication message if keys are not set - the
+ # message is something like: "Are you sure you want to continue connecting (yes/no)."
output = pexpect.run( cmd,
- events={ '.ssword:*' : scp_configs[ 'password'] + '\r\n', pexpect.TIMEOUT : print_ticks },
+ events={ '.ssword:*' : scp_configs[ 'password' ] + '\r\n',
+ pexpect.TIMEOUT : print_ticks },
timeout=10 )
+ if 'Password:\r\n' in output:
+ # Eliminate the output created using ssh from the tree
+ output = output.replace( 'Password:\r\n', '' )
return unicode( output.replace( '\n', '<br/>' ) )
@web.json
def open_folder( self, trans, request_id, external_service_id, key ):
# Avoid caching
trans.response.headers['Pragma'] = 'no-cache'
trans.response.headers['Expires'] = '0'
- request = trans.sa_session.query( trans.model.Request ).get( int( request_id ) )
- external_service = trans.sa_session.query( trans.model.ExternalService ).get( int( external_service_id ) )
+ request = trans.sa_session.query( trans.model.Request ).get( trans.security.decode_id( request_id ) )
+ external_service = trans.sa_session.query( trans.model.ExternalService ).get( trans.security.decode_id( external_service_id ) )
folder_path = key
files_list = self.__get_files( trans, request, external_service, folder_path )
folder_contents = []
@@ -451,49 +450,57 @@
is_folder = False
if filename[-1] == os.sep:
is_folder = True
- full_path = os.path.join(folder_path, filename)
- node = {"title": filename,
- "isFolder": is_folder,
- "isLazy": is_folder,
- "tooltip": full_path,
- "key": full_path
- }
- folder_contents.append(node)
+ full_path = os.path.join( folder_path, filename )
+ node = { "title": filename,
+ "isFolder": is_folder,
+ "isLazy": is_folder,
+ "tooltip": full_path,
+ "key": full_path }
+ folder_contents.append( node )
return folder_contents
def __get_files( self, trans, request, external_service, folder_path ):
# Retrieves the filenames to be transferred from the remote host.
ok = True
external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_types.SCP ]
+ scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
if not scp_configs[ 'host' ] or not scp_configs[ 'user_name' ] or not scp_configs[ 'password' ]:
status = 'error'
message = "Error in external service login information."
ok = False
def print_ticks( d ):
pass
- cmd = 'ssh %s@%s "ls -p \'%s\'"' % ( scp_configs['user_name'], scp_configs['host'], folder_path )
+ cmd = 'ssh %s@%s "ls -p \'%s\'"' % ( scp_configs[ 'user_name' ], scp_configs[ 'host' ], folder_path )
+ # TODO: this currently requires rsh / ssh keys to be set. If they are not, the process
+ # hangs. Add an event that handles the authentication message if keys are not set - the
+ # message is something like: "Are you sure you want to continue connecting (yes/no)."
output = pexpect.run( cmd,
- events={ '.ssword:*' : scp_configs['password'] + '\r\n', pexpect.TIMEOUT : print_ticks },
+ events={ '.ssword:*' : scp_configs[ 'password' ] + '\r\n',
+ pexpect.TIMEOUT : print_ticks },
timeout=10 )
if 'No such file or directory' in output:
status = 'error'
message = "No folder named (%s) exists on the external service." % folder_path
ok = False
if ok:
- return output.splitlines()
+ if 'Password:' in output:
+ # Eliminate the output created using ssh from the tree
+ output_as_list = output.splitlines()
+ output_as_list.remove( 'Password:' )
+ else:
+ output_as_list = output.splitlines()
+ return output_as_list
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='select_datasets_to_transfer',
request_id=trans.security.encode_id( request.id ),
status=status,
message=message ) )
- def __save_sample_datasets( self, trans, sample, selected_datasets_to_transfer, external_service ):
+ def __create_sample_datasets( self, trans, sample, selected_datasets_to_transfer, external_service ):
external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_types.SCP ]
+ scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
sample_dataset_file_names = []
if selected_datasets_to_transfer:
for filepath in selected_datasets_to_transfer:
- # FIXME: handle folder selection
- # ignore folders for now
+ # FIXME: handle folder selection - ignore folders for now
if filepath[-1] != os.sep:
name = self.__rename_dataset( sample, filepath.split( '/' )[-1], scp_configs )
status = trans.app.model.SampleDataset.transfer_status.NOT_STARTED
@@ -522,25 +529,26 @@
else:
new_name = name
return util.sanitize_for_filename( new_name )
- def __check_library_add_permission( self, trans, target_library, target_folder ):
+ def __ensure_library_add_permission( self, trans, target_library, target_folder ):
"""
- Checks if the current admin user had ADD_LIBRARY permission on the target library
- and the target folder, if not provide the permissions.
+ Ensures the current admin user has ADD_LIBRARY permission on the target data library and folder.
"""
current_user_roles = trans.user.all_roles()
current_user_private_role = trans.app.security_agent.get_private_user_role( trans.user )
- # Make sure this user has LIBRARY_ADD permissions on the target library and folder.
- # If not, give them permission.
+ flush_needed = False
if not trans.app.security_agent.can_add_library_item( current_user_roles, target_library ):
lp = trans.model.LibraryPermissions( trans.app.security_agent.permitted_actions.LIBRARY_ADD.action,
target_library,
current_user_private_role )
trans.sa_session.add( lp )
+ flush_needed = True
if not trans.app.security_agent.can_add_library_item( current_user_roles, target_folder ):
lfp = trans.model.LibraryFolderPermissions( trans.app.security_agent.permitted_actions.LIBRARY_ADD.action,
target_folder,
current_user_private_role )
trans.sa_session.add( lfp )
+ flush_needed = True
+ if flush_needed:
trans.sa_session.flush()
def __create_data_transfer_messages( self, trans, sample, selected_sample_datasets ):
"""
@@ -587,7 +595,7 @@
messages = []
for external_service, dataset_elem in dataset_elements.items():
external_service.load_data_transfer_settings( trans )
- scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_types.SCP ]
+ scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
# Check data transfer settings
err_msg = self.__validate_data_transfer_settings( trans, sample.request.type, scp_configs )
if err_msg:
@@ -596,16 +604,16 @@
sample_id=trans.security.encode_id( sample.id ),
status='error',
message=err_msg ) )
- message = xml % dict( GALAXY_HOST=trans.request.host,
- API_KEY=trans.user.api_keys[0].key,
- DATA_HOST=scp_configs[ 'host' ],
- DATA_USER=scp_configs[ 'user_name' ],
- DATA_PASSWORD=scp_configs[ 'password' ],
- REQUEST_ID=str( sample.request.id ),
- SAMPLE_ID=str( sample.id ),
- LIBRARY_ID=str( sample.library.id ),
- FOLDER_ID=str( sample.folder.id ),
- DATASETS=dataset_elem )
+ message = xml % dict( GALAXY_HOST=trans.request.host,
+ API_KEY=trans.user.api_keys[0].key,
+ DATA_HOST=scp_configs[ 'host' ],
+ DATA_USER=scp_configs[ 'user_name' ],
+ DATA_PASSWORD=scp_configs[ 'password' ],
+ REQUEST_ID=str( sample.request.id ),
+ SAMPLE_ID=str( sample.id ),
+ LIBRARY_ID=str( sample.library.id ),
+ FOLDER_ID=str( sample.folder.id ),
+ DATASETS=dataset_elem )
messages.append( message.replace( '\n', '' ).replace( '\r', '' ) )
return messages
def __validate_data_transfer_settings( self, trans, request_type, scp_configs ):
@@ -620,10 +628,10 @@
err_msg += "The 'enable_api = True' setting is not correctly set in the Galaxy config file. "
if not trans.user.api_keys:
err_msg += "Set your API Key in your User Preferences to transfer datasets. "
- # check if library_import_dir is set
+ # Check if library_import_dir is set
if not trans.app.config.library_import_dir:
err_msg = "'The library_import_dir' setting is not correctly set in the Galaxy config file. "
- # check the RabbitMQ server settings in the config file
+ # Check the RabbitMQ server settings in the config file
for k, v in trans.app.config.amqp.items():
if not v:
err_msg += 'Set RabbitMQ server settings in the "galaxy_amqp" section of the Galaxy config file, specifically "%s" is not set.' % k
@@ -632,60 +640,79 @@
@web.expose
@web.require_admin
def initiate_data_transfer( self, trans, sample_id, sample_datasets=[], sample_dataset_id='' ):
- '''
- Initiate the transfer of the datasets from the external service to the target Galaxy data library:
- - The admin user must have LIBRARY_ADD permission for the target library and folder
- - Create an XML message encapsulating all the data transfer information and send it
- to the message queue (RabbitMQ broker).
- '''
+ # Initiate the transfer of the datasets from the external service to the target Galaxy data library.
+ # The admin user must have LIBRARY_ADD permission for the target library and folder
try:
sample = trans.sa_session.query( trans.model.Sample ).get( trans.security.decode_id( sample_id ) )
except:
return invalid_id_redirect( trans, 'requests_admin', sample_id, 'sample' )
- err_msg = ''
- # Make sure the current user has LIBRARY_ADD
- # permission on the target library and folder.
- self.__check_library_add_permission( trans, sample.library, sample.folder )
+ message = ""
+ status = "done"
+ # Make sure the current admin user has LIBRARY_ADD permission on the target data library and folder.
+ self.__ensure_library_add_permission( trans, sample.library, sample.folder )
if sample_dataset_id and not sample_datasets:
# Either a list of SampleDataset objects or a comma-separated string of
# encoded SampleDataset ids can be received. If the latter, parse the
- # sample_dataset_id to build the list of sample_datasets.
+ # sample_dataset_id string to build the list of sample_datasets.
id_list = util.listify( sample_dataset_id )
for sample_dataset_id in id_list:
sample_dataset = trans.sa_session.query( trans.model.SampleDataset ).get( trans.security.decode_id( sample_dataset_id ) )
sample_datasets.append( sample_dataset )
- # Create the message
- messages = self.__create_data_transfer_messages( trans, sample, sample_datasets )
- # Send the messages
- for message in messages:
- try:
- conn = amqp.Connection( host=trans.app.config.amqp[ 'host' ] + ":" + trans.app.config.amqp[ 'port' ],
- userid=trans.app.config.amqp[ 'userid' ],
- password=trans.app.config.amqp[ 'password' ],
- virtual_host=trans.app.config.amqp[ 'virtual_host' ],
- insist=False )
- chan = conn.channel()
- msg = amqp.Message( message,
- content_type='text/plain',
- application_headers={ 'msg_type': 'data_transfer' } )
- msg.properties[ "delivery_mode" ] = 2
- chan.basic_publish( msg,
- exchange=trans.app.config.amqp[ 'exchange' ],
- routing_key=trans.app.config.amqp[ 'routing_key' ] )
- chan.close()
- conn.close()
- except Exception, e:
- err_msg = "Error sending the data transfer message to the Galaxy AMQP message queue:<br/>%s" % str(e)
- if not err_msg:
- err_msg = "%i datasets have been queued for transfer from the external service." % len( sample_datasets )
- status = "done"
+ if trans.app.config.enable_beta_job_managers:
+ # For now, assume that all SampleDatasets use the same external service ( this may not be optimal ).
+ if sample_datasets:
+ external_service_type_id = sample_datasets[0].external_service.external_service_type_id
+ # Here external_service_type_id will be something like '454_life_sciences'
+ external_service = sample.request.type.get_external_service( external_service_type_id )
+ external_service_type = external_service.get_external_service_type( trans )
+ external_service.load_data_transfer_settings( trans )
+ # For now only scp is supported.
+ scp_configs = external_service.data_transfer[ trans.model.ExternalService.data_transfer_protocol.SCP ]
+ if not scp_configs[ 'automatic_transfer' ]:
+ deferred_plugin = 'ManualDataTransferPlugin'
+ else:
+ raise Exception( "Automatic data transfer using scp is not yet suppored." )
+ trans.app.job_manager.deferred_job_queue.plugins[ deferred_plugin ].create_job( trans,
+ sample=sample,
+ sample_datasets=sample_datasets,
+ external_service=external_service,
+ external_service_type=external_service_type )
else:
- status = 'error'
+ # TODO: Using RabbitMq for now, but eliminate this entire block when we replace RabbitMq with Galaxy's
+ # own messaging engine. We're holding off on using the new way to transfer files manually until we
+ # implement a Galaxy-proprietary messaging engine because the deferred job plugins currently perform
+ # constant db hits to check for deferred jobs that are not in a finished state.
+ # Create the message
+ messages = self.__create_data_transfer_messages( trans, sample, sample_datasets )
+ # Send the messages
+ for rmq_msg in messages:
+ try:
+ conn = amqp.Connection( host=trans.app.config.amqp[ 'host' ] + ":" + trans.app.config.amqp[ 'port' ],
+ userid=trans.app.config.amqp[ 'userid' ],
+ password=trans.app.config.amqp[ 'password' ],
+ virtual_host=trans.app.config.amqp[ 'virtual_host' ],
+ insist=False )
+ chan = conn.channel()
+ msg = amqp.Message( rmq_msg,
+ content_type='text/plain',
+ application_headers={ 'msg_type': 'data_transfer' } )
+ msg.properties[ "delivery_mode" ] = 2
+ chan.basic_publish( msg,
+ exchange=trans.app.config.amqp[ 'exchange' ],
+ routing_key=trans.app.config.amqp[ 'routing_key' ] )
+ chan.close()
+ conn.close()
+ except Exception, e:
+ message = "Error sending the data transfer message to the Galaxy AMQP message queue:<br/>%s" % str(e)
+ status = "error"
+ if not message:
+ message = "%i datasets have been queued for transfer from the external service." % len( sample_datasets )
+ status = "done"
return trans.response.send_redirect( web.url_for( controller='requests_admin',
action='manage_datasets',
sample_id=trans.security.encode_id( sample.id ),
- status=status,
- message=err_msg ) )
+ message=message,
+ status=status ) )
@web.expose
def update_sample_dataset_status(self, trans, cntrller, sample_dataset_ids, new_status, error_msg=None ):
# check if the new status is a valid transfer status
--- a/scripts/galaxy_messaging/server/amqp_consumer.py Tue Apr 12 23:41:06 2011 -0400
+++ b/scripts/galaxy_messaging/server/amqp_consumer.py Wed Apr 13 13:52:05 2011 -0400
@@ -3,7 +3,7 @@
Galaxy uses AMQ protocol to receive messages from external sources like
bar code scanners. Galaxy has been tested against RabbitMQ AMQP implementation.
For Galaxy to receive messages from a message queue the RabbitMQ server has
-to be set up with a user account and other parameters listed in the [galaxy:amq]
+to be set up with a user account and other parameters listed in the [galaxy_amqp]
section in the universe_wsgi.ini config file
Once the RabbitMQ server has been setup and started with the given parameters,
this script can be run to receive messages and update the Galaxy database accordingly
--- a/scripts/transfer.py Tue Apr 12 23:41:06 2011 -0400
+++ b/scripts/transfer.py Wed Apr 13 13:52:05 2011 -0400
@@ -4,22 +4,17 @@
Manager (galaxy.jobs.transfer_manager) and should not normally be invoked by
hand.
"""
-
-import os, sys, optparse, ConfigParser, socket, SocketServer, threading, logging, random
-
-import urllib2, tempfile
-
-import time
-
-log = logging.getLogger( __name__ )
-log.setLevel( logging.INFO )
-handler = logging.StreamHandler( sys.stdout )
-log.addHandler( handler )
+import os, sys, optparse, ConfigParser, socket, SocketServer, threading, logging, random, urllib2, tempfile, time
galaxy_root = os.path.abspath( os.path.join( os.path.dirname( __file__ ), '..' ) )
sys.path.insert( 0, os.path.abspath( os.path.join( galaxy_root, 'lib' ) ) )
from galaxy import eggs
+
+import pkg_resources
+pkg_resources.require( "pexpect" )
+import pexpect
+
eggs.require( "SQLAlchemy >= 0.4" )
from sqlalchemy import *
@@ -32,6 +27,11 @@
eggs.require( 'python_daemon' )
from daemon import DaemonContext
+log = logging.getLogger( __name__ )
+log.setLevel( logging.DEBUG )
+handler = logging.StreamHandler( sys.stdout )
+log.addHandler( handler )
+
debug = False
slow = False
@@ -49,7 +49,7 @@
def parse( self ):
self.opts, args = self.parser.parse_args()
if len( args ) != 1:
- log.error( 'usage: transfer.py [options] <transfer job id>' )
+ log.error( 'usage: transfer.py <transfer job id>' )
sys.exit( 1 )
try:
self.transfer_job_id = int( args[0] )
@@ -138,57 +138,55 @@
self.result = result
def transfer( app, transfer_job_id ):
-
transfer_job = app.get_transfer_job( transfer_job_id )
if transfer_job is None:
log.error( 'Invalid transfer job ID: %s' % transfer_job_id )
return False
-
port_range = app.config.get( 'app:main', 'transfer_worker_port_range' )
try:
port_range = [ int( p ) for p in port_range.split( '-' ) ]
except Exception, e:
log.error( 'Invalid port range set in transfer_worker_port_range: %s: %s' % ( port_range, str( e ) ) )
return False
-
- protocol = transfer_job.params['url'].split( '://' )[0]
- if protocol not in ( 'http', 'https' ):
+ protocol = transfer_job.params[ 'protocol' ]
+ if protocol not in ( 'http', 'https', 'scp' ):
log.error( 'Unsupported protocol: %s' % protocol )
return False
-
state_result = StateResult( result = dict( state = transfer_job.states.RUNNING, info='Transfer process starting up.' ) )
-
listener_server = ListenerServer( range( port_range[0], port_range[1] + 1 ), ListenerRequestHandler, app, transfer_job, state_result )
-
# daemonize here (if desired)
if not debug:
daemon_context = DaemonContext( files_preserve=[ listener_server.fileno() ], working_directory=os.getcwd() )
daemon_context.open()
-
# If this fails, it'll never be detected. Hopefully it won't fail since it succeeded once.
app.connect_database() # daemon closed the database fd
transfer_job = app.get_transfer_job( transfer_job_id )
-
listener_thread = threading.Thread( target=listener_server.serve_forever )
listener_thread.setDaemon( True )
listener_thread.start()
-
# Store this process' pid so unhandled deaths can be handled by the restarter
transfer_job.pid = os.getpid()
app.sa_session.add( transfer_job )
app.sa_session.flush()
-
terminal_state = None
- if protocol in ( 'http', 'https' ):
- for state in http_transfer( transfer_job ):
- state_result.result = state
- if state['state'] in transfer_job.terminal_states:
- terminal_state = state
+ if protocol in [ 'http', 'https' ]:
+ for transfer_result_dict in http_transfer( transfer_job ):
+ state_result.result = transfer_result_dict
+ if transfer_result_dict[ 'state' ] in transfer_job.terminal_states:
+ terminal_state = transfer_result_dict
+ elif protocol in [ 'scp' ]:
+ # Transfer the file using scp
+ transfer_result_dict = scp_transfer( transfer_job )
+ # Handle the state of the transfer
+ state = transfer_result_dict[ 'state' ]
+ state_result.result = transfer_result_dict
+ if state in transfer_job.terminal_states:
+ terminal_state = transfer_result_dict
if terminal_state is not None:
- transfer_job.state = terminal_state['state']
- for name in ( 'info', 'path' ):
+ transfer_job.state = terminal_state[ 'state' ]
+ for name in [ 'info', 'path' ]:
if name in terminal_state:
- transfer_job.__setattr__( name, terminal_state[name] )
+ transfer_job.__setattr__( name, terminal_state[ name ] )
else:
transfer_job.state = transfer_job.states.ERROR
transfer_job.info = 'Unknown error encountered by transfer worker.'
@@ -197,9 +195,7 @@
return True
def http_transfer( transfer_job ):
- """
- "Plugin" for handling http(s) transfers.
- """
+ """Plugin" for handling http(s) transfers."""
url = transfer_job.params['url']
try:
f = urllib2.urlopen( url )
@@ -243,16 +239,41 @@
return
return
+def scp_transfer( transfer_job ):
+ """Plugin" for handling scp transfers using pexpect"""
+ def print_ticks( d ):
+ pass
+ host = transfer_job.params[ 'host' ]
+ user_name = transfer_job.params[ 'user_name' ]
+ password = transfer_job.params[ 'password' ]
+ file_path = transfer_job.params[ 'file_path' ]
+ try:
+ fh, fn = tempfile.mkstemp()
+ except Exception, e:
+ return dict( state = transfer_job.states.ERROR, info = 'Unable to create temporary file for transfer: %s' % str( e ) )
+ try:
+ # TODO: add the ability to determine progress of the copy here like we do in the http_transfer above.
+ cmd = "scp %s@%s:'%s' '%s'" % ( user_name,
+ host,
+ file_path.replace( ' ', '\ ' ),
+ fn )
+ output = pexpect.run( cmd,
+ events={ '.ssword:*': password + '\r\n',
+ pexpect.TIMEOUT: print_ticks },
+ timeout=10 )
+ return dict( state = transfer_job.states.DONE, path = fn )
+ except Exception, e:
+ return dict( state = transfer_job.states.ERROR, info = 'Error during file transfer: %s' % str( e ) )
+
if __name__ == '__main__':
-
arg_handler = ArgHandler()
arg_handler.parse()
app = GalaxyApp( arg_handler.opts.config )
- log.debug( 'Initiating transfer' )
+ log.debug( 'Initiating transfer...' )
if transfer( app, arg_handler.transfer_job_id ):
log.debug( 'Finished' )
else:
- log.error( 'Error in transfer process' )
+ log.error( 'Error in transfer process...' )
sys.exit( 1 )
sys.exit( 0 )
--- a/templates/admin/requests/select_datasets_to_transfer.mako Tue Apr 12 23:41:06 2011 -0400
+++ b/templates/admin/requests/select_datasets_to_transfer.mako Wed Apr 13 13:52:05 2011 -0400
@@ -23,56 +23,60 @@
minExpandLevel: 0, // 1: root node is not collapsible
persist: false,
checkbox: true,
- selectMode: 3,
+ selectMode: 3,
onPostInit: function(isReloading, isError) {
-// alert("reloading: "+isReloading+", error:"+isError);
- logMsg("onPostInit(%o, %o) - %o", isReloading, isError, this);
- // Re-fire onActivate, so the text is updated
- this.reactivate();
+ //alert("reloading: "+isReloading+", error:"+isError);
+ logMsg("onPostInit(%o, %o) - %o", isReloading, isError, this);
+ // Re-fire onActivate, so the text is updated
+ this.reactivate();
},
fx: { height: "toggle", duration: 200 },
- // initAjax is hard to fake, so we pass the children as object array:
- initAjax: {url: "${h.url_for( controller='requests_admin', action='open_folder' )}",
- dataType: "json",
- data: { request_id: "${request.id}", external_service_id: "${external_service.id}", key: "${scp_configs['data_location']}" },
- },
- onLazyRead: function(dtnode){
- dtnode.appendAjax({
- url: "${h.url_for( controller='requests_admin', action='open_folder' )}",
- dataType: "json",
- data: { request_id: "${request.id}", external_service_id: "${external_service.id}", key: dtnode.data.key },
+ // initAjax is hard to fake, so we pass the children as object array:
+ initAjax: {url: "${h.url_for( controller='requests_admin', action='open_folder' )}",
+ dataType: "json",
+ data: { request_id: "${trans.security.encode_id( request.id )}", external_service_id: "${trans.security.encode_id( external_service.id )}", key: "${scp_configs['data_location']}" },
+ },
+ onLazyRead: function(dtnode){
+ dtnode.appendAjax({
+ url: "${h.url_for( controller='requests_admin', action='open_folder' )}",
+ dataType: "json",
+ data: { request_id: "${trans.security.encode_id( request.id )}", external_service_id: "${trans.security.encode_id( external_service.id )}", key: dtnode.data.key },
+ });
+ },
+ onSelect: function(select, dtnode) {
+ // Display list of selected nodes
+ var selNodes = dtnode.tree.getSelectedNodes();
+ // convert to title/key array
+ var selKeys = $.map(selNodes, function(node){
+ return node.data.key;
+ });
+ document.select_datasets_to_transfer.selected_datasets_to_transfer.value = selKeys.join(",")
+ },
+ onActivate: function(dtnode) {
+ var cell = $("#file_details");
+ var selected_value;
+ if (dtnode.data.key == 'root') {
+ selected_value = "${scp_configs['data_location']}/";
+ } else {
+ selected_value = dtnode.data.key;
+ };
+ if (selected_value.charAt(selected_value.length-1) != '/') {
+ // Make ajax call
+ $.ajax( {
+ type: "POST",
+ url: "${h.url_for( controller='requests_admin', action='get_file_details' )}",
+ dataType: "json",
+ data: { request_id: "${trans.security.encode_id(request.id)}", external_service_id: "${trans.security.encode_id(external_service.id)}", folder_path: selected_value },
+ success : function ( data ) {
+ cell.html( '<label>'+data+'</label>' )
+ }
});
- },
- onSelect: function(select, dtnode) {
- // Display list of selected nodes
- var selNodes = dtnode.tree.getSelectedNodes();
- // convert to title/key array
- var selKeys = $.map(selNodes, function(node){
- return node.data.key;
- });
- document.select_datasets_to_transfer.selected_datasets_to_transfer.value = selKeys.join(",")
- },
- onActivate: function(dtnode) {
- var cell = $("#file_details");
- var selected_value = dtnode.data.key
- if(selected_value.charAt(selected_value.length-1) != '/') {
- // Make ajax call
- $.ajax( {
- type: "POST",
- url: "${h.url_for( controller='requests_admin', action='get_file_details' )}",
- dataType: "json",
- data: { request_id: "${request.id}", external_service_id: "${external_service.id}", folder_path: dtnode.data.key },
- success : function ( data ) {
- cell.html( '<label>'+data+'</label>' )
- }
- });
} else {
- cell.html( '' )
- }
- },
- });
+ cell.html( '' );
+ };
+ },
+ });
});
-
</script><%
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: kanwei: trackster: Don't load huge reference tracks now that we pre-load data, preventing hang
by Bitbucket 13 Apr '11
by Bitbucket 13 Apr '11
13 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/9e3864eeeb0a/
changeset: r5372:9e3864eeeb0a
user: kanwei
date: 2011-04-13 05:41:06
summary: trackster: Don't load huge reference tracks now that we pre-load data, preventing hang
affected #: 1 file (240 bytes)
--- a/static/scripts/trackster.js Tue Apr 12 22:08:09 2011 -0400
+++ b/static/scripts/trackster.js Tue Apr 12 23:41:06 2011 -0400
@@ -244,6 +244,11 @@
* Load data from server; returns AJAX object so that use of Deferred is possible.
*/
load_data: function(chrom, low, high, mode, resolution, extra_params) {
+ if (this.track.track_type == "ReferenceTrack" && resolution > 1) {
+ // Now that data is pre-fetched before draw, we don't load reference tracks
+ // unless it's at the bottom level
+ return;
+ }
// Setup data request params.
var params = {"chrom": chrom, "low": low, "high": high, "mode": mode,
"resolution": resolution, "dataset_id" : this.track.dataset_id,
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/01cb4107bb2d/
changeset: r5371:01cb4107bb2d
user: kanwei
date: 2011-04-13 04:08:09
summary: Fix some scramble problems
affected #: 3 files (46 bytes)
--- a/lib/galaxy/eggs/__init__.py Tue Apr 12 17:26:06 2011 -0400
+++ b/lib/galaxy/eggs/__init__.py Tue Apr 12 22:08:09 2011 -0400
@@ -219,7 +219,7 @@
pkg_resources.working_set.entry_keys[entry] = []
if entry in sys.path:
sys.path.remove(entry)
- # if the conflict is a dpeendent egg, fetch that specific egg
+ # if the conflict is a dependent egg, fetch that specific egg
if egg:
# Store the removed path so the fetch method can use it
egg.removed_location = location
--- a/lib/galaxy/eggs/dist.py Tue Apr 12 17:26:06 2011 -0400
+++ b/lib/galaxy/eggs/dist.py Tue Apr 12 22:08:09 2011 -0400
@@ -84,7 +84,7 @@
for platform in platforms:
if name in self.ignore and platform in self.ignore[name].split():
continue
- egg = DistScrambleEgg( name, version, tag, url, platform )
+ egg = DistScrambleEgg( name, version, tag, url, platform, self )
host_info = self.hosts[platform].split()
egg.build_host, egg.python = host_info[:2]
egg.sources = sources
--- a/scripts/dist-scramble.py Tue Apr 12 17:26:06 2011 -0400
+++ b/scripts/dist-scramble.py Tue Apr 12 22:08:09 2011 -0400
@@ -15,6 +15,7 @@
sys.path.append( lib )
from galaxy.eggs.dist import DistScrambleCrate, ScrambleFailure
+from galaxy.eggs import EggNotFetchable
if len( sys.argv ) > 3 or len( sys.argv ) < 2:
print __doc__
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: Make changes in ddea56886275 compatible with python 2.4
by Bitbucket 12 Apr '11
by Bitbucket 12 Apr '11
12 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/1cb94990d839/
changeset: r5370:1cb94990d839
user: jgoecks
date: 2011-04-12 23:26:06
summary: Make changes in ddea56886275 compatible with python 2.4
affected #: 1 file (298 bytes)
--- a/lib/galaxy/datatypes/util/gff_util.py Tue Apr 12 14:40:59 2011 -0400
+++ b/lib/galaxy/datatypes/util/gff_util.py Tue Apr 12 17:26:06 2011 -0400
@@ -149,8 +149,9 @@
self.seed_interval = GenomicIntervalReader.next( self )
except ParseError, e:
handle_parse_error( e )
- finally:
- raw_size += len( self.current_line )
+ # TODO: When no longer supporting python 2.4 use finally:
+ #finally:
+ raw_size += len( self.current_line )
# If header or comment, clear seed interval and return it.
if isinstance( self.seed_interval, ( Header, Comment ) ):
@@ -170,16 +171,20 @@
while True:
try:
interval = GenomicIntervalReader.next( self )
+ raw_size += len( self.current_line )
except StopIteration, e:
# No more intervals to read, but last feature needs to be
# returned.
interval = None
+ raw_size += len( self.current_line )
break
except ParseError, e:
handle_parse_error( e )
+ raw_size += len( self.current_line )
continue
- finally:
- raw_size += len( self.current_line )
+ # TODO: When no longer supporting python 2.4 use finally:
+ #finally:
+ #raw_size += len( self.current_line )
# If interval not associated with feature, break.
group = interval.attributes.get( 'group', None )
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
12 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/33fe59c762a8/
changeset: r5369:33fe59c762a8
user: jgoecks
date: 2011-04-12 20:40:59
summary: Trackster: add histogram mode to feature tracks so that user can generate coverage histogram at any level of data. Refactor overlap computation out of modules for now since it's a general purpose method used in multiple modules.
affected #: 1 file (4.6 KB)
--- a/static/scripts/trackster.js Tue Apr 12 12:10:48 2011 -0400
+++ b/static/scripts/trackster.js Tue Apr 12 14:40:59 2011 -0400
@@ -14,6 +14,50 @@
return target;
};
+/**
+ * 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 BEFORE = 1001, CONTAINS = 1002, OVERLAP_START = 1003, OVERLAP_END = 1004, CONTAINED_BY = 1005, AFTER = 1006;
+var compute_overlap = function(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 = BEFORE;
+ }
+ 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 = AFTER;
+ }
+ else if (first_end <= second_end) {
+ overlap = CONTAINED_BY;
+ }
+ else {
+ overlap = OVERLAP_END;
+ }
+ }
+
+ return overlap;
+};
+/**
+ * Returns true if regions overlap.
+ */
+var is_overlap = function(first_region, second_region) {
+ var overlap = compute_overlap(first_region, second_region);
+ return (overlap !== BEFORE && overlap !== AFTER);
+};
+
// Encapsulate -- anything to be availabe outside this block is added to exports
var trackster_module = function(require, exports){
@@ -98,7 +142,7 @@
$(this).insertBefore( children.get( i ) );
}
});
-}
+};
/**
* Calculates step for slider with a given min, max.
@@ -106,7 +150,7 @@
var get_slider_step = function(min, max) {
var range = max - min;
return (range <= 2 ? 0.01 : (range <= 100 ? 1 : (range <= 1000 ? 5 : 10)));
-}
+};
/**
* Init constants & functions used throughout trackster.
@@ -142,7 +186,7 @@
function round_1000(num) {
return Math.round(num * 1000) / 1000;
-}
+};
/**
* Generic cache that handles key/value pairs.
@@ -2061,14 +2105,14 @@
}
});
-var FeatureTrack = function (name, view, hda_ldda, dataset_id, prefs, filters, tool, parent_track) {
+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"];
+ this.display_modes = ["Auto", "Histogram", "Dense", "Squish", "Pack"];
// Define and restore track configuration.
this.track_config = new TrackConfig( {
track: this,
@@ -2143,6 +2187,84 @@
return inc_slots.slot_features( features );
},
/**
+ * Given feature data, returns summary tree data. Feature data must be sorted by start
+ * position. Return value is a dict with keys 'data', 'delta' (bin size) and 'max.' Data
+ * is a two-item list; first item is bin start, second is bin's count.
+ */
+ get_summary_tree_data: function(data, low, high, bin_size) {
+ var num_bins = Math.floor((high - low)/bin_size),
+ bins = [],
+ max_count = 0;
+
+ /*
+ // For debugging:
+ for (var i = 0; i < data.length; i++)
+ console.log("\t", data[i][1], data[i][2], data[i][3]);
+ */
+
+ //
+ // Loop through bins, counting data for each interval.
+ //
+ var data_index_start = 0,
+ data_index = 0,
+ data_interval,
+ bin_index = 0,
+ bin_interval = [],
+ cur_bin,
+ overlap;
+
+ // Set bin interval.
+ var set_bin_interval = function(interval, low, bin_index, bin_size) {
+ interval[0] = low + bin_index * bin_size;
+ interval[1] = low + (bin_index + 1) * bin_size;
+ };
+
+ // Loop through bins, data to compute bin counts. Only compute bin counts as long
+ // as there is data.
+ while (bin_index < num_bins && data_index_start !== data.length) {
+ // Find next bin that has data.
+ var bin_has_data = false;
+ for (; bin_index < num_bins && !bin_has_data; bin_index++) {
+ set_bin_interval(bin_interval, low, bin_index, bin_size);
+ // Loop through data and break if data found that goes in bin.
+ for (data_index = data_index_start; data_index < data.length; data_index++) {
+ data_interval = data[data_index].slice(1, 3);
+ if (is_overlap(data_interval, bin_interval)) {
+ bin_has_data = true;
+ break;
+ }
+ }
+ // Break from bin loop if this bin has data.
+ if (bin_has_data) {
+ break;
+ }
+ }
+
+ // Set start index to current data, which is the first to overlap with this bin
+ // and perhaps with later bins.
+ data_start_index = data_index;
+
+ // Count intervals that overlap with bin.
+ bins[bins.length] = cur_bin = [bin_interval[0], 0];
+ for (; data_index < data.length; data_index++) {
+ data_interval = data[data_index].slice(1, 3);
+ if (is_overlap(data_interval, bin_interval)) {
+ cur_bin[1]++;
+ }
+ else { break; }
+ }
+
+ // Update max count.
+ if (cur_bin[1] > max_count) {
+ max_count = cur_bin[1];
+ }
+
+ // Go to next bin.
+ bin_index++;
+ }
+ return {max: max_count, delta: bin_size, data: bins};
+ },
+ /**
* Draw FeatureTrack tile.
*/
draw_tile: function(result, resolution, tile_index, parent_element, w_scale, ref_seq) {
@@ -2156,7 +2278,7 @@
left_offset = this.left_offset,
slots,
required_height;
-
+
// Set display mode if Auto.
if (mode === "Auto") {
if (result.dataset_type === "summary_tree") {
@@ -2211,6 +2333,35 @@
// Canvas element is returned
return canvas;
}
+
+ // Drawing coverage histogram. This is different from summary tree because data can feature
+ // details, but user has requested a histogram.
+ if (mode === "Histogram") {
+ // Set height of parent_element
+ required_height = this.summary_draw_height;
+ parent_element.parent().css("height", Math.max(this.height_px, required_height) + "px");
+ // Add label to container div showing maximum count
+ // TODO: this shouldn't be done at the tile level
+ this.container_div.find(".yaxislabel").remove();
+ var max_label = $("<div />").addClass('yaxislabel');
+ max_label.text( result.max );
+ max_label.css({ position: "absolute", top: "22px", left: "10px" });
+ max_label.prependTo(this.container_div);
+ // Create canvas
+ var canvas = this.view.canvas_manager.new_canvas();
+ canvas.width = width + left_offset;
+ // Extra padding at top of summary tree
+ canvas.height = required_height + SUMMARY_TREE_TOP_PADDING;
+ // Paint summary tree into canvas.
+ var binned_data = this.get_summary_tree_data(result.data, tile_low, tile_high, 200);
+ var painter = new painters.SummaryTreePainter(binned_data, tile_low, tile_high, this.prefs);
+ var ctx = canvas.getContext("2d");
+ // Deal with left_offset by translating
+ ctx.translate(left_offset, SUMMARY_TREE_TOP_PADDING);
+ painter.draw(ctx, width, required_height);
+ // Canvas element is returned
+ return canvas;
+ }
// Start dealing with row-by-row tracks
@@ -3090,43 +3241,6 @@
}
});
-/**
- * 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;
-var compute_overlap = function(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;
-}
-
var ReadPainter = function( data, view_start, view_end, prefs, mode, ref_seq ) {
FeaturePainter.call( this, data, view_start, view_end, prefs, mode );
this.ref_seq = ref_seq;
@@ -3208,8 +3322,7 @@
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) {
+ if (is_overlap([seq_start, seq_start + cig_len], tile_region)) {
// Draw.
var seq = orig_seq.slice(seq_offset, seq_offset + cig_len);
if (gap > 0) {
@@ -3258,11 +3371,9 @@
case "I": // Insertion.
// 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),
- insert_x_coord = s_start - gap;
+ var insert_x_coord = s_start - gap;
- if (seq_tile_overlap !== NO_OVERLAP) {
+ if (is_overlap([seq_start, seq_start + cig_len], tile_region)) {
var seq = orig_seq.slice(seq_offset, seq_offset + cig_len);
// Insertion point is between the sequence start and the previous base: (-gap) moves
// back from sequence start to insertion point.
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
12 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/0f3a0c220945/
changeset: r5368:0f3a0c220945
user: kanwei
date: 2011-04-12 18:10:48
summary: update jquery to 1.5.2, pack scripts
affected #: 3 files (3.2 KB)
--- a/static/scripts/jquery.js Tue Apr 12 09:35:36 2011 -0400
+++ b/static/scripts/jquery.js Tue Apr 12 12:10:48 2011 -0400
@@ -1,5 +1,5 @@
/*!
- * jQuery JavaScript Library v1.5.1
+ * jQuery JavaScript Library v1.5.2
* http://jquery.com/
*
* Copyright 2011, John Resig
@@ -11,7 +11,7 @@
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
- * Date: Wed Feb 23 13:55:29 2011 -0500
+ * Date: Thu Mar 31 15:28:23 2011 -0400
*/
(function( window, undefined ) {
@@ -69,15 +69,9 @@
// For matching the engine and version of the browser
browserMatch,
- // Has the ready events already been bound?
- readyBound = false,
-
// The deferred used on DOM ready
readyList,
- // Promise methods
- promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
-
// The ready event handler
DOMContentLoaded,
@@ -202,7 +196,7 @@
selector: "",
// The current version of jQuery being used
- jquery: "1.5.1",
+ jquery: "1.5.2",
// The default length of a jQuery object is 0
length: 0,
@@ -427,11 +421,11 @@
},
bindReady: function() {
- if ( readyBound ) {
+ if ( readyList ) {
return;
}
- readyBound = true;
+ readyList = jQuery._Deferred();
// Catch cases where $(document).ready() is called after the
// browser event has already occurred.
@@ -811,6 +805,123 @@
return (new Date()).getTime();
},
+ // Use of jQuery.browser is frowned upon.
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
+ uaMatch: function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = rwebkit.exec( ua ) ||
+ ropera.exec( ua ) ||
+ rmsie.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+ [];
+
+ return { browser: match[1] || "", version: match[2] || "0" };
+ },
+
+ sub: function() {
+ function jQuerySubclass( selector, context ) {
+ return new jQuerySubclass.fn.init( selector, context );
+ }
+ jQuery.extend( true, jQuerySubclass, this );
+ jQuerySubclass.superclass = this;
+ jQuerySubclass.fn = jQuerySubclass.prototype = this();
+ jQuerySubclass.fn.constructor = jQuerySubclass;
+ jQuerySubclass.subclass = this.subclass;
+ jQuerySubclass.fn.init = function init( selector, context ) {
+ if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
+ context = jQuerySubclass(context);
+ }
+
+ return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
+ };
+ jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
+ var rootjQuerySubclass = jQuerySubclass(document);
+ return jQuerySubclass;
+ },
+
+ browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+ jQuery.browser[ browserMatch.browser ] = true;
+ jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+ jQuery.browser.safari = true;
+}
+
+if ( indexOf ) {
+ jQuery.inArray = function( elem, array ) {
+ return indexOf.call( array, elem );
+ };
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+ trimLeft = /^[\s\xA0]+/;
+ trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+ DOMContentLoaded = function() {
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ jQuery.ready();
+ };
+
+} else if ( document.attachEvent ) {
+ DOMContentLoaded = function() {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( document.readyState === "complete" ) {
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ jQuery.ready();
+ }
+ };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+ if ( jQuery.isReady ) {
+ return;
+ }
+
+ try {
+ // If IE is used, use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ document.documentElement.doScroll("left");
+ } catch(e) {
+ setTimeout( doScrollCheck, 1 );
+ return;
+ }
+
+ // and execute any waiting functions
+ jQuery.ready();
+}
+
+// Expose jQuery to the global object
+return jQuery;
+
+})();
+
+
+var // Promise methods
+ promiseMethods = "then done fail isResolved isRejected promise".split( " " ),
+ // Static reference to slice
+ sliceDeferred = [].slice;
+
+jQuery.extend({
// Create a simple deferred (one callbacks list)
_Deferred: function() {
var // callbacks list
@@ -856,18 +967,14 @@
// resolve with given context and args
resolveWith: function( context, args ) {
if ( !cancelled && !fired && !firing ) {
+ // make sure args are available (#8421)
+ args = args || [];
firing = 1;
try {
while( callbacks[ 0 ] ) {
callbacks.shift().apply( context, args );
}
}
- // We have to add a catch block for
- // IE prior to 8 or else the finally
- // block will never get executed
- catch (e) {
- throw e;
- }
finally {
fired = [ context, args ];
firing = 0;
@@ -878,7 +985,7 @@
// resolve with this as context and given arguments
resolve: function() {
- deferred.resolveWith( jQuery.isFunction( this.promise ) ? this.promise() : this, arguments );
+ deferred.resolveWith( this, arguments );
return this;
},
@@ -941,153 +1048,44 @@
},
// Deferred helper
- when: function( object ) {
- var lastIndex = arguments.length,
- deferred = lastIndex <= 1 && object && jQuery.isFunction( object.promise ) ?
- object :
- jQuery.Deferred(),
- promise = deferred.promise();
-
- if ( lastIndex > 1 ) {
- var array = slice.call( arguments, 0 ),
- count = lastIndex,
- iCallback = function( index ) {
- return function( value ) {
- array[ index ] = arguments.length > 1 ? slice.call( arguments, 0 ) : value;
- if ( !( --count ) ) {
- deferred.resolveWith( promise, array );
- }
- };
- };
- while( ( lastIndex-- ) ) {
- object = array[ lastIndex ];
- if ( object && jQuery.isFunction( object.promise ) ) {
- object.promise().then( iCallback(lastIndex), deferred.reject );
+ when: function( firstParam ) {
+ var args = arguments,
+ i = 0,
+ length = args.length,
+ count = length,
+ deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+ firstParam :
+ jQuery.Deferred();
+ function resolveFunc( i ) {
+ return function( value ) {
+ args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+ if ( !( --count ) ) {
+ // Strange bug in FF4:
+ // Values changed onto the arguments object sometimes end up as undefined values
+ // outside the $.when method. Cloning the object into a fresh array solves the issue
+ deferred.resolveWith( deferred, sliceDeferred.call( args, 0 ) );
+ }
+ };
+ }
+ if ( length > 1 ) {
+ for( ; i < length; i++ ) {
+ if ( args[ i ] && jQuery.isFunction( args[ i ].promise ) ) {
+ args[ i ].promise().then( resolveFunc(i), deferred.reject );
} else {
--count;
}
}
if ( !count ) {
- deferred.resolveWith( promise, array );
- }
- } else if ( deferred !== object ) {
- deferred.resolve( object );
- }
- return promise;
- },
-
- // Use of jQuery.browser is frowned upon.
- // More details: http://docs.jquery.com/Utilities/jQuery.browser
- uaMatch: function( ua ) {
- ua = ua.toLowerCase();
-
- var match = rwebkit.exec( ua ) ||
- ropera.exec( ua ) ||
- rmsie.exec( ua ) ||
- ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
- [];
-
- return { browser: match[1] || "", version: match[2] || "0" };
- },
-
- sub: function() {
- function jQuerySubclass( selector, context ) {
- return new jQuerySubclass.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySubclass, this );
- jQuerySubclass.superclass = this;
- jQuerySubclass.fn = jQuerySubclass.prototype = this();
- jQuerySubclass.fn.constructor = jQuerySubclass;
- jQuerySubclass.subclass = this.subclass;
- jQuerySubclass.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySubclass) ) {
- context = jQuerySubclass(context);
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySubclass );
- };
- jQuerySubclass.fn.init.prototype = jQuerySubclass.fn;
- var rootjQuerySubclass = jQuerySubclass(document);
- return jQuerySubclass;
- },
-
- browser: {}
+ deferred.resolveWith( deferred, args );
+ }
+ } else if ( deferred !== firstParam ) {
+ deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+ }
+ return deferred.promise();
+ }
});
-// Create readyList deferred
-readyList = jQuery._Deferred();
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
- jQuery.browser[ browserMatch.browser ] = true;
- jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
- jQuery.browser.safari = true;
-}
-
-if ( indexOf ) {
- jQuery.inArray = function( elem, array ) {
- return indexOf.call( array, elem );
- };
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
- trimLeft = /^[\s\xA0]+/;
- trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
- DOMContentLoaded = function() {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- };
-
-} else if ( document.attachEvent ) {
- DOMContentLoaded = function() {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- };
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
- if ( jQuery.isReady ) {
- return;
- }
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch(e) {
- setTimeout( doScrollCheck, 1 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
-}
-
-// Expose jQuery to the global object
-return jQuery;
-
-})();
+
(function() {
@@ -1157,7 +1155,8 @@
boxModel: null,
inlineBlockNeedsLayout: false,
shrinkWrapBlocks: false,
- reliableHiddenOffsets: true
+ reliableHiddenOffsets: true,
+ reliableMarginRight: true
};
input.checked = true;
@@ -1175,15 +1174,15 @@
script = document.createElement("script"),
id = "script" + jQuery.now();
+ // Make sure that the execution of code works by injecting a script
+ // tag with appendChild/createTextNode
+ // (IE doesn't support this, fails, and uses .text instead)
try {
script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
} catch(e) {}
root.insertBefore( script, root.firstChild );
- // Make sure that the execution of code works by injecting a script
- // tag with appendChild/createTextNode
- // (IE doesn't support this, fails, and uses .text instead)
if ( window[ id ] ) {
_scriptEval = true;
delete window[ id ];
@@ -1192,8 +1191,6 @@
}
root.removeChild( script );
- // release memory in IE
- root = script = id = null;
}
return _scriptEval;
@@ -1278,6 +1275,17 @@
jQuery.support.reliableHiddenOffsets = jQuery.support.reliableHiddenOffsets && tds[0].offsetHeight === 0;
div.innerHTML = "";
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. For more
+ // info see bug #3333
+ // Fails in WebKit before Feb 2011 nightlies
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ if ( document.defaultView && document.defaultView.getComputedStyle ) {
+ div.style.width = "1px";
+ div.style.marginRight = "0";
+ jQuery.support.reliableMarginRight = ( parseInt(document.defaultView.getComputedStyle(div, null).marginRight, 10) || 0 ) === 0;
+ }
+
body.removeChild( div ).style.display = "none";
div = tds = null;
});
@@ -1301,8 +1309,6 @@
el.setAttribute(eventName, "return;");
isSupported = typeof el[eventName] === "function";
}
- el = null;
-
return isSupported;
};
@@ -2194,10 +2200,10 @@
}
if ( !eventHandle ) {
- elemData.handle = eventHandle = function() {
+ elemData.handle = eventHandle = function( e ) {
// Handle the second event of a trigger and when
// an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && !jQuery.event.triggered ?
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
jQuery.event.handle.apply( eventHandle.elem, arguments ) :
undefined;
};
@@ -2504,7 +2510,7 @@
target[ "on" + targetType ] = null;
}
- jQuery.event.triggered = true;
+ jQuery.event.triggered = event.type;
target[ targetType ]();
}
@@ -2515,7 +2521,7 @@
target[ "on" + targetType ] = old;
}
- jQuery.event.triggered = false;
+ jQuery.event.triggered = undefined;
}
}
},
@@ -2785,7 +2791,7 @@
// Chrome does something similar, the parentNode property
// can be accessed but is null.
- if ( parent !== document && !parent.parentNode ) {
+ if ( parent && parent !== document && !parent.parentNode ) {
return;
}
// Traverse up the tree
@@ -2992,19 +2998,33 @@
// Create "bubbling" focus and blur events
if ( document.addEventListener ) {
jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler while someone wants focusin/focusout
+ var attaches = 0;
+
jQuery.event.special[ fix ] = {
setup: function() {
- this.addEventListener( orig, handler, true );
+ if ( attaches++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
},
teardown: function() {
- this.removeEventListener( orig, handler, true );
+ if ( --attaches === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
}
};
- function handler( e ) {
- e = jQuery.event.fix( e );
+ function handler( donor ) {
+ // Donor event is always a native one; fix it and switch its type.
+ // Let focusin/out handler cancel the donor focus/blur event.
+ var e = jQuery.event.fix( donor );
e.type = fix;
- return jQuery.event.handle.call( this, e );
+ e.originalEvent = {};
+ jQuery.event.trigger( e, null, e.target );
+ if ( e.isDefaultPrevented() ) {
+ donor.preventDefault();
+ }
}
});
}
@@ -3918,10 +3938,12 @@
},
text: function( elem ) {
+ var attr = elem.getAttribute( "type" ), type = elem.type;
// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
// use getAttribute instead to test this case
- return "text" === elem.getAttribute( 'type' );
+ return "text" === type && ( attr === type || attr === null );
},
+
radio: function( elem ) {
return "radio" === elem.type;
},
@@ -4496,19 +4518,23 @@
(function(){
var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector,
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
+ matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+ if ( matches ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9 fails this)
+ var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+ pseudoWorks = false;
+
+ try {
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( document.documentElement, "[test!='']:sizzle" );
- } catch( pseudoError ) {
- pseudoWorks = true;
- }
-
- if ( matches ) {
+ } catch( pseudoError ) {
+ pseudoWorks = true;
+ }
+
Sizzle.matchesSelector = function( node, expr ) {
// Make sure that attribute selectors are quoted
expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
@@ -4516,7 +4542,15 @@
if ( !Sizzle.isXML( node ) ) {
try {
if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- return matches.call( node, expr );
+ var ret = matches.call( node, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || !disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9, so check for that
+ node.document && node.document.nodeType !== 11 ) {
+ return ret;
+ }
}
} catch(e) {}
}
@@ -5260,7 +5294,9 @@
}
});
} else {
- return this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value );
+ return this.length ?
+ this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+ this;
}
},
@@ -5707,7 +5743,8 @@
var ralpha = /alpha\([^)]*\)/i,
ropacity = /opacity=([^)]*)/,
rdashAlpha = /-([a-z])/ig,
- rupper = /([A-Z])/g,
+ // fixed for IE9, see #8346
+ rupper = /([A-Z]|^ms)/g,
rnumpx = /^-?\d+(?:px)?$/i,
rnum = /^-?\d/,
@@ -5944,6 +5981,28 @@
};
}
+jQuery(function() {
+ // This hook cannot be added until DOM ready because the support test
+ // for it is not run until after DOM ready
+ if ( !jQuery.support.reliableMarginRight ) {
+ jQuery.cssHooks.marginRight = {
+ get: function( elem, computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ var ret;
+ jQuery.swap( elem, { "display": "inline-block" }, function() {
+ if ( computed ) {
+ ret = curCSS( elem, "margin-right", "marginRight" );
+ } else {
+ ret = elem.style.marginRight;
+ }
+ });
+ return ret;
+ }
+ };
+ }
+});
+
if ( document.defaultView && document.defaultView.getComputedStyle ) {
getComputedStyle = function( elem, newName, name ) {
var ret, defaultView, computedStyle;
@@ -6048,7 +6107,7 @@
rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
rinput = /^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
// #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /(?:^file|^widget|\-extension):$/,
+ rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|widget):$/,
rnoContent = /^(?:GET|HEAD)$/,
rprotocol = /^\/\//,
rquery = /\?/,
@@ -6060,7 +6119,7 @@
rucHeadersFunc = function( _, $1, $2 ) {
return $1 + $2.toUpperCase();
},
- rurl = /^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,
+ rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
// Keep a copy of the old load method
_load = jQuery.fn.load,
@@ -6102,7 +6161,7 @@
}
// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() );
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {
@@ -6360,7 +6419,6 @@
cache: null,
traditional: false,
headers: {},
- crossDomain: null,
*/
accepts: {
@@ -6645,7 +6703,7 @@
s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
// Determine if a cross-domain request is in order
- if ( !s.crossDomain ) {
+ if ( s.crossDomain == null ) {
parts = rurl.exec( s.url.toLowerCase() );
s.crossDomain = !!( parts &&
( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
@@ -7024,7 +7082,7 @@
var jsc = jQuery.now(),
- jsre = /(\=)\?(&|$)|()\?\?()/i;
+ jsre = /(\=)\?(&|$)|\?\?/i;
// Default jsonp settings
jQuery.ajaxSetup({
@@ -7285,11 +7343,12 @@
xhr.overrideMimeType( s.mimeType );
}
- // Requested-With header
- // Not set for crossDomain requests with no content
- // (see why at http://trac.dojotoolkit.org/ticket/9486)
- // Won't change header if already provided
- if ( !( s.crossDomain && !s.hasContent ) && !headers["X-Requested-With"] ) {
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !s.crossDomain && !headers["X-Requested-With"] ) {
headers[ "X-Requested-With" ] = "XMLHttpRequest";
}
@@ -7979,8 +8038,8 @@
win = getWindow(doc),
clientTop = docElem.clientTop || body.clientTop || 0,
clientLeft = docElem.clientLeft || body.clientLeft || 0,
- scrollTop = (win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop ),
- scrollLeft = (win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft),
+ scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
+ scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
top = box.top + scrollTop - clientTop,
left = box.left + scrollLeft - clientLeft;
@@ -8093,7 +8152,6 @@
this.doesNotIncludeMarginInBodyOffset = (body.offsetTop !== bodyMarginTop);
body.removeChild( container );
- body = container = innerDiv = checkDiv = table = td = null;
jQuery.offset.initialize = jQuery.noop;
},
@@ -8123,10 +8181,10 @@
curOffset = curElem.offset(),
curCSSTop = jQuery.css( elem, "top" ),
curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = (position === "absolute" && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1),
+ calculatePosition = (position === "absolute" || position === "fixed") && jQuery.inArray('auto', [curCSSTop, curCSSLeft]) > -1,
props = {}, curPosition = {}, curTop, curLeft;
- // need to be able to calculate position if either top or left is auto and position is absolute
+ // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
if ( calculatePosition ) {
curPosition = curElem.position();
}
--- a/static/scripts/packed/jquery.js Tue Apr 12 09:35:36 2011 -0400
+++ b/static/scripts/packed/jquery.js Tue Apr 12 12:10:48 2011 -0400
@@ -1,5 +1,5 @@
/*
- * jQuery JavaScript Library v1.5.1
+ * jQuery JavaScript Library v1.5.2
* http://jquery.com/
*
* Copyright 2011, John Resig
@@ -11,13 +11,13 @@
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
*
- * Date: Wed Feb 23 13:55:29 2011 -0500
+ * Date: Thu Mar 31 15:28:23 2011 -0400
*/
-(function(aY,H){var al=aY.document;var a=(function(){var bn=function(bI,bJ){return new bn.fn.init(bI,bJ,bl)},bD=aY.jQuery,bp=aY.$,bl,bH=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,bv=/\S/,br=/^\s+/,bm=/\s+$/,bq=/\d/,bj=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bw=/^[\],:{}\s]*$/,bF=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,by=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bs=/(?:^|:|,)(?:\s*\[)+/g,bh=/(webkit)[ \/]([\w.]+)/,bA=/(opera)(?:.*version)?[ \/]([\w.]+)/,bz=/(msie) ([\w.]+)/,bB=/(mozilla)(?:.*? rv:([\w.]+))?/,bG=navigator.userAgent,bE,bC=false,bk,e="then done fail isResolved isRejected promise".split(" "),bd,bu=Object.prototype.toString,bo=Object.prototype.hasOwnProperty,bi=Array.prototype.push,bt=Array.prototype.slice,bx=String.prototype.trim,be=Array.prototype.indexOf,bg={};bn.fn=bn.prototype={constructor:bn,init:function(bI,bM,bL){var bK,bN,bJ,bO;if(!bI){return this}if(bI.nodeType){this.context=this[0]=bI;this.length=1;return this}if(bI==="body"&&!bM&&al.body){this.context=al;this[0]=al.body;this.selector="body";this.length=1;return this}if(typeof bI==="string"){bK=bH.exec(bI);if(bK&&(bK[1]||!bM)){if(bK[1]){bM=bM instanceof bn?bM[0]:bM;bO=(bM?bM.ownerDocument||bM:al);bJ=bj.exec(bI);if(bJ){if(bn.isPlainObject(bM)){bI=[al.createElement(bJ[1])];bn.fn.attr.call(bI,bM,true)}else{bI=[bO.createElement(bJ[1])]}}else{bJ=bn.buildFragment([bK[1]],[bO]);bI=(bJ.cacheable?bn.clone(bJ.fragment):bJ.fragment).childNodes}return bn.merge(this,bI)}else{bN=al.getElementById(bK[2]);if(bN&&bN.parentNode){if(bN.id!==bK[2]){return bL.find(bI)}this.length=1;this[0]=bN}this.context=al;this.selector=bI;return this}}else{if(!bM||bM.jquery){return(bM||bL).find(bI)}else{return this.constructor(bM).find(bI)}}}else{if(bn.isFunction(bI)){return bL.ready(bI)}}if(bI.selector!==H){this.selector=bI.selector;this.context=bI.context}return bn.makeArray(bI,this)},selector:"",jquery:"1.5.1",length:0,size:function(){return this.length},toArray:function(){return bt.call(this,0)},get:function(bI){return bI==null?this.toArray():(bI<0?this[this.length+bI]:this[bI])},pushStack:function(bJ,bL,bI){var bK=this.constructor();if(bn.isArray(bJ)){bi.apply(bK,bJ)}else{bn.merge(bK,bJ)}bK.prevObject=this;bK.context=this.context;if(bL==="find"){bK.selector=this.selector+(this.selector?" ":"")+bI}else{if(bL){bK.selector=this.selector+"."+bL+"("+bI+")"}}return bK},each:function(bJ,bI){return bn.each(this,bJ,bI)},ready:function(bI){bn.bindReady();bk.done(bI);return this},eq:function(bI){return bI===-1?this.slice(bI):this.slice(bI,+bI+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bt.apply(this,arguments),"slice",bt.call(arguments).join(","))},map:function(bI){return this.pushStack(bn.map(this,function(bK,bJ){return bI.call(bK,bJ,bK)}))},end:function(){return this.prevObject||this.constructor(null)},push:bi,sort:[].sort,splice:[].splice};bn.fn.init.prototype=bn.fn;bn.extend=bn.fn.extend=function(){var bR,bK,bI,bJ,bO,bP,bN=arguments[0]||{},bM=1,bL=arguments.length,bQ=false;if(typeof bN==="boolean"){bQ=bN;bN=arguments[1]||{};bM=2}if(typeof bN!=="object"&&!bn.isFunction(bN)){bN={}}if(bL===bM){bN=this;--bM}for(;bM<bL;bM++){if((bR=arguments[bM])!=null){for(bK in bR){bI=bN[bK];bJ=bR[bK];if(bN===bJ){continue}if(bQ&&bJ&&(bn.isPlainObject(bJ)||(bO=bn.isArray(bJ)))){if(bO){bO=false;bP=bI&&bn.isArray(bI)?bI:[]}else{bP=bI&&bn.isPlainObject(bI)?bI:{}}bN[bK]=bn.extend(bQ,bP,bJ)}else{if(bJ!==H){bN[bK]=bJ}}}}}return bN};bn.extend({noConflict:function(bI){aY.$=bp;if(bI){aY.jQuery=bD}return bn},isReady:false,readyWait:1,ready:function(bI){if(bI===true){bn.readyWait--}if(!bn.readyWait||(bI!==true&&!bn.isReady)){if(!al.body){return setTimeout(bn.ready,1)}bn.isReady=true;if(bI!==true&&--bn.readyWait>0){return}bk.resolveWith(al,[bn]);if(bn.fn.trigger){bn(al).trigger("ready").unbind("ready")}}},bindReady:function(){if(bC){return}bC=true;if(al.readyState==="complete"){return setTimeout(bn.ready,1)}if(al.addEventListener){al.addEventListener("DOMContentLoaded",bd,false);aY.addEventListener("load",bn.ready,false)}else{if(al.attachEvent){al.attachEvent("onreadystatechange",bd);aY.attachEvent("onload",bn.ready);var bI=false;try{bI=aY.frameElement==null}catch(bJ){}if(al.documentElement.doScroll&&bI){bf()}}}},isFunction:function(bI){return bn.type(bI)==="function"},isArray:Array.isArray||function(bI){return bn.type(bI)==="array"},isWindow:function(bI){return bI&&typeof bI==="object"&&"setInterval" in bI},isNaN:function(bI){return bI==null||!bq.test(bI)||isNaN(bI)},type:function(bI){return bI==null?String(bI):bg[bu.call(bI)]||"object"},isPlainObject:function(bJ){if(!bJ||bn.type(bJ)!=="object"||bJ.nodeType||bn.isWindow(bJ)){return false}if(bJ.constructor&&!bo.call(bJ,"constructor")&&!bo.call(bJ.constructor.prototype,"isPrototypeOf")){return false}var bI;for(bI in bJ){}return bI===H||bo.call(bJ,bI)},isEmptyObject:function(bJ){for(var bI in bJ){return false}return true},error:function(bI){throw bI},parseJSON:function(bI){if(typeof bI!=="string"||!bI){return null}bI=bn.trim(bI);if(bw.test(bI.replace(bF,"@").replace(by,"]").replace(bs,""))){return aY.JSON&&aY.JSON.parse?aY.JSON.parse(bI):(new Function("return "+bI))()}else{bn.error("Invalid JSON: "+bI)}},parseXML:function(bK,bI,bJ){if(aY.DOMParser){bJ=new DOMParser();bI=bJ.parseFromString(bK,"text/xml")}else{bI=new ActiveXObject("Microsoft.XMLDOM");bI.async="false";bI.loadXML(bK)}bJ=bI.documentElement;if(!bJ||!bJ.nodeName||bJ.nodeName==="parsererror"){bn.error("Invalid XML: "+bK)}return bI},noop:function(){},globalEval:function(bK){if(bK&&bv.test(bK)){var bJ=al.head||al.getElementsByTagName("head")[0]||al.documentElement,bI=al.createElement("script");if(bn.support.scriptEval()){bI.appendChild(al.createTextNode(bK))}else{bI.text=bK}bJ.insertBefore(bI,bJ.firstChild);bJ.removeChild(bI)}},nodeName:function(bJ,bI){return bJ.nodeName&&bJ.nodeName.toUpperCase()===bI.toUpperCase()},each:function(bL,bP,bK){var bJ,bM=0,bN=bL.length,bI=bN===H||bn.isFunction(bL);if(bK){if(bI){for(bJ in bL){if(bP.apply(bL[bJ],bK)===false){break}}}else{for(;bM<bN;){if(bP.apply(bL[bM++],bK)===false){break}}}}else{if(bI){for(bJ in bL){if(bP.call(bL[bJ],bJ,bL[bJ])===false){break}}}else{for(var bO=bL[0];bM<bN&&bP.call(bO,bM,bO)!==false;bO=bL[++bM]){}}}return bL},trim:bx?function(bI){return bI==null?"":bx.call(bI)}:function(bI){return bI==null?"":bI.toString().replace(br,"").replace(bm,"")},makeArray:function(bL,bJ){var bI=bJ||[];if(bL!=null){var bK=bn.type(bL);if(bL.length==null||bK==="string"||bK==="function"||bK==="regexp"||bn.isWindow(bL)){bi.call(bI,bL)}else{bn.merge(bI,bL)}}return bI},inArray:function(bK,bL){if(bL.indexOf){return bL.indexOf(bK)}for(var bI=0,bJ=bL.length;bI<bJ;bI++){if(bL[bI]===bK){return bI}}return -1},merge:function(bM,bK){var bL=bM.length,bJ=0;if(typeof bK.length==="number"){for(var bI=bK.length;bJ<bI;bJ++){bM[bL++]=bK[bJ]}}else{while(bK[bJ]!==H){bM[bL++]=bK[bJ++]}}bM.length=bL;return bM},grep:function(bJ,bO,bI){var bK=[],bN;bI=!!bI;for(var bL=0,bM=bJ.length;bL<bM;bL++){bN=!!bO(bJ[bL],bL);if(bI!==bN){bK.push(bJ[bL])}}return bK},map:function(bJ,bO,bI){var bK=[],bN;for(var bL=0,bM=bJ.length;bL<bM;bL++){bN=bO(bJ[bL],bL,bI);if(bN!=null){bK[bK.length]=bN}}return bK.concat.apply([],bK)},guid:1,proxy:function(bK,bJ,bI){if(arguments.length===2){if(typeof bJ==="string"){bI=bK;bK=bI[bJ];bJ=H}else{if(bJ&&!bn.isFunction(bJ)){bI=bJ;bJ=H}}}if(!bJ&&bK){bJ=function(){return bK.apply(bI||this,arguments)}}if(bK){bJ.guid=bK.guid=bK.guid||bJ.guid||bn.guid++}return bJ},access:function(bI,bQ,bO,bK,bN,bP){var bJ=bI.length;if(typeof bQ==="object"){for(var bL in bQ){bn.access(bI,bL,bQ[bL],bK,bN,bO)}return bI}if(bO!==H){bK=!bP&&bK&&bn.isFunction(bO);for(var bM=0;bM<bJ;bM++){bN(bI[bM],bQ,bK?bO.call(bI[bM],bM,bN(bI[bM],bQ)):bO,bP)}return bI}return bJ?bN(bI[0],bQ):H},now:function(){return(new Date()).getTime()},_Deferred:function(){var bL=[],bM,bJ,bK,bI={done:function(){if(!bK){var bO=arguments,bP,bS,bR,bQ,bN;if(bM){bN=bM;bM=0}for(bP=0,bS=bO.length;bP<bS;bP++){bR=bO[bP];bQ=bn.type(bR);if(bQ==="array"){bI.done.apply(bI,bR)}else{if(bQ==="function"){bL.push(bR)}}}if(bN){bI.resolveWith(bN[0],bN[1])}}return this},resolveWith:function(bO,bN){if(!bK&&!bM&&!bJ){bJ=1;try{while(bL[0]){bL.shift().apply(bO,bN)}}catch(bP){throw bP}finally{bM=[bO,bN];bJ=0}}return this},resolve:function(){bI.resolveWith(bn.isFunction(this.promise)?this.promise():this,arguments);return this},isResolved:function(){return !!(bJ||bM)},cancel:function(){bK=1;bL=[];return this}};return bI},Deferred:function(bJ){var bI=bn._Deferred(),bL=bn._Deferred(),bK;bn.extend(bI,{then:function(bN,bM){bI.done(bN).fail(bM);return this},fail:bL.done,rejectWith:bL.resolveWith,reject:bL.resolve,isRejected:bL.isResolved,promise:function(bN){if(bN==null){if(bK){return bK}bK=bN={}}var bM=e.length;while(bM--){bN[e[bM]]=bI[e[bM]]}return bN}});bI.done(bL.cancel).fail(bI.cancel);delete bI.cancel;if(bJ){bJ.call(bI,bI)}return bI},when:function(bJ){var bO=arguments.length,bI=bO<=1&&bJ&&bn.isFunction(bJ.promise)?bJ:bn.Deferred(),bM=bI.promise();if(bO>1){var bN=bt.call(arguments,0),bL=bO,bK=function(bP){return function(bQ){bN[bP]=arguments.length>1?bt.call(arguments,0):bQ;if(!(--bL)){bI.resolveWith(bM,bN)}}};while((bO--)){bJ=bN[bO];if(bJ&&bn.isFunction(bJ.promise)){bJ.promise().then(bK(bO),bI.reject)}else{--bL}}if(!bL){bI.resolveWith(bM,bN)}}else{if(bI!==bJ){bI.resolve(bJ)}}return bM},uaMatch:function(bJ){bJ=bJ.toLowerCase();var bI=bh.exec(bJ)||bA.exec(bJ)||bz.exec(bJ)||bJ.indexOf("compatible")<0&&bB.exec(bJ)||[];return{browser:bI[1]||"",version:bI[2]||"0"}},sub:function(){function bJ(bL,bM){return new bJ.fn.init(bL,bM)}bn.extend(true,bJ,this);bJ.superclass=this;bJ.fn=bJ.prototype=this();bJ.fn.constructor=bJ;bJ.subclass=this.subclass;bJ.fn.init=function bK(bL,bM){if(bM&&bM instanceof bn&&!(bM instanceof bJ)){bM=bJ(bM)}return bn.fn.init.call(this,bL,bM,bI)};bJ.fn.init.prototype=bJ.fn;var bI=bJ(al);return bJ},browser:{}});bk=bn._Deferred();bn.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(bJ,bI){bg["[object "+bI+"]"]=bI.toLowerCase()});bE=bn.uaMatch(bG);if(bE.browser){bn.browser[bE.browser]=true;bn.browser.version=bE.version}if(bn.browser.webkit){bn.browser.safari=true}if(be){bn.inArray=function(bI,bJ){return be.call(bJ,bI)}}if(bv.test("\xA0")){br=/^[\s\xA0]+/;bm=/[\s\xA0]+$/}bl=bn(al);if(al.addEventListener){bd=function(){al.removeEventListener("DOMContentLoaded",bd,false);bn.ready()}}else{if(al.attachEvent){bd=function(){if(al.readyState==="complete"){al.detachEvent("onreadystatechange",bd);bn.ready()}}}}function bf(){if(bn.isReady){return}try{al.documentElement.doScroll("left")}catch(bI){setTimeout(bf,1);return}bn.ready()}return bn})();(function(){a.support={};var bd=al.createElement("div");bd.style.display="none";bd.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var bm=bd.getElementsByTagName("*"),bk=bd.getElementsByTagName("a")[0],bl=al.createElement("select"),be=bl.appendChild(al.createElement("option")),bj=bd.getElementsByTagName("input")[0];if(!bm||!bm.length||!bk){return}a.support={leadingWhitespace:bd.firstChild.nodeType===3,tbody:!bd.getElementsByTagName("tbody").length,htmlSerialize:!!bd.getElementsByTagName("link").length,style:/red/.test(bk.getAttribute("style")),hrefNormalized:bk.getAttribute("href")==="/a",opacity:/^0.55$/.test(bk.style.opacity),cssFloat:!!bk.style.cssFloat,checkOn:bj.value==="on",optSelected:be.selected,deleteExpando:true,optDisabled:false,checkClone:false,noCloneEvent:true,noCloneChecked:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true};bj.checked=true;a.support.noCloneChecked=bj.cloneNode(true).checked;bl.disabled=true;a.support.optDisabled=!be.disabled;var bf=null;a.support.scriptEval=function(){if(bf===null){var bo=al.documentElement,bp=al.createElement("script"),br="script"+a.now();try{bp.appendChild(al.createTextNode("window."+br+"=1;"))}catch(bq){}bo.insertBefore(bp,bo.firstChild);if(aY[br]){bf=true;delete aY[br]}else{bf=false}bo.removeChild(bp);bo=bp=br=null}return bf};try{delete bd.test}catch(bh){a.support.deleteExpando=false}if(!bd.addEventListener&&bd.attachEvent&&bd.fireEvent){bd.attachEvent("onclick",function bn(){a.support.noCloneEvent=false;bd.detachEvent("onclick",bn)});bd.cloneNode(true).fireEvent("onclick")}bd=al.createElement("div");bd.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var bg=al.createDocumentFragment();bg.appendChild(bd.firstChild);a.support.checkClone=bg.cloneNode(true).cloneNode(true).lastChild.checked;a(function(){var bp=al.createElement("div"),e=al.getElementsByTagName("body")[0];if(!e){return}bp.style.width=bp.style.paddingLeft="1px";e.appendChild(bp);a.boxModel=a.support.boxModel=bp.offsetWidth===2;if("zoom" in bp.style){bp.style.display="inline";bp.style.zoom=1;a.support.inlineBlockNeedsLayout=bp.offsetWidth===2;bp.style.display="";bp.innerHTML="<div style='width:4px;'></div>";a.support.shrinkWrapBlocks=bp.offsetWidth!==2}bp.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var bo=bp.getElementsByTagName("td");a.support.reliableHiddenOffsets=bo[0].offsetHeight===0;bo[0].style.display="";bo[1].style.display="none";a.support.reliableHiddenOffsets=a.support.reliableHiddenOffsets&&bo[0].offsetHeight===0;bp.innerHTML="";e.removeChild(bp).style.display="none";bp=bo=null});var bi=function(e){var bp=al.createElement("div");e="on"+e;if(!bp.attachEvent){return true}var bo=(e in bp);if(!bo){bp.setAttribute(e,"return;");bo=typeof bp[e]==="function"}bp=null;return bo};a.support.submitBubbles=bi("submit");a.support.changeBubbles=bi("change");bd=bm=bk=null})();var aE=/^(?:\{.*\}|\[.*\])$/;a.extend({cache:{},uuid:0,expando:"jQuery"+(a.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?a.cache[e[a.expando]]:e[a.expando];return !!e&&!P(e)},data:function(bf,bd,bh,bg){if(!a.acceptData(bf)){return}var bk=a.expando,bj=typeof bd==="string",bi,bl=bf.nodeType,e=bl?a.cache:bf,be=bl?bf[a.expando]:bf[a.expando]&&a.expando;if((!be||(bg&&be&&!e[be][bk]))&&bj&&bh===H){return}if(!be){if(bl){bf[a.expando]=be=++a.uuid}else{be=a.expando}}if(!e[be]){e[be]={};if(!bl){e[be].toJSON=a.noop}}if(typeof bd==="object"||typeof bd==="function"){if(bg){e[be][bk]=a.extend(e[be][bk],bd)}else{e[be]=a.extend(e[be],bd)}}bi=e[be];if(bg){if(!bi[bk]){bi[bk]={}}bi=bi[bk]}if(bh!==H){bi[bd]=bh}if(bd==="events"&&!bi[bd]){return bi[bk]&&bi[bk].events}return bj?bi[bd]:bi},removeData:function(bg,be,bh){if(!a.acceptData(bg)){return}var bj=a.expando,bk=bg.nodeType,bd=bk?a.cache:bg,bf=bk?bg[a.expando]:a.expando;if(!bd[bf]){return}if(be){var bi=bh?bd[bf][bj]:bd[bf];if(bi){delete bi[be];if(!P(bi)){return}}}if(bh){delete bd[bf][bj];if(!P(bd[bf])){return}}var e=bd[bf][bj];if(a.support.deleteExpando||bd!=aY){delete bd[bf]}else{bd[bf]=null}if(e){bd[bf]={};if(!bk){bd[bf].toJSON=a.noop}bd[bf][bj]=e}else{if(bk){if(a.support.deleteExpando){delete bg[a.expando]}else{if(bg.removeAttribute){bg.removeAttribute(a.expando)}else{bg[a.expando]=null}}}}},_data:function(bd,e,be){return a.data(bd,e,be,true)},acceptData:function(bd){if(bd.nodeName){var e=a.noData[bd.nodeName.toLowerCase()];if(e){return !(e===true||bd.getAttribute("classid")!==e)}}return true}});a.fn.extend({data:function(bg,bi){var bh=null;if(typeof bg==="undefined"){if(this.length){bh=a.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,be;for(var bf=0,bd=e.length;bf<bd;bf++){be=e[bf].name;if(be.indexOf("data-")===0){be=be.substr(5);aT(this[0],be,bh[be])}}}}return bh}else{if(typeof bg==="object"){return this.each(function(){a.data(this,bg)})}}var bj=bg.split(".");bj[1]=bj[1]?"."+bj[1]:"";if(bi===H){bh=this.triggerHandler("getData"+bj[1]+"!",[bj[0]]);if(bh===H&&this.length){bh=a.data(this[0],bg);bh=aT(this[0],bg,bh)}return bh===H&&bj[1]?this.data(bj[0]):bh}else{return this.each(function(){var bl=a(this),bk=[bj[0],bi];bl.triggerHandler("setData"+bj[1]+"!",bk);a.data(this,bg,bi);bl.triggerHandler("changeData"+bj[1]+"!",bk)})}},removeData:function(e){return this.each(function(){a.removeData(this,e)})}});function aT(be,bd,bf){if(bf===H&&be.nodeType===1){bf=be.getAttribute("data-"+bd);if(typeof bf==="string"){try{bf=bf==="true"?true:bf==="false"?false:bf==="null"?null:!a.isNaN(bf)?parseFloat(bf):aE.test(bf)?a.parseJSON(bf):bf}catch(bg){}a.data(be,bd,bf)}else{bf=H}}return bf}function P(bd){for(var e in bd){if(e!=="toJSON"){return false}}return true}a.extend({queue:function(bd,e,bf){if(!bd){return}e=(e||"fx")+"queue";var be=a._data(bd,e);if(!bf){return be||[]}if(!be||a.isArray(bf)){be=a._data(bd,e,a.makeArray(bf))}else{be.push(bf)}return be},dequeue:function(bf,be){be=be||"fx";var e=a.queue(bf,be),bd=e.shift();if(bd==="inprogress"){bd=e.shift()}if(bd){if(be==="fx"){e.unshift("inprogress")}bd.call(bf,function(){a.dequeue(bf,be)})}if(!e.length){a.removeData(bf,be+"queue",true)}}});a.fn.extend({queue:function(e,bd){if(typeof e!=="string"){bd=e;e="fx"}if(bd===H){return a.queue(this[0],e)}return this.each(function(bf){var be=a.queue(this,e,bd);if(e==="fx"&&be[0]!=="inprogress"){a.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){a.dequeue(this,e)})},delay:function(bd,e){bd=a.fx?a.fx.speeds[bd]||bd:bd;e=e||"fx";return this.queue(e,function(){var be=this;setTimeout(function(){a.dequeue(be,e)},bd)})},clearQueue:function(e){return this.queue(e||"fx",[])}});var aC=/[\n\t\r]/g,a3=/\s+/,aG=/\r/g,a2=/^(?:href|src|style)$/,f=/^(?:button|input)$/i,C=/^(?:button|input|object|select|textarea)$/i,k=/^a(?:rea)?$/i,Q=/^(?:radio|checkbox)$/i;a.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};a.fn.extend({attr:function(e,bd){return a.access(this,e,bd,true,a.attr)},removeAttr:function(e,bd){return this.each(function(){a.attr(this,e,"");if(this.nodeType===1){this.removeAttribute(e)}})},addClass:function(bj){if(a.isFunction(bj)){return this.each(function(bm){var bl=a(this);bl.addClass(bj.call(this,bm,bl.attr("class")))})}if(bj&&typeof bj==="string"){var e=(bj||"").split(a3);for(var bf=0,be=this.length;bf<be;bf++){var bd=this[bf];if(bd.nodeType===1){if(!bd.className){bd.className=bj}else{var bg=" "+bd.className+" ",bi=bd.className;for(var bh=0,bk=e.length;bh<bk;bh++){if(bg.indexOf(" "+e[bh]+" ")<0){bi+=" "+e[bh]}}bd.className=a.trim(bi)}}}}return this},removeClass:function(bh){if(a.isFunction(bh)){return this.each(function(bl){var bk=a(this);bk.removeClass(bh.call(this,bl,bk.attr("class")))})}if((bh&&typeof bh==="string")||bh===H){var bi=(bh||"").split(a3);for(var be=0,bd=this.length;be<bd;be++){var bg=this[be];if(bg.nodeType===1&&bg.className){if(bh){var bf=(" "+bg.className+" ").replace(aC," ");for(var bj=0,e=bi.length;bj<e;bj++){bf=bf.replace(" "+bi[bj]+" "," ")}bg.className=a.trim(bf)}else{bg.className=""}}}}return this},toggleClass:function(bf,bd){var be=typeof bf,e=typeof bd==="boolean";if(a.isFunction(bf)){return this.each(function(bh){var bg=a(this);bg.toggleClass(bf.call(this,bh,bg.attr("class"),bd),bd)})}return this.each(function(){if(be==="string"){var bi,bh=0,bg=a(this),bj=bd,bk=bf.split(a3);while((bi=bk[bh++])){bj=e?bj:!bg.hasClass(bi);bg[bj?"addClass":"removeClass"](bi)}}else{if(be==="undefined"||be==="boolean"){if(this.className){a._data(this,"__className__",this.className)}this.className=this.className||bf===false?"":a._data(this,"__className__")||""}}})},hasClass:function(e){var bf=" "+e+" ";for(var be=0,bd=this.length;be<bd;be++){if((" "+this[be].className+" ").replace(aC," ").indexOf(bf)>-1){return true}}return false},val:function(bk){if(!arguments.length){var be=this[0];if(be){if(a.nodeName(be,"option")){var bd=be.attributes.value;return !bd||bd.specified?be.value:be.text}if(a.nodeName(be,"select")){var bi=be.selectedIndex,bl=[],bm=be.options,bh=be.type==="select-one";if(bi<0){return null}for(var bf=bh?bi:0,bj=bh?bi+1:bm.length;bf<bj;bf++){var bg=bm[bf];if(bg.selected&&(a.support.optDisabled?!bg.disabled:bg.getAttribute("disabled")===null)&&(!bg.parentNode.disabled||!a.nodeName(bg.parentNode,"optgroup"))){bk=a(bg).val();if(bh){return bk}bl.push(bk)}}if(bh&&!bl.length&&bm.length){return a(bm[bi]).val()}return bl}if(Q.test(be.type)&&!a.support.checkOn){return be.getAttribute("value")===null?"on":be.value}return(be.value||"").replace(aG,"")}return H}var e=a.isFunction(bk);return this.each(function(bp){var bo=a(this),bq=bk;if(this.nodeType!==1){return}if(e){bq=bk.call(this,bp,bo.val())}if(bq==null){bq=""}else{if(typeof bq==="number"){bq+=""}else{if(a.isArray(bq)){bq=a.map(bq,function(br){return br==null?"":br+""})}}}if(a.isArray(bq)&&Q.test(this.type)){this.checked=a.inArray(bo.val(),bq)>=0}else{if(a.nodeName(this,"select")){var bn=a.makeArray(bq);a("option",this).each(function(){this.selected=a.inArray(a(this).val(),bn)>=0});if(!bn.length){this.selectedIndex=-1}}else{this.value=bq}}})}});a.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bd,e,bi,bl){if(!bd||bd.nodeType===3||bd.nodeType===8||bd.nodeType===2){return H}if(bl&&e in a.attrFn){return a(bd)[e](bi)}var be=bd.nodeType!==1||!a.isXMLDoc(bd),bh=bi!==H;e=be&&a.props[e]||e;if(bd.nodeType===1){var bg=a2.test(e);if(e==="selected"&&!a.support.optSelected){var bj=bd.parentNode;if(bj){bj.selectedIndex;if(bj.parentNode){bj.parentNode.selectedIndex}}}if((e in bd||bd[e]!==H)&&be&&!bg){if(bh){if(e==="type"&&f.test(bd.nodeName)&&bd.parentNode){a.error("type property can't be changed")}if(bi===null){if(bd.nodeType===1){bd.removeAttribute(e)}}else{bd[e]=bi}}if(a.nodeName(bd,"form")&&bd.getAttributeNode(e)){return bd.getAttributeNode(e).nodeValue}if(e==="tabIndex"){var bk=bd.getAttributeNode("tabIndex");return bk&&bk.specified?bk.value:C.test(bd.nodeName)||k.test(bd.nodeName)&&bd.href?0:H}return bd[e]}if(!a.support.style&&be&&e==="style"){if(bh){bd.style.cssText=""+bi}return bd.style.cssText}if(bh){bd.setAttribute(e,""+bi)}if(!bd.attributes[e]&&(bd.hasAttribute&&!bd.hasAttribute(e))){return H}var bf=!a.support.hrefNormalized&&be&&bg?bd.getAttribute(e,2):bd.getAttribute(e);return bf===null?H:bf}if(bh){bd[e]=bi}return bd[e]}});var aP=/\.(.*)$/,a0=/^(?:textarea|input|select)$/i,K=/\./g,aa=/ /g,aw=/[^\w\s.|`]/g,E=function(e){return e.replace(aw,"\\$&")};a.event={add:function(bg,bk,br,bi){if(bg.nodeType===3||bg.nodeType===8){return}try{if(a.isWindow(bg)&&(bg!==aY&&!bg.frameElement)){bg=aY}}catch(bl){}if(br===false){br=a5}else{if(!br){return}}var be,bp;if(br.handler){be=br;br=be.handler}if(!br.guid){br.guid=a.guid++}var bm=a._data(bg);if(!bm){return}var bq=bm.events,bj=bm.handle;if(!bq){bm.events=bq={}}if(!bj){bm.handle=bj=function(){return typeof a!=="undefined"&&!a.event.triggered?a.event.handle.apply(bj.elem,arguments):H}}bj.elem=bg;bk=bk.split(" ");var bo,bh=0,bd;while((bo=bk[bh++])){bp=be?a.extend({},be):{handler:br,data:bi};if(bo.indexOf(".")>-1){bd=bo.split(".");bo=bd.shift();bp.namespace=bd.slice(0).sort().join(".")}else{bd=[];bp.namespace=""}bp.type=bo;if(!bp.guid){bp.guid=br.guid}var bf=bq[bo],bn=a.event.special[bo]||{};if(!bf){bf=bq[bo]=[];if(!bn.setup||bn.setup.call(bg,bi,bd,bj)===false){if(bg.addEventListener){bg.addEventListener(bo,bj,false)}else{if(bg.attachEvent){bg.attachEvent("on"+bo,bj)}}}}if(bn.add){bn.add.call(bg,bp);if(!bp.handler.guid){bp.handler.guid=br.guid}}bf.push(bp);a.event.global[bo]=true}bg=null},global:{},remove:function(br,bm,be,bi){if(br.nodeType===3||br.nodeType===8){return}if(be===false){be=a5}var bu,bh,bj,bo,bp=0,bf,bk,bn,bg,bl,e,bt,bq=a.hasData(br)&&a._data(br),bd=bq&&bq.events;if(!bq||!bd){return}if(bm&&bm.type){be=bm.handler;bm=bm.type}if(!bm||typeof bm==="string"&&bm.charAt(0)==="."){bm=bm||"";for(bh in bd){a.event.remove(br,bh+bm)}return}bm=bm.split(" ");while((bh=bm[bp++])){bt=bh;e=null;bf=bh.indexOf(".")<0;bk=[];if(!bf){bk=bh.split(".");bh=bk.shift();bn=new RegExp("(^|\\.)"+a.map(bk.slice(0).sort(),E).join("\\.(?:.*\\.)?")+"(\\.|$)")}bl=bd[bh];if(!bl){continue}if(!be){for(bo=0;bo<bl.length;bo++){e=bl[bo];if(bf||bn.test(e.namespace)){a.event.remove(br,bt,e.handler,bo);bl.splice(bo--,1)}}continue}bg=a.event.special[bh]||{};for(bo=bi||0;bo<bl.length;bo++){e=bl[bo];if(be.guid===e.guid){if(bf||bn.test(e.namespace)){if(bi==null){bl.splice(bo--,1)}if(bg.remove){bg.remove.call(br,e)}}if(bi!=null){break}}}if(bl.length===0||bi!=null&&bl.length===1){if(!bg.teardown||bg.teardown.call(br,bk)===false){a.removeEvent(br,bh,bq.handle)}bu=null;delete bd[bh]}}if(a.isEmptyObject(bd)){var bs=bq.handle;if(bs){bs.elem=null}delete bq.events;delete bq.handle;if(a.isEmptyObject(bq)){a.removeData(br,H,true)}}},trigger:function(bd,bi,bf){var bm=bd.type||bd,bh=arguments[3];if(!bh){bd=typeof bd==="object"?bd[a.expando]?bd:a.extend(a.Event(bm),bd):a.Event(bm);if(bm.indexOf("!")>=0){bd.type=bm=bm.slice(0,-1);bd.exclusive=true}if(!bf){bd.stopPropagation();if(a.event.global[bm]){a.each(a.cache,function(){var br=a.expando,bq=this[br];if(bq&&bq.events&&bq.events[bm]){a.event.trigger(bd,bi,bq.handle.elem)}})}}if(!bf||bf.nodeType===3||bf.nodeType===8){return H}bd.result=H;bd.target=bf;bi=a.makeArray(bi);bi.unshift(bd)}bd.currentTarget=bf;var bj=a._data(bf,"handle");if(bj){bj.apply(bf,bi)}var bo=bf.parentNode||bf.ownerDocument;try{if(!(bf&&bf.nodeName&&a.noData[bf.nodeName.toLowerCase()])){if(bf["on"+bm]&&bf["on"+bm].apply(bf,bi)===false){bd.result=false;bd.preventDefault()}}}catch(bn){}if(!bd.isPropagationStopped()&&bo){a.event.trigger(bd,bi,bo,true)}else{if(!bd.isDefaultPrevented()){var be,bk=bd.target,e=bm.replace(aP,""),bp=a.nodeName(bk,"a")&&e==="click",bl=a.event.special[e]||{};if((!bl._default||bl._default.call(bf,bd)===false)&&!bp&&!(bk&&bk.nodeName&&a.noData[bk.nodeName.toLowerCase()])){try{if(bk[e]){be=bk["on"+e];if(be){bk["on"+e]=null}a.event.triggered=true;bk[e]()}}catch(bg){}if(be){bk["on"+e]=be}a.event.triggered=false}}}},handle:function(e){var bl,be,bd,bn,bm,bh=[],bj=a.makeArray(arguments);e=bj[0]=a.event.fix(e||aY.event);e.currentTarget=this;bl=e.type.indexOf(".")<0&&!e.exclusive;if(!bl){bd=e.type.split(".");e.type=bd.shift();bh=bd.slice(0).sort();bn=new RegExp("(^|\\.)"+bh.join("\\.(?:.*\\.)?")+"(\\.|$)")}e.namespace=e.namespace||bh.join(".");bm=a._data(this,"events");be=(bm||{})[e.type];if(bm&&be){be=be.slice(0);for(var bg=0,bf=be.length;bg<bf;bg++){var bk=be[bg];if(bl||bn.test(bk.namespace)){e.handler=bk.handler;e.data=bk.data;e.handleObj=bk;var bi=bk.handler.apply(this,bj);if(bi!==H){e.result=bi;if(bi===false){e.preventDefault();e.stopPropagation()}}if(e.isImmediatePropagationStopped()){break}}}}return e.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(bf){if(bf[a.expando]){return bf}var bd=bf;bf=a.Event(bd);for(var be=this.props.length,bh;be;){bh=this.props[--be];bf[bh]=bd[bh]}if(!bf.target){bf.target=bf.srcElement||al}if(bf.target.nodeType===3){bf.target=bf.target.parentNode}if(!bf.relatedTarget&&bf.fromElement){bf.relatedTarget=bf.fromElement===bf.target?bf.toElement:bf.fromElement}if(bf.pageX==null&&bf.clientX!=null){var bg=al.documentElement,e=al.body;bf.pageX=bf.clientX+(bg&&bg.scrollLeft||e&&e.scrollLeft||0)-(bg&&bg.clientLeft||e&&e.clientLeft||0);bf.pageY=bf.clientY+(bg&&bg.scrollTop||e&&e.scrollTop||0)-(bg&&bg.clientTop||e&&e.clientTop||0)}if(bf.which==null&&(bf.charCode!=null||bf.keyCode!=null)){bf.which=bf.charCode!=null?bf.charCode:bf.keyCode}if(!bf.metaKey&&bf.ctrlKey){bf.metaKey=bf.ctrlKey}if(!bf.which&&bf.button!==H){bf.which=(bf.button&1?1:(bf.button&2?3:(bf.button&4?2:0)))}return bf},guid:100000000,proxy:a.proxy,special:{ready:{setup:a.bindReady,teardown:a.noop},live:{add:function(e){a.event.add(this,n(e.origType,e.selector),a.extend({},e,{handler:af,guid:e.handler.guid}))},remove:function(e){a.event.remove(this,n(e.origType,e.selector),e)}},beforeunload:{setup:function(be,bd,e){if(a.isWindow(this)){this.onbeforeunload=e}},teardown:function(bd,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}}};a.removeEvent=al.removeEventListener?function(bd,e,be){if(bd.removeEventListener){bd.removeEventListener(e,be,false)}}:function(bd,e,be){if(bd.detachEvent){bd.detachEvent("on"+e,be)}};a.Event=function(e){if(!this.preventDefault){return new a.Event(e)}if(e&&e.type){this.originalEvent=e;this.type=e.type;this.isDefaultPrevented=(e.defaultPrevented||e.returnValue===false||e.getPreventDefault&&e.getPreventDefault())?h:a5}else{this.type=e}this.timeStamp=a.now();this[a.expando]=true};function a5(){return false}function h(){return true}a.Event.prototype={preventDefault:function(){this.isDefaultPrevented=h;var bd=this.originalEvent;if(!bd){return}if(bd.preventDefault){bd.preventDefault()}else{bd.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=h;var bd=this.originalEvent;if(!bd){return}if(bd.stopPropagation){bd.stopPropagation()}bd.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=h;this.stopPropagation()},isDefaultPrevented:a5,isPropagationStopped:a5,isImmediatePropagationStopped:a5};var Z=function(be){var bd=be.relatedTarget;try{if(bd!==al&&!bd.parentNode){return}while(bd&&bd!==this){bd=bd.parentNode}if(bd!==this){be.type=be.data;a.event.handle.apply(this,arguments)}}catch(bf){}},aK=function(e){e.type=e.data;a.event.handle.apply(this,arguments)};a.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bd,e){a.event.special[bd]={setup:function(be){a.event.add(this,e,be&&be.selector?aK:Z,bd)},teardown:function(be){a.event.remove(this,e,be&&be.selector?aK:Z)}}});if(!a.support.submitBubbles){a.event.special.submit={setup:function(bd,e){if(this.nodeName&&this.nodeName.toLowerCase()!=="form"){a.event.add(this,"click.specialSubmit",function(bg){var bf=bg.target,be=bf.type;if((be==="submit"||be==="image")&&a(bf).closest("form").length){aN("submit",this,arguments)}});a.event.add(this,"keypress.specialSubmit",function(bg){var bf=bg.target,be=bf.type;if((be==="text"||be==="password")&&a(bf).closest("form").length&&bg.keyCode===13){aN("submit",this,arguments)}})}else{return false}},teardown:function(e){a.event.remove(this,".specialSubmit")}}}if(!a.support.changeBubbles){var a6,j=function(bd){var e=bd.type,be=bd.value;if(e==="radio"||e==="checkbox"){be=bd.checked}else{if(e==="select-multiple"){be=bd.selectedIndex>-1?a.map(bd.options,function(bf){return bf.selected}).join("-"):""}else{if(bd.nodeName.toLowerCase()==="select"){be=bd.selectedIndex}}}return be},X=function X(bf){var bd=bf.target,be,bg;if(!a0.test(bd.nodeName)||bd.readOnly){return}be=a._data(bd,"_change_data");bg=j(bd);if(bf.type!=="focusout"||bd.type!=="radio"){a._data(bd,"_change_data",bg)}if(be===H||bg===be){return}if(be!=null||bg){bf.type="change";bf.liveFired=H;a.event.trigger(bf,arguments[1],bd)}};a.event.special.change={filters:{focusout:X,beforedeactivate:X,click:function(bf){var be=bf.target,bd=be.type;if(bd==="radio"||bd==="checkbox"||be.nodeName.toLowerCase()==="select"){X.call(this,bf)}},keydown:function(bf){var be=bf.target,bd=be.type;if((bf.keyCode===13&&be.nodeName.toLowerCase()!=="textarea")||(bf.keyCode===32&&(bd==="checkbox"||bd==="radio"))||bd==="select-multiple"){X.call(this,bf)}},beforeactivate:function(be){var bd=be.target;a._data(bd,"_change_data",j(bd))}},setup:function(be,bd){if(this.type==="file"){return false}for(var e in a6){a.event.add(this,e+".specialChange",a6[e])}return a0.test(this.nodeName)},teardown:function(e){a.event.remove(this,".specialChange");return a0.test(this.nodeName)}};a6=a.event.special.change.filters;a6.focus=a6.beforeactivate}function aN(bd,bf,e){var be=a.extend({},e[0]);be.type=bd;be.originalEvent={};be.liveFired=H;a.event.handle.call(bf,be);if(be.isDefaultPrevented()){e[0].preventDefault()}}if(al.addEventListener){a.each({focus:"focusin",blur:"focusout"},function(be,e){a.event.special[e]={setup:function(){this.addEventListener(be,bd,true)},teardown:function(){this.removeEventListener(be,bd,true)}};function bd(bf){bf=a.event.fix(bf);bf.type=e;return a.event.handle.call(this,bf)}})}a.each(["bind","one"],function(bd,e){a.fn[e]=function(bj,bk,bi){if(typeof bj==="object"){for(var bg in bj){this[e](bg,bk,bj[bg],bi)}return this}if(a.isFunction(bk)||bk===false){bi=bk;bk=H}var bh=e==="one"?a.proxy(bi,function(bl){a(this).unbind(bl,bh);return bi.apply(this,arguments)}):bi;if(bj==="unload"&&e!=="one"){this.one(bj,bk,bi)}else{for(var bf=0,be=this.length;bf<be;bf++){a.event.add(this[bf],bj,bh,bk)}}return this}});a.fn.extend({unbind:function(bg,bf){if(typeof bg==="object"&&!bg.preventDefault){for(var be in bg){this.unbind(be,bg[be])}}else{for(var bd=0,e=this.length;bd<e;bd++){a.event.remove(this[bd],bg,bf)}}return this},delegate:function(e,bd,bf,be){return this.live(bd,bf,be,e)},undelegate:function(e,bd,be){if(arguments.length===0){return this.unbind("live")}else{return this.die(bd,null,be,e)}},trigger:function(e,bd){return this.each(function(){a.event.trigger(e,bd,this)})},triggerHandler:function(e,be){if(this[0]){var bd=a.Event(e);bd.preventDefault();bd.stopPropagation();a.event.trigger(bd,be,this[0]);return bd.result}},toggle:function(be){var e=arguments,bd=1;while(bd<e.length){a.proxy(be,e[bd++])}return this.click(a.proxy(be,function(bf){var bg=(a._data(this,"lastToggle"+be.guid)||0)%bd;a._data(this,"lastToggle"+be.guid,bg+1);bf.preventDefault();return e[bg].apply(this,arguments)||false}))},hover:function(e,bd){return this.mouseenter(e).mouseleave(bd||e)}});var aH={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};a.each(["live","die"],function(bd,e){a.fn[e]=function(bn,bk,bp,bg){var bo,bl=0,bm,bf,br,bi=bg||this.selector,be=bg?this:a(this.context);if(typeof bn==="object"&&!bn.preventDefault){for(var bq in bn){be[e](bq,bk,bn[bq],bi)}return this}if(a.isFunction(bk)){bp=bk;bk=H}bn=(bn||"").split(" ");while((bo=bn[bl++])!=null){bm=aP.exec(bo);bf="";if(bm){bf=bm[0];bo=bo.replace(aP,"")}if(bo==="hover"){bn.push("mouseenter"+bf,"mouseleave"+bf);continue}br=bo;if(bo==="focus"||bo==="blur"){bn.push(aH[bo]+bf);bo=bo+bf}else{bo=(aH[bo]||bo)+bf}if(e==="live"){for(var bj=0,bh=be.length;bj<bh;bj++){a.event.add(be[bj],"live."+n(bo,bi),{data:bk,selector:bi,handler:bp,origType:bo,origHandler:bp,preType:br})}}else{be.unbind("live."+n(bo,bi),bp)}}return this}});function af(bn){var bk,bf,bt,bh,e,bp,bm,bo,bl,bs,bj,bi,br,bq=[],bg=[],bd=a._data(this,"events");if(bn.liveFired===this||!bd||!bd.live||bn.target.disabled||bn.button&&bn.type==="click"){return}if(bn.namespace){bi=new RegExp("(^|\\.)"+bn.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")}bn.liveFired=this;var be=bd.live.slice(0);for(bm=0;bm<be.length;bm++){e=be[bm];if(e.origType.replace(aP,"")===bn.type){bg.push(e.selector)}else{be.splice(bm--,1)}}bh=a(bn.target).closest(bg,bn.currentTarget);for(bo=0,bl=bh.length;bo<bl;bo++){bj=bh[bo];for(bm=0;bm<be.length;bm++){e=be[bm];if(bj.selector===e.selector&&(!bi||bi.test(e.namespace))&&!bj.elem.disabled){bp=bj.elem;bt=null;if(e.preType==="mouseenter"||e.preType==="mouseleave"){bn.type=e.preType;bt=a(bn.relatedTarget).closest(e.selector)[0]}if(!bt||bt!==bp){bq.push({elem:bp,handleObj:e,level:bj.level})}}}}for(bo=0,bl=bq.length;bo<bl;bo++){bh=bq[bo];if(bf&&bh.level>bf){break}bn.currentTarget=bh.elem;bn.data=bh.handleObj.data;bn.handleObj=bh.handleObj;br=bh.handleObj.origHandler.apply(bh.elem,arguments);if(br===false||bn.isPropagationStopped()){bf=bh.level;if(br===false){bk=false}if(bn.isImmediatePropagationStopped()){break}}}return bk}function n(bd,e){return(bd&&bd!=="*"?bd+".":"")+e.replace(K,"`").replace(aa,"&")}a.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error").split(" "),function(bd,e){a.fn[e]=function(bf,be){if(be==null){be=bf;bf=null}return arguments.length>0?this.bind(e,bf,be):this.trigger(e)};if(a.attrFn){a.attrFn[e]=true}});
+(function(a0,I){var am=a0.document;var b=(function(){var bo=function(bI,bJ){return new bo.fn.init(bI,bJ,bm)},bD=a0.jQuery,bq=a0.$,bm,bH=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]+)$)/,bw=/\S/,bs=/^\s+/,bn=/\s+$/,br=/\d/,bk=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,bx=/^[\],:{}\s]*$/,bF=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,bz=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,bt=/(?:^|:|,)(?:\s*\[)+/g,bi=/(webkit)[ \/]([\w.]+)/,bB=/(opera)(?:.*version)?[ \/]([\w.]+)/,bA=/(msie) ([\w.]+)/,bC=/(mozilla)(?:.*? rv:([\w.]+))?/,bG=navigator.userAgent,bE,bl,e,bv=Object.prototype.toString,bp=Object.prototype.hasOwnProperty,bj=Array.prototype.push,bu=Array.prototype.slice,by=String.prototype.trim,bf=Array.prototype.indexOf,bh={};bo.fn=bo.prototype={constructor:bo,init:function(bI,bM,bL){var bK,bN,bJ,bO;if(!bI){return this}if(bI.nodeType){this.context=this[0]=bI;this.length=1;return this}if(bI==="body"&&!bM&&am.body){this.context=am;this[0]=am.body;this.selector="body";this.length=1;return this}if(typeof bI==="string"){bK=bH.exec(bI);if(bK&&(bK[1]||!bM)){if(bK[1]){bM=bM instanceof bo?bM[0]:bM;bO=(bM?bM.ownerDocument||bM:am);bJ=bk.exec(bI);if(bJ){if(bo.isPlainObject(bM)){bI=[am.createElement(bJ[1])];bo.fn.attr.call(bI,bM,true)}else{bI=[bO.createElement(bJ[1])]}}else{bJ=bo.buildFragment([bK[1]],[bO]);bI=(bJ.cacheable?bo.clone(bJ.fragment):bJ.fragment).childNodes}return bo.merge(this,bI)}else{bN=am.getElementById(bK[2]);if(bN&&bN.parentNode){if(bN.id!==bK[2]){return bL.find(bI)}this.length=1;this[0]=bN}this.context=am;this.selector=bI;return this}}else{if(!bM||bM.jquery){return(bM||bL).find(bI)}else{return this.constructor(bM).find(bI)}}}else{if(bo.isFunction(bI)){return bL.ready(bI)}}if(bI.selector!==I){this.selector=bI.selector;this.context=bI.context}return bo.makeArray(bI,this)},selector:"",jquery:"1.5.2",length:0,size:function(){return this.length},toArray:function(){return bu.call(this,0)},get:function(bI){return bI==null?this.toArray():(bI<0?this[this.length+bI]:this[bI])},pushStack:function(bJ,bL,bI){var bK=this.constructor();if(bo.isArray(bJ)){bj.apply(bK,bJ)}else{bo.merge(bK,bJ)}bK.prevObject=this;bK.context=this.context;if(bL==="find"){bK.selector=this.selector+(this.selector?" ":"")+bI}else{if(bL){bK.selector=this.selector+"."+bL+"("+bI+")"}}return bK},each:function(bJ,bI){return bo.each(this,bJ,bI)},ready:function(bI){bo.bindReady();bl.done(bI);return this},eq:function(bI){return bI===-1?this.slice(bI):this.slice(bI,+bI+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(bu.apply(this,arguments),"slice",bu.call(arguments).join(","))},map:function(bI){return this.pushStack(bo.map(this,function(bK,bJ){return bI.call(bK,bJ,bK)}))},end:function(){return this.prevObject||this.constructor(null)},push:bj,sort:[].sort,splice:[].splice};bo.fn.init.prototype=bo.fn;bo.extend=bo.fn.extend=function(){var bR,bK,bI,bJ,bO,bP,bN=arguments[0]||{},bM=1,bL=arguments.length,bQ=false;if(typeof bN==="boolean"){bQ=bN;bN=arguments[1]||{};bM=2}if(typeof bN!=="object"&&!bo.isFunction(bN)){bN={}}if(bL===bM){bN=this;--bM}for(;bM<bL;bM++){if((bR=arguments[bM])!=null){for(bK in bR){bI=bN[bK];bJ=bR[bK];if(bN===bJ){continue}if(bQ&&bJ&&(bo.isPlainObject(bJ)||(bO=bo.isArray(bJ)))){if(bO){bO=false;bP=bI&&bo.isArray(bI)?bI:[]}else{bP=bI&&bo.isPlainObject(bI)?bI:{}}bN[bK]=bo.extend(bQ,bP,bJ)}else{if(bJ!==I){bN[bK]=bJ}}}}}return bN};bo.extend({noConflict:function(bI){a0.$=bq;if(bI){a0.jQuery=bD}return bo},isReady:false,readyWait:1,ready:function(bI){if(bI===true){bo.readyWait--}if(!bo.readyWait||(bI!==true&&!bo.isReady)){if(!am.body){return setTimeout(bo.ready,1)}bo.isReady=true;if(bI!==true&&--bo.readyWait>0){return}bl.resolveWith(am,[bo]);if(bo.fn.trigger){bo(am).trigger("ready").unbind("ready")}}},bindReady:function(){if(bl){return}bl=bo._Deferred();if(am.readyState==="complete"){return setTimeout(bo.ready,1)}if(am.addEventListener){am.addEventListener("DOMContentLoaded",e,false);a0.addEventListener("load",bo.ready,false)}else{if(am.attachEvent){am.attachEvent("onreadystatechange",e);a0.attachEvent("onload",bo.ready);var bI=false;try{bI=a0.frameElement==null}catch(bJ){}if(am.documentElement.doScroll&&bI){bg()}}}},isFunction:function(bI){return bo.type(bI)==="function"},isArray:Array.isArray||function(bI){return bo.type(bI)==="array"},isWindow:function(bI){return bI&&typeof bI==="object"&&"setInterval" in bI},isNaN:function(bI){return bI==null||!br.test(bI)||isNaN(bI)},type:function(bI){return bI==null?String(bI):bh[bv.call(bI)]||"object"},isPlainObject:function(bJ){if(!bJ||bo.type(bJ)!=="object"||bJ.nodeType||bo.isWindow(bJ)){return false}if(bJ.constructor&&!bp.call(bJ,"constructor")&&!bp.call(bJ.constructor.prototype,"isPrototypeOf")){return false}var bI;for(bI in bJ){}return bI===I||bp.call(bJ,bI)},isEmptyObject:function(bJ){for(var bI in bJ){return false}return true},error:function(bI){throw bI},parseJSON:function(bI){if(typeof bI!=="string"||!bI){return null}bI=bo.trim(bI);if(bx.test(bI.replace(bF,"@").replace(bz,"]").replace(bt,""))){return a0.JSON&&a0.JSON.parse?a0.JSON.parse(bI):(new Function("return "+bI))()}else{bo.error("Invalid JSON: "+bI)}},parseXML:function(bK,bI,bJ){if(a0.DOMParser){bJ=new DOMParser();bI=bJ.parseFromString(bK,"text/xml")}else{bI=new ActiveXObject("Microsoft.XMLDOM");bI.async="false";bI.loadXML(bK)}bJ=bI.documentElement;if(!bJ||!bJ.nodeName||bJ.nodeName==="parsererror"){bo.error("Invalid XML: "+bK)}return bI},noop:function(){},globalEval:function(bK){if(bK&&bw.test(bK)){var bJ=am.head||am.getElementsByTagName("head")[0]||am.documentElement,bI=am.createElement("script");if(bo.support.scriptEval()){bI.appendChild(am.createTextNode(bK))}else{bI.text=bK}bJ.insertBefore(bI,bJ.firstChild);bJ.removeChild(bI)}},nodeName:function(bJ,bI){return bJ.nodeName&&bJ.nodeName.toUpperCase()===bI.toUpperCase()},each:function(bL,bP,bK){var bJ,bM=0,bN=bL.length,bI=bN===I||bo.isFunction(bL);if(bK){if(bI){for(bJ in bL){if(bP.apply(bL[bJ],bK)===false){break}}}else{for(;bM<bN;){if(bP.apply(bL[bM++],bK)===false){break}}}}else{if(bI){for(bJ in bL){if(bP.call(bL[bJ],bJ,bL[bJ])===false){break}}}else{for(var bO=bL[0];bM<bN&&bP.call(bO,bM,bO)!==false;bO=bL[++bM]){}}}return bL},trim:by?function(bI){return bI==null?"":by.call(bI)}:function(bI){return bI==null?"":bI.toString().replace(bs,"").replace(bn,"")},makeArray:function(bL,bJ){var bI=bJ||[];if(bL!=null){var bK=bo.type(bL);if(bL.length==null||bK==="string"||bK==="function"||bK==="regexp"||bo.isWindow(bL)){bj.call(bI,bL)}else{bo.merge(bI,bL)}}return bI},inArray:function(bK,bL){if(bL.indexOf){return bL.indexOf(bK)}for(var bI=0,bJ=bL.length;bI<bJ;bI++){if(bL[bI]===bK){return bI}}return -1},merge:function(bM,bK){var bL=bM.length,bJ=0;if(typeof bK.length==="number"){for(var bI=bK.length;bJ<bI;bJ++){bM[bL++]=bK[bJ]}}else{while(bK[bJ]!==I){bM[bL++]=bK[bJ++]}}bM.length=bL;return bM},grep:function(bJ,bO,bI){var bK=[],bN;bI=!!bI;for(var bL=0,bM=bJ.length;bL<bM;bL++){bN=!!bO(bJ[bL],bL);if(bI!==bN){bK.push(bJ[bL])}}return bK},map:function(bJ,bO,bI){var bK=[],bN;for(var bL=0,bM=bJ.length;bL<bM;bL++){bN=bO(bJ[bL],bL,bI);if(bN!=null){bK[bK.length]=bN}}return bK.concat.apply([],bK)},guid:1,proxy:function(bK,bJ,bI){if(arguments.length===2){if(typeof bJ==="string"){bI=bK;bK=bI[bJ];bJ=I}else{if(bJ&&!bo.isFunction(bJ)){bI=bJ;bJ=I}}}if(!bJ&&bK){bJ=function(){return bK.apply(bI||this,arguments)}}if(bK){bJ.guid=bK.guid=bK.guid||bJ.guid||bo.guid++}return bJ},access:function(bI,bQ,bO,bK,bN,bP){var bJ=bI.length;if(typeof bQ==="object"){for(var bL in bQ){bo.access(bI,bL,bQ[bL],bK,bN,bO)}return bI}if(bO!==I){bK=!bP&&bK&&bo.isFunction(bO);for(var bM=0;bM<bJ;bM++){bN(bI[bM],bQ,bK?bO.call(bI[bM],bM,bN(bI[bM],bQ)):bO,bP)}return bI}return bJ?bN(bI[0],bQ):I},now:function(){return(new Date()).getTime()},uaMatch:function(bJ){bJ=bJ.toLowerCase();var bI=bi.exec(bJ)||bB.exec(bJ)||bA.exec(bJ)||bJ.indexOf("compatible")<0&&bC.exec(bJ)||[];return{browser:bI[1]||"",version:bI[2]||"0"}},sub:function(){function bJ(bL,bM){return new bJ.fn.init(bL,bM)}bo.extend(true,bJ,this);bJ.superclass=this;bJ.fn=bJ.prototype=this();bJ.fn.constructor=bJ;bJ.subclass=this.subclass;bJ.fn.init=function bK(bL,bM){if(bM&&bM instanceof bo&&!(bM instanceof bJ)){bM=bJ(bM)}return bo.fn.init.call(this,bL,bM,bI)};bJ.fn.init.prototype=bJ.fn;var bI=bJ(am);return bJ},browser:{}});bo.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(bJ,bI){bh["[object "+bI+"]"]=bI.toLowerCase()});bE=bo.uaMatch(bG);if(bE.browser){bo.browser[bE.browser]=true;bo.browser.version=bE.version}if(bo.browser.webkit){bo.browser.safari=true}if(bf){bo.inArray=function(bI,bJ){return bf.call(bJ,bI)}}if(bw.test("\xA0")){bs=/^[\s\xA0]+/;bn=/[\s\xA0]+$/}bm=bo(am);if(am.addEventListener){e=function(){am.removeEventListener("DOMContentLoaded",e,false);bo.ready()}}else{if(am.attachEvent){e=function(){if(am.readyState==="complete"){am.detachEvent("onreadystatechange",e);bo.ready()}}}}function bg(){if(bo.isReady){return}try{am.documentElement.doScroll("left")}catch(bI){setTimeout(bg,1);return}bo.ready()}return bo})();var a="then done fail isResolved isRejected promise".split(" "),aA=[].slice;b.extend({_Deferred:function(){var bh=[],bi,bf,bg,e={done:function(){if(!bg){var bk=arguments,bl,bo,bn,bm,bj;if(bi){bj=bi;bi=0}for(bl=0,bo=bk.length;bl<bo;bl++){bn=bk[bl];bm=b.type(bn);if(bm==="array"){e.done.apply(e,bn)}else{if(bm==="function"){bh.push(bn)}}}if(bj){e.resolveWith(bj[0],bj[1])}}return this},resolveWith:function(bk,bj){if(!bg&&!bi&&!bf){bj=bj||[];bf=1;try{while(bh[0]){bh.shift().apply(bk,bj)}}finally{bi=[bk,bj];bf=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return !!(bf||bi)},cancel:function(){bg=1;bh=[];return this}};return e},Deferred:function(bf){var e=b._Deferred(),bh=b._Deferred(),bg;b.extend(e,{then:function(bj,bi){e.done(bj).fail(bi);return this},fail:bh.done,rejectWith:bh.resolveWith,reject:bh.resolve,isRejected:bh.isResolved,promise:function(bj){if(bj==null){if(bg){return bg}bg=bj={}}var bi=a.length;while(bi--){bj[a[bi]]=e[a[bi]]}return bj}});e.done(bh.cancel).fail(e.cancel);delete e.cancel;if(bf){bf.call(e,e)}return e},when:function(bk){var bf=arguments,bg=0,bj=bf.length,bi=bj,e=bj<=1&&bk&&b.isFunction(bk.promise)?bk:b.Deferred();function bh(bl){return function(bm){bf[bl]=arguments.length>1?aA.call(arguments,0):bm;if(!(--bi)){e.resolveWith(e,aA.call(bf,0))}}}if(bj>1){for(;bg<bj;bg++){if(bf[bg]&&b.isFunction(bf[bg].promise)){bf[bg].promise().then(bh(bg),e.reject)}else{--bi}}if(!bi){e.resolveWith(e,bf)}}else{if(e!==bk){e.resolveWith(e,bj?[bk]:[])}}return e.promise()}});(function(){b.support={};var bf=am.createElement("div");bf.style.display="none";bf.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var bo=bf.getElementsByTagName("*"),bm=bf.getElementsByTagName("a")[0],bn=am.createElement("select"),bg=bn.appendChild(am.createElement("option")),bl=bf.getElementsByTagName("input")[0];if(!bo||!bo.length||!bm){return}b.support={leadingWhitespace:bf.firstChild.nodeType===3,tbody:!bf.getElementsByTagName("tbody").length,htmlSerialize:!!bf.getElementsByTagName("link").length,style:/red/.test(bm.getAttribute("style")),hrefNormalized:bm.getAttribute("href")==="/a",opacity:/^0.55$/.test(bm.style.opacity),cssFloat:!!bm.style.cssFloat,checkOn:bl.value==="on",optSelected:bg.selected,deleteExpando:true,optDisabled:false,checkClone:false,noCloneEvent:true,noCloneChecked:true,boxModel:null,inlineBlockNeedsLayout:false,shrinkWrapBlocks:false,reliableHiddenOffsets:true,reliableMarginRight:true};bl.checked=true;b.support.noCloneChecked=bl.cloneNode(true).checked;bn.disabled=true;b.support.optDisabled=!bg.disabled;var bh=null;b.support.scriptEval=function(){if(bh===null){var bq=am.documentElement,br=am.createElement("script"),bt="script"+b.now();try{br.appendChild(am.createTextNode("window."+bt+"=1;"))}catch(bs){}bq.insertBefore(br,bq.firstChild);if(a0[bt]){bh=true;delete a0[bt]}else{bh=false}bq.removeChild(br)}return bh};try{delete bf.test}catch(bj){b.support.deleteExpando=false}if(!bf.addEventListener&&bf.attachEvent&&bf.fireEvent){bf.attachEvent("onclick",function bp(){b.support.noCloneEvent=false;bf.detachEvent("onclick",bp)});bf.cloneNode(true).fireEvent("onclick")}bf=am.createElement("div");bf.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";var bi=am.createDocumentFragment();bi.appendChild(bf.firstChild);b.support.checkClone=bi.cloneNode(true).cloneNode(true).lastChild.checked;b(function(){var br=am.createElement("div"),e=am.getElementsByTagName("body")[0];if(!e){return}br.style.width=br.style.paddingLeft="1px";e.appendChild(br);b.boxModel=b.support.boxModel=br.offsetWidth===2;if("zoom" in br.style){br.style.display="inline";br.style.zoom=1;b.support.inlineBlockNeedsLayout=br.offsetWidth===2;br.style.display="";br.innerHTML="<div style='width:4px;'></div>";b.support.shrinkWrapBlocks=br.offsetWidth!==2}br.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";var bq=br.getElementsByTagName("td");b.support.reliableHiddenOffsets=bq[0].offsetHeight===0;bq[0].style.display="";bq[1].style.display="none";b.support.reliableHiddenOffsets=b.support.reliableHiddenOffsets&&bq[0].offsetHeight===0;br.innerHTML="";if(am.defaultView&&am.defaultView.getComputedStyle){br.style.width="1px";br.style.marginRight="0";b.support.reliableMarginRight=(parseInt(am.defaultView.getComputedStyle(br,null).marginRight,10)||0)===0}e.removeChild(br).style.display="none";br=bq=null});var bk=function(e){var br=am.createElement("div");e="on"+e;if(!br.attachEvent){return true}var bq=(e in br);if(!bq){br.setAttribute(e,"return;");bq=typeof br[e]==="function"}return bq};b.support.submitBubbles=bk("submit");b.support.changeBubbles=bk("change");bf=bo=bm=null})();var aG=/^(?:\{.*\}|\[.*\])$/;b.extend({cache:{},uuid:0,expando:"jQuery"+(b.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:true,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:true},hasData:function(e){e=e.nodeType?b.cache[e[b.expando]]:e[b.expando];return !!e&&!Q(e)},data:function(bh,bf,bj,bi){if(!b.acceptData(bh)){return}var bm=b.expando,bl=typeof bf==="string",bk,bn=bh.nodeType,e=bn?b.cache:bh,bg=bn?bh[b.expando]:bh[b.expando]&&b.expando;if((!bg||(bi&&bg&&!e[bg][bm]))&&bl&&bj===I){return}if(!bg){if(bn){bh[b.expando]=bg=++b.uuid}else{bg=b.expando}}if(!e[bg]){e[bg]={};if(!bn){e[bg].toJSON=b.noop}}if(typeof bf==="object"||typeof bf==="function"){if(bi){e[bg][bm]=b.extend(e[bg][bm],bf)}else{e[bg]=b.extend(e[bg],bf)}}bk=e[bg];if(bi){if(!bk[bm]){bk[bm]={}}bk=bk[bm]}if(bj!==I){bk[bf]=bj}if(bf==="events"&&!bk[bf]){return bk[bm]&&bk[bm].events}return bl?bk[bf]:bk},removeData:function(bi,bg,bj){if(!b.acceptData(bi)){return}var bl=b.expando,bm=bi.nodeType,bf=bm?b.cache:bi,bh=bm?bi[b.expando]:b.expando;if(!bf[bh]){return}if(bg){var bk=bj?bf[bh][bl]:bf[bh];if(bk){delete bk[bg];if(!Q(bk)){return}}}if(bj){delete bf[bh][bl];if(!Q(bf[bh])){return}}var e=bf[bh][bl];if(b.support.deleteExpando||bf!=a0){delete bf[bh]}else{bf[bh]=null}if(e){bf[bh]={};if(!bm){bf[bh].toJSON=b.noop}bf[bh][bl]=e}else{if(bm){if(b.support.deleteExpando){delete bi[b.expando]}else{if(bi.removeAttribute){bi.removeAttribute(b.expando)}else{bi[b.expando]=null}}}}},_data:function(bf,e,bg){return b.data(bf,e,bg,true)},acceptData:function(bf){if(bf.nodeName){var e=b.noData[bf.nodeName.toLowerCase()];if(e){return !(e===true||bf.getAttribute("classid")!==e)}}return true}});b.fn.extend({data:function(bi,bk){var bj=null;if(typeof bi==="undefined"){if(this.length){bj=b.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,bg;for(var bh=0,bf=e.length;bh<bf;bh++){bg=e[bh].name;if(bg.indexOf("data-")===0){bg=bg.substr(5);aV(this[0],bg,bj[bg])}}}}return bj}else{if(typeof bi==="object"){return this.each(function(){b.data(this,bi)})}}var bl=bi.split(".");bl[1]=bl[1]?"."+bl[1]:"";if(bk===I){bj=this.triggerHandler("getData"+bl[1]+"!",[bl[0]]);if(bj===I&&this.length){bj=b.data(this[0],bi);bj=aV(this[0],bi,bj)}return bj===I&&bl[1]?this.data(bl[0]):bj}else{return this.each(function(){var bn=b(this),bm=[bl[0],bk];bn.triggerHandler("setData"+bl[1]+"!",bm);b.data(this,bi,bk);bn.triggerHandler("changeData"+bl[1]+"!",bm)})}},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function aV(bg,bf,bh){if(bh===I&&bg.nodeType===1){bh=bg.getAttribute("data-"+bf);if(typeof bh==="string"){try{bh=bh==="true"?true:bh==="false"?false:bh==="null"?null:!b.isNaN(bh)?parseFloat(bh):aG.test(bh)?b.parseJSON(bh):bh}catch(bi){}b.data(bg,bf,bh)}else{bh=I}}return bh}function Q(bf){for(var e in bf){if(e!=="toJSON"){return false}}return true}b.extend({queue:function(bf,e,bh){if(!bf){return}e=(e||"fx")+"queue";var bg=b._data(bf,e);if(!bh){return bg||[]}if(!bg||b.isArray(bh)){bg=b._data(bf,e,b.makeArray(bh))}else{bg.push(bh)}return bg},dequeue:function(bh,bg){bg=bg||"fx";var e=b.queue(bh,bg),bf=e.shift();if(bf==="inprogress"){bf=e.shift()}if(bf){if(bg==="fx"){e.unshift("inprogress")}bf.call(bh,function(){b.dequeue(bh,bg)})}if(!e.length){b.removeData(bh,bg+"queue",true)}}});b.fn.extend({queue:function(e,bf){if(typeof e!=="string"){bf=e;e="fx"}if(bf===I){return b.queue(this[0],e)}return this.each(function(bh){var bg=b.queue(this,e,bf);if(e==="fx"&&bg[0]!=="inprogress"){b.dequeue(this,e)}})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(bf,e){bf=b.fx?b.fx.speeds[bf]||bf:bf;e=e||"fx";return this.queue(e,function(){var bg=this;setTimeout(function(){b.dequeue(bg,e)},bf)})},clearQueue:function(e){return this.queue(e||"fx",[])}});var aE=/[\n\t\r]/g,a5=/\s+/,aI=/\r/g,a4=/^(?:href|src|style)$/,g=/^(?:button|input)$/i,D=/^(?:button|input|object|select|textarea)$/i,l=/^a(?:rea)?$/i,R=/^(?:radio|checkbox)$/i;b.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};b.fn.extend({attr:function(e,bf){return b.access(this,e,bf,true,b.attr)},removeAttr:function(e,bf){return this.each(function(){b.attr(this,e,"");if(this.nodeType===1){this.removeAttribute(e)}})},addClass:function(bl){if(b.isFunction(bl)){return this.each(function(bo){var bn=b(this);bn.addClass(bl.call(this,bo,bn.attr("class")))})}if(bl&&typeof bl==="string"){var e=(bl||"").split(a5);for(var bh=0,bg=this.length;bh<bg;bh++){var bf=this[bh];if(bf.nodeType===1){if(!bf.className){bf.className=bl}else{var bi=" "+bf.className+" ",bk=bf.className;for(var bj=0,bm=e.length;bj<bm;bj++){if(bi.indexOf(" "+e[bj]+" ")<0){bk+=" "+e[bj]}}bf.className=b.trim(bk)}}}}return this},removeClass:function(bj){if(b.isFunction(bj)){return this.each(function(bn){var bm=b(this);bm.removeClass(bj.call(this,bn,bm.attr("class")))})}if((bj&&typeof bj==="string")||bj===I){var bk=(bj||"").split(a5);for(var bg=0,bf=this.length;bg<bf;bg++){var bi=this[bg];if(bi.nodeType===1&&bi.className){if(bj){var bh=(" "+bi.className+" ").replace(aE," ");for(var bl=0,e=bk.length;bl<e;bl++){bh=bh.replace(" "+bk[bl]+" "," ")}bi.className=b.trim(bh)}else{bi.className=""}}}}return this},toggleClass:function(bh,bf){var bg=typeof bh,e=typeof bf==="boolean";if(b.isFunction(bh)){return this.each(function(bj){var bi=b(this);bi.toggleClass(bh.call(this,bj,bi.attr("class"),bf),bf)})}return this.each(function(){if(bg==="string"){var bk,bj=0,bi=b(this),bl=bf,bm=bh.split(a5);while((bk=bm[bj++])){bl=e?bl:!bi.hasClass(bk);bi[bl?"addClass":"removeClass"](bk)}}else{if(bg==="undefined"||bg==="boolean"){if(this.className){b._data(this,"__className__",this.className)}this.className=this.className||bh===false?"":b._data(this,"__className__")||""}}})},hasClass:function(e){var bh=" "+e+" ";for(var bg=0,bf=this.length;bg<bf;bg++){if((" "+this[bg].className+" ").replace(aE," ").indexOf(bh)>-1){return true}}return false},val:function(bm){if(!arguments.length){var bg=this[0];if(bg){if(b.nodeName(bg,"option")){var bf=bg.attributes.value;return !bf||bf.specified?bg.value:bg.text}if(b.nodeName(bg,"select")){var bk=bg.selectedIndex,bn=[],bo=bg.options,bj=bg.type==="select-one";if(bk<0){return null}for(var bh=bj?bk:0,bl=bj?bk+1:bo.length;bh<bl;bh++){var bi=bo[bh];if(bi.selected&&(b.support.optDisabled?!bi.disabled:bi.getAttribute("disabled")===null)&&(!bi.parentNode.disabled||!b.nodeName(bi.parentNode,"optgroup"))){bm=b(bi).val();if(bj){return bm}bn.push(bm)}}if(bj&&!bn.length&&bo.length){return b(bo[bk]).val()}return bn}if(R.test(bg.type)&&!b.support.checkOn){return bg.getAttribute("value")===null?"on":bg.value}return(bg.value||"").replace(aI,"")}return I}var e=b.isFunction(bm);return this.each(function(br){var bq=b(this),bs=bm;if(this.nodeType!==1){return}if(e){bs=bm.call(this,br,bq.val())}if(bs==null){bs=""}else{if(typeof bs==="number"){bs+=""}else{if(b.isArray(bs)){bs=b.map(bs,function(bt){return bt==null?"":bt+""})}}}if(b.isArray(bs)&&R.test(this.type)){this.checked=b.inArray(bq.val(),bs)>=0}else{if(b.nodeName(this,"select")){var bp=b.makeArray(bs);b("option",this).each(function(){this.selected=b.inArray(b(this).val(),bp)>=0});if(!bp.length){this.selectedIndex=-1}}else{this.value=bs}}})}});b.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(bf,e,bk,bn){if(!bf||bf.nodeType===3||bf.nodeType===8||bf.nodeType===2){return I}if(bn&&e in b.attrFn){return b(bf)[e](bk)}var bg=bf.nodeType!==1||!b.isXMLDoc(bf),bj=bk!==I;e=bg&&b.props[e]||e;if(bf.nodeType===1){var bi=a4.test(e);if(e==="selected"&&!b.support.optSelected){var bl=bf.parentNode;if(bl){bl.selectedIndex;if(bl.parentNode){bl.parentNode.selectedIndex}}}if((e in bf||bf[e]!==I)&&bg&&!bi){if(bj){if(e==="type"&&g.test(bf.nodeName)&&bf.parentNode){b.error("type property can't be changed")}if(bk===null){if(bf.nodeType===1){bf.removeAttribute(e)}}else{bf[e]=bk}}if(b.nodeName(bf,"form")&&bf.getAttributeNode(e)){return bf.getAttributeNode(e).nodeValue}if(e==="tabIndex"){var bm=bf.getAttributeNode("tabIndex");return bm&&bm.specified?bm.value:D.test(bf.nodeName)||l.test(bf.nodeName)&&bf.href?0:I}return bf[e]}if(!b.support.style&&bg&&e==="style"){if(bj){bf.style.cssText=""+bk}return bf.style.cssText}if(bj){bf.setAttribute(e,""+bk)}if(!bf.attributes[e]&&(bf.hasAttribute&&!bf.hasAttribute(e))){return I}var bh=!b.support.hrefNormalized&&bg&&bi?bf.getAttribute(e,2):bf.getAttribute(e);return bh===null?I:bh}if(bj){bf[e]=bk}return bf[e]}});var aR=/\.(.*)$/,a2=/^(?:textarea|input|select)$/i,L=/\./g,ab=/ /g,ax=/[^\w\s.|`]/g,F=function(e){return e.replace(ax,"\\$&")};b.event={add:function(bi,bm,bt,bk){if(bi.nodeType===3||bi.nodeType===8){return}try{if(b.isWindow(bi)&&(bi!==a0&&!bi.frameElement)){bi=a0}}catch(bn){}if(bt===false){bt=a7}else{if(!bt){return}}var bg,br;if(bt.handler){bg=bt;bt=bg.handler}if(!bt.guid){bt.guid=b.guid++}var bo=b._data(bi);if(!bo){return}var bs=bo.events,bl=bo.handle;if(!bs){bo.events=bs={}}if(!bl){bo.handle=bl=function(bu){return typeof b!=="undefined"&&b.event.triggered!==bu.type?b.event.handle.apply(bl.elem,arguments):I}}bl.elem=bi;bm=bm.split(" ");var bq,bj=0,bf;while((bq=bm[bj++])){br=bg?b.extend({},bg):{handler:bt,data:bk};if(bq.indexOf(".")>-1){bf=bq.split(".");bq=bf.shift();br.namespace=bf.slice(0).sort().join(".")}else{bf=[];br.namespace=""}br.type=bq;if(!br.guid){br.guid=bt.guid}var bh=bs[bq],bp=b.event.special[bq]||{};if(!bh){bh=bs[bq]=[];if(!bp.setup||bp.setup.call(bi,bk,bf,bl)===false){if(bi.addEventListener){bi.addEventListener(bq,bl,false)}else{if(bi.attachEvent){bi.attachEvent("on"+bq,bl)}}}}if(bp.add){bp.add.call(bi,br);if(!br.handler.guid){br.handler.guid=bt.guid}}bh.push(br);b.event.global[bq]=true}bi=null},global:{},remove:function(bt,bo,bg,bk){if(bt.nodeType===3||bt.nodeType===8){return}if(bg===false){bg=a7}var bw,bj,bl,bq,br=0,bh,bm,bp,bi,bn,e,bv,bs=b.hasData(bt)&&b._data(bt),bf=bs&&bs.events;if(!bs||!bf){return}if(bo&&bo.type){bg=bo.handler;bo=bo.type}if(!bo||typeof bo==="string"&&bo.charAt(0)==="."){bo=bo||"";for(bj in bf){b.event.remove(bt,bj+bo)}return}bo=bo.split(" ");while((bj=bo[br++])){bv=bj;e=null;bh=bj.indexOf(".")<0;bm=[];if(!bh){bm=bj.split(".");bj=bm.shift();bp=new RegExp("(^|\\.)"+b.map(bm.slice(0).sort(),F).join("\\.(?:.*\\.)?")+"(\\.|$)")}bn=bf[bj];if(!bn){continue}if(!bg){for(bq=0;bq<bn.length;bq++){e=bn[bq];if(bh||bp.test(e.namespace)){b.event.remove(bt,bv,e.handler,bq);bn.splice(bq--,1)}}continue}bi=b.event.special[bj]||{};for(bq=bk||0;bq<bn.length;bq++){e=bn[bq];if(bg.guid===e.guid){if(bh||bp.test(e.namespace)){if(bk==null){bn.splice(bq--,1)}if(bi.remove){bi.remove.call(bt,e)}}if(bk!=null){break}}}if(bn.length===0||bk!=null&&bn.length===1){if(!bi.teardown||bi.teardown.call(bt,bm)===false){b.removeEvent(bt,bj,bs.handle)}bw=null;delete bf[bj]}}if(b.isEmptyObject(bf)){var bu=bs.handle;if(bu){bu.elem=null}delete bs.events;delete bs.handle;if(b.isEmptyObject(bs)){b.removeData(bt,I,true)}}},trigger:function(bf,bk,bh){var bo=bf.type||bf,bj=arguments[3];if(!bj){bf=typeof bf==="object"?bf[b.expando]?bf:b.extend(b.Event(bo),bf):b.Event(bo);if(bo.indexOf("!")>=0){bf.type=bo=bo.slice(0,-1);bf.exclusive=true}if(!bh){bf.stopPropagation();if(b.event.global[bo]){b.each(b.cache,function(){var bt=b.expando,bs=this[bt];if(bs&&bs.events&&bs.events[bo]){b.event.trigger(bf,bk,bs.handle.elem)}})}}if(!bh||bh.nodeType===3||bh.nodeType===8){return I}bf.result=I;bf.target=bh;bk=b.makeArray(bk);bk.unshift(bf)}bf.currentTarget=bh;var bl=b._data(bh,"handle");if(bl){bl.apply(bh,bk)}var bq=bh.parentNode||bh.ownerDocument;try{if(!(bh&&bh.nodeName&&b.noData[bh.nodeName.toLowerCase()])){if(bh["on"+bo]&&bh["on"+bo].apply(bh,bk)===false){bf.result=false;bf.preventDefault()}}}catch(bp){}if(!bf.isPropagationStopped()&&bq){b.event.trigger(bf,bk,bq,true)}else{if(!bf.isDefaultPrevented()){var bg,bm=bf.target,e=bo.replace(aR,""),br=b.nodeName(bm,"a")&&e==="click",bn=b.event.special[e]||{};if((!bn._default||bn._default.call(bh,bf)===false)&&!br&&!(bm&&bm.nodeName&&b.noData[bm.nodeName.toLowerCase()])){try{if(bm[e]){bg=bm["on"+e];if(bg){bm["on"+e]=null}b.event.triggered=bf.type;bm[e]()}}catch(bi){}if(bg){bm["on"+e]=bg}b.event.triggered=I}}}},handle:function(e){var bn,bg,bf,bp,bo,bj=[],bl=b.makeArray(arguments);e=bl[0]=b.event.fix(e||a0.event);e.currentTarget=this;bn=e.type.indexOf(".")<0&&!e.exclusive;if(!bn){bf=e.type.split(".");e.type=bf.shift();bj=bf.slice(0).sort();bp=new RegExp("(^|\\.)"+bj.join("\\.(?:.*\\.)?")+"(\\.|$)")}e.namespace=e.namespace||bj.join(".");bo=b._data(this,"events");bg=(bo||{})[e.type];if(bo&&bg){bg=bg.slice(0);for(var bi=0,bh=bg.length;bi<bh;bi++){var bm=bg[bi];if(bn||bp.test(bm.namespace)){e.handler=bm.handler;e.data=bm.data;e.handleObj=bm;var bk=bm.handler.apply(this,bl);if(bk!==I){e.result=bk;if(bk===false){e.preventDefault();e.stopPropagation()}}if(e.isImmediatePropagationStopped()){break}}}}return e.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(bh){if(bh[b.expando]){return bh}var bf=bh;bh=b.Event(bf);for(var bg=this.props.length,bj;bg;){bj=this.props[--bg];bh[bj]=bf[bj]}if(!bh.target){bh.target=bh.srcElement||am}if(bh.target.nodeType===3){bh.target=bh.target.parentNode}if(!bh.relatedTarget&&bh.fromElement){bh.relatedTarget=bh.fromElement===bh.target?bh.toElement:bh.fromElement}if(bh.pageX==null&&bh.clientX!=null){var bi=am.documentElement,e=am.body;bh.pageX=bh.clientX+(bi&&bi.scrollLeft||e&&e.scrollLeft||0)-(bi&&bi.clientLeft||e&&e.clientLeft||0);bh.pageY=bh.clientY+(bi&&bi.scrollTop||e&&e.scrollTop||0)-(bi&&bi.clientTop||e&&e.clientTop||0)}if(bh.which==null&&(bh.charCode!=null||bh.keyCode!=null)){bh.which=bh.charCode!=null?bh.charCode:bh.keyCode}if(!bh.metaKey&&bh.ctrlKey){bh.metaKey=bh.ctrlKey}if(!bh.which&&bh.button!==I){bh.which=(bh.button&1?1:(bh.button&2?3:(bh.button&4?2:0)))}return bh},guid:100000000,proxy:b.proxy,special:{ready:{setup:b.bindReady,teardown:b.noop},live:{add:function(e){b.event.add(this,o(e.origType,e.selector),b.extend({},e,{handler:ag,guid:e.handler.guid}))},remove:function(e){b.event.remove(this,o(e.origType,e.selector),e)}},beforeunload:{setup:function(bg,bf,e){if(b.isWindow(this)){this.onbeforeunload=e}},teardown:function(bf,e){if(this.onbeforeunload===e){this.onbeforeunload=null}}}}};b.removeEvent=am.removeEventListener?function(bf,e,bg){if(bf.removeEventListener){bf.removeEventListener(e,bg,false)}}:function(bf,e,bg){if(bf.detachEvent){bf.detachEvent("on"+e,bg)}};b.Event=function(e){if(!this.preventDefault){return new b.Event(e)}if(e&&e.type){this.originalEvent=e;this.type=e.type;this.isDefaultPrevented=(e.defaultPrevented||e.returnValue===false||e.getPreventDefault&&e.getPreventDefault())?i:a7}else{this.type=e}this.timeStamp=b.now();this[b.expando]=true};function a7(){return false}function i(){return true}b.Event.prototype={preventDefault:function(){this.isDefaultPrevented=i;var bf=this.originalEvent;if(!bf){return}if(bf.preventDefault){bf.preventDefault()}else{bf.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=i;var bf=this.originalEvent;if(!bf){return}if(bf.stopPropagation){bf.stopPropagation()}bf.cancelBubble=true},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=i;this.stopPropagation()},isDefaultPrevented:a7,isPropagationStopped:a7,isImmediatePropagationStopped:a7};var aa=function(bg){var bf=bg.relatedTarget;try{if(bf&&bf!==am&&!bf.parentNode){return}while(bf&&bf!==this){bf=bf.parentNode}if(bf!==this){bg.type=bg.data;b.event.handle.apply(this,arguments)}}catch(bh){}},aM=function(e){e.type=e.data;b.event.handle.apply(this,arguments)};b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(bf,e){b.event.special[bf]={setup:function(bg){b.event.add(this,e,bg&&bg.selector?aM:aa,bf)},teardown:function(bg){b.event.remove(this,e,bg&&bg.selector?aM:aa)}}});if(!b.support.submitBubbles){b.event.special.submit={setup:function(bf,e){if(this.nodeName&&this.nodeName.toLowerCase()!=="form"){b.event.add(this,"click.specialSubmit",function(bi){var bh=bi.target,bg=bh.type;if((bg==="submit"||bg==="image")&&b(bh).closest("form").length){aP("submit",this,arguments)}});b.event.add(this,"keypress.specialSubmit",function(bi){var bh=bi.target,bg=bh.type;if((bg==="text"||bg==="password")&&b(bh).closest("form").length&&bi.keyCode===13){aP("submit",this,arguments)}})}else{return false}},teardown:function(e){b.event.remove(this,".specialSubmit")}}}if(!b.support.changeBubbles){var a8,k=function(bf){var e=bf.type,bg=bf.value;if(e==="radio"||e==="checkbox"){bg=bf.checked}else{if(e==="select-multiple"){bg=bf.selectedIndex>-1?b.map(bf.options,function(bh){return bh.selected}).join("-"):""}else{if(bf.nodeName.toLowerCase()==="select"){bg=bf.selectedIndex}}}return bg},Y=function Y(bh){var bf=bh.target,bg,bi;if(!a2.test(bf.nodeName)||bf.readOnly){return}bg=b._data(bf,"_change_data");bi=k(bf);if(bh.type!=="focusout"||bf.type!=="radio"){b._data(bf,"_change_data",bi)}if(bg===I||bi===bg){return}if(bg!=null||bi){bh.type="change";bh.liveFired=I;b.event.trigger(bh,arguments[1],bf)}};b.event.special.change={filters:{focusout:Y,beforedeactivate:Y,click:function(bh){var bg=bh.target,bf=bg.type;if(bf==="radio"||bf==="checkbox"||bg.nodeName.toLowerCase()==="select"){Y.call(this,bh)}},keydown:function(bh){var bg=bh.target,bf=bg.type;if((bh.keyCode===13&&bg.nodeName.toLowerCase()!=="textarea")||(bh.keyCode===32&&(bf==="checkbox"||bf==="radio"))||bf==="select-multiple"){Y.call(this,bh)}},beforeactivate:function(bg){var bf=bg.target;b._data(bf,"_change_data",k(bf))}},setup:function(bg,bf){if(this.type==="file"){return false}for(var e in a8){b.event.add(this,e+".specialChange",a8[e])}return a2.test(this.nodeName)},teardown:function(e){b.event.remove(this,".specialChange");return a2.test(this.nodeName)}};a8=b.event.special.change.filters;a8.focus=a8.beforeactivate}function aP(bf,bh,e){var bg=b.extend({},e[0]);bg.type=bf;bg.originalEvent={};bg.liveFired=I;b.event.handle.call(bh,bg);if(bg.isDefaultPrevented()){e[0].preventDefault()}}if(am.addEventListener){b.each({focus:"focusin",blur:"focusout"},function(bh,e){var bf=0;b.event.special[e]={setup:function(){if(bf++===0){am.addEventListener(bh,bg,true)}},teardown:function(){if(--bf===0){am.removeEventListener(bh,bg,true)}}};function bg(bi){var bj=b.event.fix(bi);bj.type=e;bj.originalEvent={};b.event.trigger(bj,null,bj.target);if(bj.isDefaultPrevented()){bi.preventDefault()}}})}b.each(["bind","one"],function(bf,e){b.fn[e]=function(bl,bm,bk){if(typeof bl==="object"){for(var bi in bl){this[e](bi,bm,bl[bi],bk)}return this}if(b.isFunction(bm)||bm===false){bk=bm;bm=I}var bj=e==="one"?b.proxy(bk,function(bn){b(this).unbind(bn,bj);return bk.apply(this,arguments)}):bk;if(bl==="unload"&&e!=="one"){this.one(bl,bm,bk)}else{for(var bh=0,bg=this.length;bh<bg;bh++){b.event.add(this[bh],bl,bj,bm)}}return this}});b.fn.extend({unbind:function(bi,bh){if(typeof bi==="object"&&!bi.preventDefault){for(var bg in bi){this.unbind(bg,bi[bg])}}else{for(var bf=0,e=this.length;bf<e;bf++){b.event.remove(this[bf],bi,bh)}}return this},delegate:function(e,bf,bh,bg){return this.live(bf,bh,bg,e)},undelegate:function(e,bf,bg){if(arguments.length===0){return this.unbind("live")}else{return this.die(bf,null,bg,e)}},trigger:function(e,bf){return this.each(function(){b.event.trigger(e,bf,this)})},triggerHandler:function(e,bg){if(this[0]){var bf=b.Event(e);bf.preventDefault();bf.stopPropagation();b.event.trigger(bf,bg,this[0]);return bf.result}},toggle:function(bg){var e=arguments,bf=1;while(bf<e.length){b.proxy(bg,e[bf++])}return this.click(b.proxy(bg,function(bh){var bi=(b._data(this,"lastToggle"+bg.guid)||0)%bf;b._data(this,"lastToggle"+bg.guid,bi+1);bh.preventDefault();return e[bi].apply(this,arguments)||false}))},hover:function(e,bf){return this.mouseenter(e).mouseleave(bf||e)}});var aJ={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};b.each(["live","die"],function(bf,e){b.fn[e]=function(bp,bm,br,bi){var bq,bn=0,bo,bh,bt,bk=bi||this.selector,bg=bi?this:b(this.context);if(typeof bp==="object"&&!bp.preventDefault){for(var bs in bp){bg[e](bs,bm,bp[bs],bk)}return this}if(b.isFunction(bm)){br=bm;bm=I}bp=(bp||"").split(" ");while((bq=bp[bn++])!=null){bo=aR.exec(bq);bh="";if(bo){bh=bo[0];bq=bq.replace(aR,"")}if(bq==="hover"){bp.push("mouseenter"+bh,"mouseleave"+bh);continue}bt=bq;if(bq==="focus"||bq==="blur"){bp.push(aJ[bq]+bh);bq=bq+bh}else{bq=(aJ[bq]||bq)+bh}if(e==="live"){for(var bl=0,bj=bg.length;bl<bj;bl++){b.event.add(bg[bl],"live."+o(bq,bk),{data:bm,selector:bk,handler:br,origType:bq,origHandler:br,preType:bt})}}else{bg.unbind("live."+o(bq,bk),br)}}return this}});function ag(bp){var bm,bh,bv,bj,e,br,bo,bq,bn,bu,bl,bk,bt,bs=[],bi=[],bf=b._data(this,"events");if(bp.liveFired===this||!bf||!bf.live||bp.target.disabled||bp.button&&bp.type==="click"){return}if(bp.namespace){bk=new RegExp("(^|\\.)"+bp.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")}bp.liveFired=this;var bg=bf.live.slice(0);for(bo=0;bo<bg.length;bo++){e=bg[bo];if(e.origType.replace(aR,"")===bp.type){bi.push(e.selector)}else{bg.splice(bo--,1)}}bj=b(bp.target).closest(bi,bp.currentTarget);for(bq=0,bn=bj.length;bq<bn;bq++){bl=bj[bq];for(bo=0;bo<bg.length;bo++){e=bg[bo];if(bl.selector===e.selector&&(!bk||bk.test(e.namespace))&&!bl.elem.disabled){br=bl.elem;bv=null;if(e.preType==="mouseenter"||e.preType==="mouseleave"){bp.type=e.preType;bv=b(bp.relatedTarget).closest(e.selector)[0]}if(!bv||bv!==br){bs.push({elem:br,handleObj:e,level:bl.level})}}}}for(bq=0,bn=bs.length;bq<bn;bq++){bj=bs[bq];if(bh&&bj.level>bh){break}bp.currentTarget=bj.elem;bp.data=bj.handleObj.data;bp.handleObj=bj.handleObj;bt=bj.handleObj.origHandler.apply(bj.elem,arguments);if(bt===false||bp.isPropagationStopped()){bh=bj.level;if(bt===false){bm=false}if(bp.isImmediatePropagationStopped()){break}}}return bm}function o(bf,e){return(bf&&bf!=="*"?bf+".":"")+e.replace(L,"`").replace(ab,"&")}b.each(("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error").split(" "),function(bf,e){b.fn[e]=function(bh,bg){if(bg==null){bg=bh;bh=null}return arguments.length>0?this.bind(e,bh,bg):this.trigger(e)};if(b.attrFn){b.attrFn[e]=true}});
/*
* Sizzle CSS Selector Engine
* Copyright 2011, The Dojo Foundation
* Released under the MIT, BSD, and GPL Licenses.
* More information: http://sizzlejs.com/
*/
-(function(){var bn=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bo=0,br=Object.prototype.toString,bi=false,bh=true,bp=/\\/g,bv=/\W/;[0,0].sort(function(){bh=false;return 0});var bf=function(bA,e,bD,bE){bD=bD||[];e=e||al;var bG=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bA||typeof bA!=="string"){return bD}var bx,bI,bL,bw,bH,bK,bJ,bC,bz=true,by=bf.isXML(e),bB=[],bF=bA;do{bn.exec("");bx=bn.exec(bF);if(bx){bF=bx[3];bB.push(bx[1]);if(bx[2]){bw=bx[3];break}}}while(bx);if(bB.length>1&&bj.exec(bA)){if(bB.length===2&&bk.relative[bB[0]]){bI=bs(bB[0]+bB[1],e)}else{bI=bk.relative[bB[0]]?[e]:bf(bB.shift(),e);while(bB.length){bA=bB.shift();if(bk.relative[bA]){bA+=bB.shift()}bI=bs(bA,bI)}}}else{if(!bE&&bB.length>1&&e.nodeType===9&&!by&&bk.match.ID.test(bB[0])&&!bk.match.ID.test(bB[bB.length-1])){bH=bf.find(bB.shift(),e,by);e=bH.expr?bf.filter(bH.expr,bH.set)[0]:bH.set[0]}if(e){bH=bE?{expr:bB.pop(),set:bl(bE)}:bf.find(bB.pop(),bB.length===1&&(bB[0]==="~"||bB[0]==="+")&&e.parentNode?e.parentNode:e,by);bI=bH.expr?bf.filter(bH.expr,bH.set):bH.set;if(bB.length>0){bL=bl(bI)}else{bz=false}while(bB.length){bK=bB.pop();bJ=bK;if(!bk.relative[bK]){bK=""}else{bJ=bB.pop()}if(bJ==null){bJ=e}bk.relative[bK](bL,bJ,by)}}else{bL=bB=[]}}if(!bL){bL=bI}if(!bL){bf.error(bK||bA)}if(br.call(bL)==="[object Array]"){if(!bz){bD.push.apply(bD,bL)}else{if(e&&e.nodeType===1){for(bC=0;bL[bC]!=null;bC++){if(bL[bC]&&(bL[bC]===true||bL[bC].nodeType===1&&bf.contains(e,bL[bC]))){bD.push(bI[bC])}}}else{for(bC=0;bL[bC]!=null;bC++){if(bL[bC]&&bL[bC].nodeType===1){bD.push(bI[bC])}}}}}else{bl(bL,bD)}if(bw){bf(bw,bG,bD,bE);bf.uniqueSort(bD)}return bD};bf.uniqueSort=function(bw){if(bq){bi=bh;bw.sort(bq);if(bi){for(var e=1;e<bw.length;e++){if(bw[e]===bw[e-1]){bw.splice(e--,1)}}}}return bw};bf.matches=function(e,bw){return bf(e,null,null,bw)};bf.matchesSelector=function(e,bw){return bf(bw,null,null,[e]).length>0};bf.find=function(bC,e,bD){var bB;if(!bC){return[]}for(var by=0,bx=bk.order.length;by<bx;by++){var bz,bA=bk.order[by];if((bz=bk.leftMatch[bA].exec(bC))){var bw=bz[1];bz.splice(1,1);if(bw.substr(bw.length-1)!=="\\"){bz[1]=(bz[1]||"").replace(bp,"");bB=bk.find[bA](bz,e,bD);if(bB!=null){bC=bC.replace(bk.match[bA],"");break}}}}if(!bB){bB=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bB,expr:bC}};bf.filter=function(bG,bF,bJ,bz){var bB,e,bx=bG,bL=[],bD=bF,bC=bF&&bF[0]&&bf.isXML(bF[0]);while(bG&&bF.length){for(var bE in bk.filter){if((bB=bk.leftMatch[bE].exec(bG))!=null&&bB[2]){var bK,bI,bw=bk.filter[bE],by=bB[1];e=false;bB.splice(1,1);if(by.substr(by.length-1)==="\\"){continue}if(bD===bL){bL=[]}if(bk.preFilter[bE]){bB=bk.preFilter[bE](bB,bD,bJ,bL,bz,bC);if(!bB){e=bK=true}else{if(bB===true){continue}}}if(bB){for(var bA=0;(bI=bD[bA])!=null;bA++){if(bI){bK=bw(bI,bB,bA,bD);var bH=bz^!!bK;if(bJ&&bK!=null){if(bH){e=true}else{bD[bA]=false}}else{if(bH){bL.push(bI);e=true}}}}}if(bK!==H){if(!bJ){bD=bL}bG=bG.replace(bk.match[bE],"");if(!e){return[]}break}}}if(bG===bx){if(e==null){bf.error(bG)}else{break}}bx=bG}return bD};bf.error=function(e){throw"Syntax error, unrecognized expression: "+e};var bk=bf.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bB,bw){var by=typeof bw==="string",bA=by&&!bv.test(bw),bC=by&&!bA;if(bA){bw=bw.toLowerCase()}for(var bx=0,e=bB.length,bz;bx<e;bx++){if((bz=bB[bx])){while((bz=bz.previousSibling)&&bz.nodeType!==1){}bB[bx]=bC||bz&&bz.nodeName.toLowerCase()===bw?bz||false:bz===bw}}if(bC){bf.filter(bw,bB,true)}},">":function(bB,bw){var bA,bz=typeof bw==="string",bx=0,e=bB.length;if(bz&&!bv.test(bw)){bw=bw.toLowerCase();for(;bx<e;bx++){bA=bB[bx];if(bA){var by=bA.parentNode;bB[bx]=by.nodeName.toLowerCase()===bw?by:false}}}else{for(;bx<e;bx++){bA=bB[bx];if(bA){bB[bx]=bz?bA.parentNode:bA.parentNode===bw}}if(bz){bf.filter(bw,bB,true)}}},"":function(by,bw,bA){var bz,bx=bo++,e=bt;if(typeof bw==="string"&&!bv.test(bw)){bw=bw.toLowerCase();bz=bw;e=bd}e("parentNode",bw,bx,by,bz,bA)},"~":function(by,bw,bA){var bz,bx=bo++,e=bt;if(typeof bw==="string"&&!bv.test(bw)){bw=bw.toLowerCase();bz=bw;e=bd}e("previousSibling",bw,bx,by,bz,bA)}},find:{ID:function(bw,bx,by){if(typeof bx.getElementById!=="undefined"&&!by){var e=bx.getElementById(bw[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bx,bA){if(typeof bA.getElementsByName!=="undefined"){var bw=[],bz=bA.getElementsByName(bx[1]);for(var by=0,e=bz.length;by<e;by++){if(bz[by].getAttribute("name")===bx[1]){bw.push(bz[by])}}return bw.length===0?null:bw}},TAG:function(e,bw){if(typeof bw.getElementsByTagName!=="undefined"){return bw.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(by,bw,bx,e,bB,bC){by=" "+by[1].replace(bp,"")+" ";if(bC){return by}for(var bz=0,bA;(bA=bw[bz])!=null;bz++){if(bA){if(bB^(bA.className&&(" "+bA.className+" ").replace(/[\t\n\r]/g," ").indexOf(by)>=0)){if(!bx){e.push(bA)}}else{if(bx){bw[bz]=false}}}}return false},ID:function(e){return e[1].replace(bp,"")},TAG:function(bw,e){return bw[1].replace(bp,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){bf.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var bw=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(bw[1]+(bw[2]||1))-0;e[3]=bw[3]-0}else{if(e[2]){bf.error(e[0])}}e[0]=bo++;return e},ATTR:function(bz,bw,bx,e,bA,bB){var by=bz[1]=bz[1].replace(bp,"");if(!bB&&bk.attrMap[by]){bz[1]=bk.attrMap[by]}bz[4]=(bz[4]||bz[5]||"").replace(bp,"");if(bz[2]==="~="){bz[4]=" "+bz[4]+" "}return bz},PSEUDO:function(bz,bw,bx,e,bA){if(bz[1]==="not"){if((bn.exec(bz[3])||"").length>1||/^\w/.test(bz[3])){bz[3]=bf(bz[3],null,null,bw)}else{var by=bf.filter(bz[3],bw,bx,true^bA);if(!bx){e.push.apply(e,by)}return false}}else{if(bk.match.POS.test(bz[0])||bk.match.CHILD.test(bz[0])){return true}}return bz},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bx,bw,e){return !!bf(e[3],bx).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(e){return"text"===e.getAttribute("type")},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(bw,e){return e===0},last:function(bx,bw,e,by){return bw===by.length-1},even:function(bw,e){return e%2===0},odd:function(bw,e){return e%2===1},lt:function(bx,bw,e){return bw<e[3]-0},gt:function(bx,bw,e){return bw>e[3]-0},nth:function(bx,bw,e){return e[3]-0===bw},eq:function(bx,bw,e){return e[3]-0===bw}},filter:{PSEUDO:function(bx,bC,bB,bD){var e=bC[1],bw=bk.filters[e];if(bw){return bw(bx,bB,bC,bD)}else{if(e==="contains"){return(bx.textContent||bx.innerText||bf.getText([bx])||"").indexOf(bC[3])>=0}else{if(e==="not"){var by=bC[3];for(var bA=0,bz=by.length;bA<bz;bA++){if(by[bA]===bx){return false}}return true}else{bf.error(e)}}}},CHILD:function(e,by){var bB=by[1],bw=e;switch(bB){case"only":case"first":while((bw=bw.previousSibling)){if(bw.nodeType===1){return false}}if(bB==="first"){return true}bw=e;case"last":while((bw=bw.nextSibling)){if(bw.nodeType===1){return false}}return true;case"nth":var bx=by[2],bE=by[3];if(bx===1&&bE===0){return true}var bA=by[0],bD=e.parentNode;if(bD&&(bD.sizcache!==bA||!e.nodeIndex)){var bz=0;for(bw=bD.firstChild;bw;bw=bw.nextSibling){if(bw.nodeType===1){bw.nodeIndex=++bz}}bD.sizcache=bA}var bC=e.nodeIndex-bE;if(bx===0){return bC===0}else{return(bC%bx===0&&bC/bx>=0)}}},ID:function(bw,e){return bw.nodeType===1&&bw.getAttribute("id")===e},TAG:function(bw,e){return(e==="*"&&bw.nodeType===1)||bw.nodeName.toLowerCase()===e},CLASS:function(bw,e){return(" "+(bw.className||bw.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bA,by){var bx=by[1],e=bk.attrHandle[bx]?bk.attrHandle[bx](bA):bA[bx]!=null?bA[bx]:bA.getAttribute(bx),bB=e+"",bz=by[2],bw=by[4];return e==null?bz==="!=":bz==="="?bB===bw:bz==="*="?bB.indexOf(bw)>=0:bz==="~="?(" "+bB+" ").indexOf(bw)>=0:!bw?bB&&e!==false:bz==="!="?bB!==bw:bz==="^="?bB.indexOf(bw)===0:bz==="$="?bB.substr(bB.length-bw.length)===bw:bz==="|="?bB===bw||bB.substr(0,bw.length+1)===bw+"-":false},POS:function(bz,bw,bx,bA){var e=bw[2],by=bk.setFilters[e];if(by){return by(bz,bx,bw,bA)}}}};var bj=bk.match.POS,be=function(bw,e){return"\\"+(e-0+1)};for(var bg in bk.match){bk.match[bg]=new RegExp(bk.match[bg].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bk.leftMatch[bg]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bk.match[bg].source.replace(/\\(\d+)/g,be))}var bl=function(bw,e){bw=Array.prototype.slice.call(bw,0);if(e){e.push.apply(e,bw);return e}return bw};try{Array.prototype.slice.call(al.documentElement.childNodes,0)[0].nodeType}catch(bu){bl=function(bz,by){var bx=0,bw=by||[];if(br.call(bz)==="[object Array]"){Array.prototype.push.apply(bw,bz)}else{if(typeof bz.length==="number"){for(var e=bz.length;bx<e;bx++){bw.push(bz[bx])}}else{for(;bz[bx];bx++){bw.push(bz[bx])}}}return bw}}var bq,bm;if(al.documentElement.compareDocumentPosition){bq=function(bw,e){if(bw===e){bi=true;return 0}if(!bw.compareDocumentPosition||!e.compareDocumentPosition){return bw.compareDocumentPosition?-1:1}return bw.compareDocumentPosition(e)&4?-1:1}}else{bq=function(bD,bC){var bA,bw,bx=[],e=[],bz=bD.parentNode,bB=bC.parentNode,bE=bz;if(bD===bC){bi=true;return 0}else{if(bz===bB){return bm(bD,bC)}else{if(!bz){return -1}else{if(!bB){return 1}}}}while(bE){bx.unshift(bE);bE=bE.parentNode}bE=bB;while(bE){e.unshift(bE);bE=bE.parentNode}bA=bx.length;bw=e.length;for(var by=0;by<bA&&by<bw;by++){if(bx[by]!==e[by]){return bm(bx[by],e[by])}}return by===bA?bm(bD,e[by],-1):bm(bx[by],bC,1)};bm=function(bw,e,bx){if(bw===e){return bx}var by=bw.nextSibling;while(by){if(by===e){return -1}by=by.nextSibling}return 1}}bf.getText=function(e){var bw="",by;for(var bx=0;e[bx];bx++){by=e[bx];if(by.nodeType===3||by.nodeType===4){bw+=by.nodeValue}else{if(by.nodeType!==8){bw+=bf.getText(by.childNodes)}}}return bw};(function(){var bw=al.createElement("div"),bx="script"+(new Date()).getTime(),e=al.documentElement;bw.innerHTML="<a name='"+bx+"'/>";e.insertBefore(bw,e.firstChild);if(al.getElementById(bx)){bk.find.ID=function(bz,bA,bB){if(typeof bA.getElementById!=="undefined"&&!bB){var by=bA.getElementById(bz[1]);return by?by.id===bz[1]||typeof by.getAttributeNode!=="undefined"&&by.getAttributeNode("id").nodeValue===bz[1]?[by]:H:[]}};bk.filter.ID=function(bA,by){var bz=typeof bA.getAttributeNode!=="undefined"&&bA.getAttributeNode("id");return bA.nodeType===1&&bz&&bz.nodeValue===by}}e.removeChild(bw);e=bw=null})();(function(){var e=al.createElement("div");e.appendChild(al.createComment(""));if(e.getElementsByTagName("*").length>0){bk.find.TAG=function(bw,bA){var bz=bA.getElementsByTagName(bw[1]);if(bw[1]==="*"){var by=[];for(var bx=0;bz[bx];bx++){if(bz[bx].nodeType===1){by.push(bz[bx])}}bz=by}return bz}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bk.attrHandle.href=function(bw){return bw.getAttribute("href",2)}}e=null})();if(al.querySelectorAll){(function(){var e=bf,by=al.createElement("div"),bx="__sizzle__";by.innerHTML="<p class='TEST'></p>";if(by.querySelectorAll&&by.querySelectorAll(".TEST").length===0){return}bf=function(bJ,bA,bE,bI){bA=bA||al;if(!bI&&!bf.isXML(bA)){var bH=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(bJ);if(bH&&(bA.nodeType===1||bA.nodeType===9)){if(bH[1]){return bl(bA.getElementsByTagName(bJ),bE)}else{if(bH[2]&&bk.find.CLASS&&bA.getElementsByClassName){return bl(bA.getElementsByClassName(bH[2]),bE)}}}if(bA.nodeType===9){if(bJ==="body"&&bA.body){return bl([bA.body],bE)}else{if(bH&&bH[3]){var bD=bA.getElementById(bH[3]);if(bD&&bD.parentNode){if(bD.id===bH[3]){return bl([bD],bE)}}else{return bl([],bE)}}}try{return bl(bA.querySelectorAll(bJ),bE)}catch(bF){}}else{if(bA.nodeType===1&&bA.nodeName.toLowerCase()!=="object"){var bB=bA,bC=bA.getAttribute("id"),bz=bC||bx,bL=bA.parentNode,bK=/^\s*[+~]/.test(bJ);if(!bC){bA.setAttribute("id",bz)}else{bz=bz.replace(/'/g,"\\$&")}if(bK&&bL){bA=bA.parentNode}try{if(!bK||bL){return bl(bA.querySelectorAll("[id='"+bz+"'] "+bJ),bE)}}catch(bG){}finally{if(!bC){bB.removeAttribute("id")}}}}}return e(bJ,bA,bE,bI)};for(var bw in e){bf[bw]=e[bw]}by=null})()}(function(){var e=al.documentElement,bx=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector,bw=false;try{bx.call(al.documentElement,"[test!='']:sizzle")}catch(by){bw=true}if(bx){bf.matchesSelector=function(bz,bB){bB=bB.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!bf.isXML(bz)){try{if(bw||!bk.match.PSEUDO.test(bB)&&!/!=/.test(bB)){return bx.call(bz,bB)}}catch(bA){}}return bf(bB,null,null,[bz]).length>0}}})();(function(){var e=al.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bk.order.splice(1,0,"CLASS");bk.find.CLASS=function(bw,bx,by){if(typeof bx.getElementsByClassName!=="undefined"&&!by){return bx.getElementsByClassName(bw[1])}};e=null})();function bd(bw,bB,bA,bE,bC,bD){for(var by=0,bx=bE.length;by<bx;by++){var e=bE[by];if(e){var bz=false;e=e[bw];while(e){if(e.sizcache===bA){bz=bE[e.sizset];break}if(e.nodeType===1&&!bD){e.sizcache=bA;e.sizset=by}if(e.nodeName.toLowerCase()===bB){bz=e;break}e=e[bw]}bE[by]=bz}}}function bt(bw,bB,bA,bE,bC,bD){for(var by=0,bx=bE.length;by<bx;by++){var e=bE[by];if(e){var bz=false;e=e[bw];while(e){if(e.sizcache===bA){bz=bE[e.sizset];break}if(e.nodeType===1){if(!bD){e.sizcache=bA;e.sizset=by}if(typeof bB!=="string"){if(e===bB){bz=true;break}}else{if(bf.filter(bB,[e]).length>0){bz=e;break}}}e=e[bw]}bE[by]=bz}}}if(al.documentElement.contains){bf.contains=function(bw,e){return bw!==e&&(bw.contains?bw.contains(e):true)}}else{if(al.documentElement.compareDocumentPosition){bf.contains=function(bw,e){return !!(bw.compareDocumentPosition(e)&16)}}else{bf.contains=function(){return false}}}bf.isXML=function(e){var bw=(e?e.ownerDocument||e:0).documentElement;return bw?bw.nodeName!=="HTML":false};var bs=function(e,bC){var bA,by=[],bz="",bx=bC.nodeType?[bC]:bC;while((bA=bk.match.PSEUDO.exec(e))){bz+=bA[0];e=e.replace(bk.match.PSEUDO,"")}e=bk.relative[e]?e+"*":e;for(var bB=0,bw=bx.length;bB<bw;bB++){bf(e,bx[bB],by)}return bf.filter(bz,by)};a.find=bf;a.expr=bf.selectors;a.expr[":"]=a.expr.filters;a.unique=bf.uniqueSort;a.text=bf.getText;a.isXMLDoc=bf.isXML;a.contains=bf.contains})();var W=/Until$/,ai=/^(?:parents|prevUntil|prevAll)/,aW=/,/,a9=/^.[^:#\[\.,]*$/,M=Array.prototype.slice,F=a.expr.match.POS,ao={children:true,contents:true,next:true,prev:true};a.fn.extend({find:function(e){var be=this.pushStack("","find",e),bh=0;for(var bf=0,bd=this.length;bf<bd;bf++){bh=be.length;a.find(e,this[bf],be);if(bf>0){for(var bi=bh;bi<be.length;bi++){for(var bg=0;bg<bh;bg++){if(be[bg]===be[bi]){be.splice(bi--,1);break}}}}}return be},has:function(bd){var e=a(bd);return this.filter(function(){for(var bf=0,be=e.length;bf<be;bf++){if(a.contains(this,e[bf])){return true}}})},not:function(e){return this.pushStack(av(this,e,false),"not",e)},filter:function(e){return this.pushStack(av(this,e,true),"filter",e)},is:function(e){return !!e&&a.filter(e,this).length>0},closest:function(bm,bd){var bj=[],bg,be,bl=this[0];if(a.isArray(bm)){var bi,bf,bh={},e=1;if(bl&&bm.length){for(bg=0,be=bm.length;bg<be;bg++){bf=bm[bg];if(!bh[bf]){bh[bf]=a.expr.match.POS.test(bf)?a(bf,bd||this.context):bf}}while(bl&&bl.ownerDocument&&bl!==bd){for(bf in bh){bi=bh[bf];if(bi.jquery?bi.index(bl)>-1:a(bl).is(bi)){bj.push({selector:bf,elem:bl,level:e})}}bl=bl.parentNode;e++}}return bj}var bk=F.test(bm)?a(bm,bd||this.context):null;for(bg=0,be=this.length;bg<be;bg++){bl=this[bg];while(bl){if(bk?bk.index(bl)>-1:a.find.matchesSelector(bl,bm)){bj.push(bl);break}else{bl=bl.parentNode;if(!bl||!bl.ownerDocument||bl===bd){break}}}}bj=bj.length>1?a.unique(bj):bj;return this.pushStack(bj,"closest",bm)},index:function(e){if(!e||typeof e==="string"){return a.inArray(this[0],e?a(e):this.parent().children())}return a.inArray(e.jquery?e[0]:e,this)},add:function(e,bd){var bf=typeof e==="string"?a(e,bd):a.makeArray(e),be=a.merge(this.get(),bf);return this.pushStack(B(bf[0])||B(be[0])?be:a.unique(be))},andSelf:function(){return this.add(this.prevObject)}});function B(e){return !e||!e.parentNode||e.parentNode.nodeType===11}a.each({parent:function(bd){var e=bd.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return a.dir(e,"parentNode")},parentsUntil:function(bd,e,be){return a.dir(bd,"parentNode",be)},next:function(e){return a.nth(e,2,"nextSibling")},prev:function(e){return a.nth(e,2,"previousSibling")},nextAll:function(e){return a.dir(e,"nextSibling")},prevAll:function(e){return a.dir(e,"previousSibling")},nextUntil:function(bd,e,be){return a.dir(bd,"nextSibling",be)},prevUntil:function(bd,e,be){return a.dir(bd,"previousSibling",be)},siblings:function(e){return a.sibling(e.parentNode.firstChild,e)},children:function(e){return a.sibling(e.firstChild)},contents:function(e){return a.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:a.makeArray(e.childNodes)}},function(e,bd){a.fn[e]=function(bh,be){var bg=a.map(this,bd,bh),bf=M.call(arguments);if(!W.test(e)){be=bh}if(be&&typeof be==="string"){bg=a.filter(be,bg)}bg=this.length>1&&!ao[e]?a.unique(bg):bg;if((this.length>1||aW.test(be))&&ai.test(e)){bg=bg.reverse()}return this.pushStack(bg,e,bf.join(","))}});a.extend({filter:function(be,e,bd){if(bd){be=":not("+be+")"}return e.length===1?a.find.matchesSelector(e[0],be)?[e[0]]:[]:a.find.matches(be,e)},dir:function(be,bd,bg){var e=[],bf=be[bd];while(bf&&bf.nodeType!==9&&(bg===H||bf.nodeType!==1||!a(bf).is(bg))){if(bf.nodeType===1){e.push(bf)}bf=bf[bd]}return e},nth:function(bg,e,be,bf){e=e||1;var bd=0;for(;bg;bg=bg[be]){if(bg.nodeType===1&&++bd===e){break}}return bg},sibling:function(be,bd){var e=[];for(;be;be=be.nextSibling){if(be.nodeType===1&&be!==bd){e.push(be)}}return e}});function av(bf,be,e){if(a.isFunction(be)){return a.grep(bf,function(bh,bg){var bi=!!be.call(bh,bg,bh);return bi===e})}else{if(be.nodeType){return a.grep(bf,function(bh,bg){return(bh===be)===e})}else{if(typeof be==="string"){var bd=a.grep(bf,function(bg){return bg.nodeType===1});if(a9.test(be)){return a.filter(be,bd,!e)}else{be=a.filter(be,bd)}}}}return a.grep(bf,function(bh,bg){return(a.inArray(bh,be)>=0)===e})}var ab=/ jQuery\d+="(?:\d+|null)"/g,aj=/^\s+/,O=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,c=/<([\w:]+)/,v=/<tbody/i,T=/<|&#?\w+;/,L=/<(?:script|object|embed|option|style)/i,m=/checked\s*(?:[^=]|=\s*.checked.)/i,an={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};an.optgroup=an.option;an.tbody=an.tfoot=an.colgroup=an.caption=an.thead;an.th=an.td;if(!a.support.htmlSerialize){an._default=[1,"div<div>","</div>"]}a.fn.extend({text:function(e){if(a.isFunction(e)){return this.each(function(be){var bd=a(this);bd.text(e.call(this,be,bd.text()))})}if(typeof e!=="object"&&e!==H){return this.empty().append((this[0]&&this[0].ownerDocument||al).createTextNode(e))}return a.text(this)},wrapAll:function(e){if(a.isFunction(e)){return this.each(function(be){a(this).wrapAll(e.call(this,be))})}if(this[0]){var bd=a(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bd.insertBefore(this[0])}bd.map(function(){var be=this;while(be.firstChild&&be.firstChild.nodeType===1){be=be.firstChild}return be}).append(this)}return this},wrapInner:function(e){if(a.isFunction(e)){return this.each(function(bd){a(this).wrapInner(e.call(this,bd))})}return this.each(function(){var bd=a(this),be=bd.contents();if(be.length){be.wrapAll(e)}else{bd.append(e)}})},wrap:function(e){return this.each(function(){a(this).wrapAll(e)})},unwrap:function(){return this.parent().each(function(){if(!a.nodeName(this,"body")){a(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bd){this.parentNode.insertBefore(bd,this)})}else{if(arguments.length){var e=a(arguments[0]);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bd){this.parentNode.insertBefore(bd,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,a(arguments[0]).toArray());return e}}},remove:function(e,bf){for(var bd=0,be;(be=this[bd])!=null;bd++){if(!e||a.filter(e,[be]).length){if(!bf&&be.nodeType===1){a.cleanData(be.getElementsByTagName("*"));a.cleanData([be])}if(be.parentNode){be.parentNode.removeChild(be)}}}return this},empty:function(){for(var e=0,bd;(bd=this[e])!=null;e++){if(bd.nodeType===1){a.cleanData(bd.getElementsByTagName("*"))}while(bd.firstChild){bd.removeChild(bd.firstChild)}}return this},clone:function(bd,e){bd=bd==null?false:bd;e=e==null?bd:e;return this.map(function(){return a.clone(this,bd,e)})},html:function(bf){if(bf===H){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ab,""):null}else{if(typeof bf==="string"&&!L.test(bf)&&(a.support.leadingWhitespace||!aj.test(bf))&&!an[(c.exec(bf)||["",""])[1].toLowerCase()]){bf=bf.replace(O,"<$1></$2>");try{for(var be=0,bd=this.length;be<bd;be++){if(this[be].nodeType===1){a.cleanData(this[be].getElementsByTagName("*"));this[be].innerHTML=bf}}}catch(bg){this.empty().append(bf)}}else{if(a.isFunction(bf)){this.each(function(bh){var e=a(this);e.html(bf.call(this,bh,e.html()))})}else{this.empty().append(bf)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(a.isFunction(e)){return this.each(function(bf){var be=a(this),bd=be.html();be.replaceWith(e.call(this,bf,bd))})}if(typeof e!=="string"){e=a(e).detach()}return this.each(function(){var be=this.nextSibling,bd=this.parentNode;a(this).remove();if(be){a(be).before(e)}else{a(bd).append(e)}})}else{return this.pushStack(a(a.isFunction(e)?e():e),"replaceWith",e)}},detach:function(e){return this.remove(e,true)},domManip:function(bj,bn,bm){var bf,bg,bi,bl,bk=bj[0],bd=[];if(!a.support.checkClone&&arguments.length===3&&typeof bk==="string"&&m.test(bk)){return this.each(function(){a(this).domManip(bj,bn,bm,true)})}if(a.isFunction(bk)){return this.each(function(bp){var bo=a(this);bj[0]=bk.call(this,bp,bn?bo.html():H);bo.domManip(bj,bn,bm)})}if(this[0]){bl=bk&&bk.parentNode;if(a.support.parentNode&&bl&&bl.nodeType===11&&bl.childNodes.length===this.length){bf={fragment:bl}}else{bf=a.buildFragment(bj,this,bd)}bi=bf.fragment;if(bi.childNodes.length===1){bg=bi=bi.firstChild}else{bg=bi.firstChild}if(bg){bn=bn&&a.nodeName(bg,"tr");for(var be=0,e=this.length,bh=e-1;be<e;be++){bm.call(bn?aX(this[be],bg):this[be],bf.cacheable||(e>1&&be<bh)?a.clone(bi,true,true):bi)}}if(bd.length){a.each(bd,a8)}}return this}});function aX(e,bd){return a.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function s(e,bj){if(bj.nodeType!==1||!a.hasData(e)){return}var bi=a.expando,bf=a.data(e),bg=a.data(bj,bf);if((bf=bf[bi])){var bk=bf.events;bg=bg[bi]=a.extend({},bf);if(bk){delete bg.handle;bg.events={};for(var bh in bk){for(var be=0,bd=bk[bh].length;be<bd;be++){a.event.add(bj,bh+(bk[bh][be].namespace?".":"")+bk[bh][be].namespace,bk[bh][be],bk[bh][be].data)}}}}}function ac(bd,e){if(e.nodeType!==1){return}var be=e.nodeName.toLowerCase();e.clearAttributes();e.mergeAttributes(bd);if(be==="object"){e.outerHTML=bd.outerHTML}else{if(be==="input"&&(bd.type==="checkbox"||bd.type==="radio")){if(bd.checked){e.defaultChecked=e.checked=bd.checked}if(e.value!==bd.value){e.value=bd.value}}else{if(be==="option"){e.selected=bd.defaultSelected}else{if(be==="input"||be==="textarea"){e.defaultValue=bd.defaultValue}}}}e.removeAttribute(a.expando)}a.buildFragment=function(bh,bf,bd){var bg,e,be,bi=(bf&&bf[0]?bf[0].ownerDocument||bf[0]:al);if(bh.length===1&&typeof bh[0]==="string"&&bh[0].length<512&&bi===al&&bh[0].charAt(0)==="<"&&!L.test(bh[0])&&(a.support.checkClone||!m.test(bh[0]))){e=true;be=a.fragments[bh[0]];if(be){if(be!==1){bg=be}}}if(!bg){bg=bi.createDocumentFragment();a.clean(bh,bi,bg,bd)}if(e){a.fragments[bh[0]]=be?bg:1}return{fragment:bg,cacheable:e}};a.fragments={};a.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bd){a.fn[e]=function(be){var bh=[],bk=a(be),bj=this.length===1&&this[0].parentNode;if(bj&&bj.nodeType===11&&bj.childNodes.length===1&&bk.length===1){bk[bd](this[0]);return this}else{for(var bi=0,bf=bk.length;bi<bf;bi++){var bg=(bi>0?this.clone(true):this).get();a(bk[bi])[bd](bg);bh=bh.concat(bg)}return this.pushStack(bh,e,bk.selector)}}});function a1(e){if("getElementsByTagName" in e){return e.getElementsByTagName("*")}else{if("querySelectorAll" in e){return e.querySelectorAll("*")}else{return[]}}}a.extend({clone:function(bg,bi,be){var bh=bg.cloneNode(true),e,bd,bf;if((!a.support.noCloneEvent||!a.support.noCloneChecked)&&(bg.nodeType===1||bg.nodeType===11)&&!a.isXMLDoc(bg)){ac(bg,bh);e=a1(bg);bd=a1(bh);for(bf=0;e[bf];++bf){ac(e[bf],bd[bf])}}if(bi){s(bg,bh);if(be){e=a1(bg);bd=a1(bh);for(bf=0;e[bf];++bf){s(e[bf],bd[bf])}}}return bh},clean:function(be,bg,bn,bi){bg=bg||al;if(typeof bg.createElement==="undefined"){bg=bg.ownerDocument||bg[0]&&bg[0].ownerDocument||al}var bo=[];for(var bm=0,bh;(bh=be[bm])!=null;bm++){if(typeof bh==="number"){bh+=""}if(!bh){continue}if(typeof bh==="string"&&!T.test(bh)){bh=bg.createTextNode(bh)}else{if(typeof bh==="string"){bh=bh.replace(O,"<$1></$2>");var bp=(c.exec(bh)||["",""])[1].toLowerCase(),bf=an[bp]||an._default,bl=bf[0],bd=bg.createElement("div");bd.innerHTML=bf[1]+bh+bf[2];while(bl--){bd=bd.lastChild}if(!a.support.tbody){var e=v.test(bh),bk=bp==="table"&&!e?bd.firstChild&&bd.firstChild.childNodes:bf[1]==="<table>"&&!e?bd.childNodes:[];for(var bj=bk.length-1;bj>=0;--bj){if(a.nodeName(bk[bj],"tbody")&&!bk[bj].childNodes.length){bk[bj].parentNode.removeChild(bk[bj])}}}if(!a.support.leadingWhitespace&&aj.test(bh)){bd.insertBefore(bg.createTextNode(aj.exec(bh)[0]),bd.firstChild)}bh=bd.childNodes}}if(bh.nodeType){bo.push(bh)}else{bo=a.merge(bo,bh)}}if(bn){for(bm=0;bo[bm];bm++){if(bi&&a.nodeName(bo[bm],"script")&&(!bo[bm].type||bo[bm].type.toLowerCase()==="text/javascript")){bi.push(bo[bm].parentNode?bo[bm].parentNode.removeChild(bo[bm]):bo[bm])}else{if(bo[bm].nodeType===1){bo.splice.apply(bo,[bm+1,0].concat(a.makeArray(bo[bm].getElementsByTagName("script"))))}bn.appendChild(bo[bm])}}}return bo},cleanData:function(bd){var bg,be,e=a.cache,bl=a.expando,bj=a.event.special,bi=a.support.deleteExpando;for(var bh=0,bf;(bf=bd[bh])!=null;bh++){if(bf.nodeName&&a.noData[bf.nodeName.toLowerCase()]){continue}be=bf[a.expando];if(be){bg=e[be]&&e[be][bl];if(bg&&bg.events){for(var bk in bg.events){if(bj[bk]){a.event.remove(bf,bk)}else{a.removeEvent(bf,bk,bg.handle)}}if(bg.handle){bg.handle.elem=null}}if(bi){delete bf[a.expando]}else{if(bf.removeAttribute){bf.removeAttribute(a.expando)}}delete e[be]}}}});function a8(e,bd){if(bd.src){a.ajax({url:bd.src,async:false,dataType:"script"})}else{a.globalEval(bd.text||bd.textContent||bd.innerHTML||"")}if(bd.parentNode){bd.parentNode.removeChild(bd)}}var ae=/alpha\([^)]*\)/i,ak=/opacity=([^)]*)/,aM=/-([a-z])/ig,y=/([A-Z])/g,aZ=/^-?\d+(?:px)?$/i,a7=/^-?\d/,aV={position:"absolute",visibility:"hidden",display:"block"},ag=["Left","Right"],aR=["Top","Bottom"],U,ay,aL,l=function(e,bd){return bd.toUpperCase()};a.fn.css=function(e,bd){if(arguments.length===2&&bd===H){return this}return a.access(this,e,bd,true,function(bf,be,bg){return bg!==H?a.style(bf,be,bg):a.css(bf,be)})};a.extend({cssHooks:{opacity:{get:function(be,bd){if(bd){var e=U(be,"opacity","opacity");return e===""?"1":e}else{return be.style.opacity}}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":a.support.cssFloat?"cssFloat":"styleFloat"},style:function(bf,be,bk,bg){if(!bf||bf.nodeType===3||bf.nodeType===8||!bf.style){return}var bj,bh=a.camelCase(be),bd=bf.style,bl=a.cssHooks[bh];be=a.cssProps[bh]||bh;if(bk!==H){if(typeof bk==="number"&&isNaN(bk)||bk==null){return}if(typeof bk==="number"&&!a.cssNumber[bh]){bk+="px"}if(!bl||!("set" in bl)||(bk=bl.set(bf,bk))!==H){try{bd[be]=bk}catch(bi){}}}else{if(bl&&"get" in bl&&(bj=bl.get(bf,false,bg))!==H){return bj}return bd[be]}},css:function(bh,bg,bd){var bf,be=a.camelCase(bg),e=a.cssHooks[be];bg=a.cssProps[be]||be;if(e&&"get" in e&&(bf=e.get(bh,true,bd))!==H){return bf}else{if(U){return U(bh,bg,be)}}},swap:function(bf,be,bg){var e={};for(var bd in be){e[bd]=bf.style[bd];bf.style[bd]=be[bd]}bg.call(bf);for(bd in be){bf.style[bd]=e[bd]}},camelCase:function(e){return e.replace(aM,l)}});a.curCSS=a.css;a.each(["height","width"],function(bd,e){a.cssHooks[e]={get:function(bg,bf,be){var bh;if(bf){if(bg.offsetWidth!==0){bh=o(bg,e,be)}else{a.swap(bg,aV,function(){bh=o(bg,e,be)})}if(bh<=0){bh=U(bg,e,e);if(bh==="0px"&&aL){bh=aL(bg,e,e)}if(bh!=null){return bh===""||bh==="auto"?"0px":bh}}if(bh<0||bh==null){bh=bg.style[e];return bh===""||bh==="auto"?"0px":bh}return typeof bh==="string"?bh:bh+"px"}},set:function(be,bf){if(aZ.test(bf)){bf=parseFloat(bf);if(bf>=0){return bf+"px"}}else{return bf}}}});if(!a.support.opacity){a.cssHooks.opacity={get:function(bd,e){return ak.test((e&&bd.currentStyle?bd.currentStyle.filter:bd.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(bf,bg){var be=bf.style;be.zoom=1;var e=a.isNaN(bg)?"":"alpha(opacity="+bg*100+")",bd=be.filter||"";be.filter=ae.test(bd)?bd.replace(ae,e):be.filter+" "+e}}}if(al.defaultView&&al.defaultView.getComputedStyle){ay=function(bh,e,bf){var be,bg,bd;bf=bf.replace(y,"-$1").toLowerCase();if(!(bg=bh.ownerDocument.defaultView)){return H}if((bd=bg.getComputedStyle(bh,null))){be=bd.getPropertyValue(bf);if(be===""&&!a.contains(bh.ownerDocument.documentElement,bh)){be=a.style(bh,bf)}}return be}}if(al.documentElement.currentStyle){aL=function(bg,be){var bh,bd=bg.currentStyle&&bg.currentStyle[be],e=bg.runtimeStyle&&bg.runtimeStyle[be],bf=bg.style;if(!aZ.test(bd)&&a7.test(bd)){bh=bf.left;if(e){bg.runtimeStyle.left=bg.currentStyle.left}bf.left=be==="fontSize"?"1em":(bd||0);bd=bf.pixelLeft+"px";bf.left=bh;if(e){bg.runtimeStyle.left=e}}return bd===""?"auto":bd}}U=ay||aL;function o(be,bd,e){var bg=bd==="width"?ag:aR,bf=bd==="width"?be.offsetWidth:be.offsetHeight;if(e==="border"){return bf}a.each(bg,function(){if(!e){bf-=parseFloat(a.css(be,"padding"+this))||0}if(e==="margin"){bf+=parseFloat(a.css(be,"margin"+this))||0}else{bf-=parseFloat(a.css(be,"border"+this+"Width"))||0}});return bf}if(a.expr&&a.expr.filters){a.expr.filters.hidden=function(be){var bd=be.offsetWidth,e=be.offsetHeight;return(bd===0&&e===0)||(!a.support.reliableHiddenOffsets&&(be.style.display||a.css(be,"display"))==="none")};a.expr.filters.visible=function(e){return !a.expr.filters.hidden(e)}}var i=/%20/g,ah=/\[\]$/,bc=/\r?\n/g,ba=/#.*$/,ar=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aO=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aB=/(?:^file|^widget|\-extension):$/,aD=/^(?:GET|HEAD)$/,b=/^\/\//,I=/\?/,aU=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,p=/^(?:select|textarea)/i,g=/\s+/,bb=/([?&])_=[^&]*/,R=/(^|\-)([a-z])/g,aJ=function(bd,e,be){return e+be.toUpperCase()},G=/^([\w\+\.\-]+:)\/\/([^\/?#:]*)(?::(\d+))?/,z=a.fn.load,V={},q={},au,r;try{au=al.location.href}catch(am){au=al.createElement("a");au.href="";au=au.href}r=G.exec(au.toLowerCase());function d(e){return function(bg,bi){if(typeof bg!=="string"){bi=bg;bg="*"}if(a.isFunction(bi)){var bf=bg.toLowerCase().split(g),be=0,bh=bf.length,bd,bj,bk;for(;be<bh;be++){bd=bf[be];bk=/^\+/.test(bd);if(bk){bd=bd.substr(1)||"*"}bj=e[bd]=e[bd]||[];bj[bk?"unshift":"push"](bi)}}}}function aI(bd,bm,bh,bl,bj,bf){bj=bj||bm.dataTypes[0];bf=bf||{};bf[bj]=true;var bi=bd[bj],be=0,e=bi?bi.length:0,bg=(bd===V),bk;for(;be<e&&(bg||!bk);be++){bk=bi[be](bm,bh,bl);if(typeof bk==="string"){if(!bg||bf[bk]){bk=H}else{bm.dataTypes.unshift(bk);bk=aI(bd,bm,bh,bl,bk,bf)}}}if((bg||!bk)&&!bf["*"]){bk=aI(bd,bm,bh,bl,"*",bf)}return bk}a.fn.extend({load:function(be,bh,bi){if(typeof be!=="string"&&z){return z.apply(this,arguments)}else{if(!this.length){return this}}var bg=be.indexOf(" ");if(bg>=0){var e=be.slice(bg,be.length);be=be.slice(0,bg)}var bf="GET";if(bh){if(a.isFunction(bh)){bi=bh;bh=H}else{if(typeof bh==="object"){bh=a.param(bh,a.ajaxSettings.traditional);bf="POST"}}}var bd=this;a.ajax({url:be,type:bf,dataType:"html",data:bh,complete:function(bk,bj,bl){bl=bk.responseText;if(bk.isResolved()){bk.done(function(bm){bl=bm});bd.html(e?a("<div>").append(bl.replace(aU,"")).find(e):bl)}if(bi){bd.each(bi,[bl,bj,bk])}}});return this},serialize:function(){return a.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?a.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||p.test(this.nodeName)||aO.test(this.type))}).map(function(e,bd){var be=a(this).val();return be==null?null:a.isArray(be)?a.map(be,function(bg,bf){return{name:bd.name,value:bg.replace(bc,"\r\n")}}):{name:bd.name,value:be.replace(bc,"\r\n")}}).get()}});a.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bd){a.fn[bd]=function(be){return this.bind(bd,be)}});a.each(["get","post"],function(e,bd){a[bd]=function(be,bg,bh,bf){if(a.isFunction(bg)){bf=bf||bh;bh=bg;bg=H}return a.ajax({type:bd,url:be,data:bg,success:bh,dataType:bf})}});a.extend({getScript:function(e,bd){return a.get(e,H,bd,"script")},getJSON:function(e,bd,be){return a.get(e,bd,be,"json")},ajaxSetup:function(be,e){if(!e){e=be;be=a.extend(true,a.ajaxSettings,e)}else{a.extend(true,be,a.ajaxSettings,e)}for(var bd in {context:1,url:1}){if(bd in e){be[bd]=e[bd]}else{if(bd in a.ajaxSettings){be[bd]=a.ajaxSettings[bd]}}}return be},ajaxSettings:{url:au,isLocal:aB.test(r[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":aY.String,"text html":true,"text json":a.parseJSON,"text xml":a.parseXML}},ajaxPrefilter:d(V),ajaxTransport:d(q),ajax:function(bh,bf){if(typeof bh==="object"){bf=bh;bh=H}bf=bf||{};var bl=a.ajaxSetup({},bf),bz=bl.context||bl,bo=bz!==bl&&(bz.nodeType||bz instanceof a)?a(bz):a.event,by=a.Deferred(),bv=a._Deferred(),bj=bl.statusCode||{},bk,bp={},bx,bg,bt,bm,bq,bi=0,be,bs,br={readyState:0,setRequestHeader:function(e,bA){if(!bi){bp[e.toLowerCase().replace(R,aJ)]=bA}return this},getAllResponseHeaders:function(){return bi===2?bx:null},getResponseHeader:function(bA){var e;if(bi===2){if(!bg){bg={};while((e=ar.exec(bx))){bg[e[1].toLowerCase()]=e[2]}}e=bg[bA.toLowerCase()]}return e===H?null:e},overrideMimeType:function(e){if(!bi){bl.mimeType=e}return this},abort:function(e){e=e||"abort";if(bt){bt.abort(e)}bn(0,e);return this}};function bn(bF,bD,bG,bC){if(bi===2){return}bi=2;if(bm){clearTimeout(bm)}bt=H;bx=bC||"";br.readyState=bF?4:0;var bA,bK,bJ,bE=bG?a4(bl,br,bG):H,bB,bI;if(bF>=200&&bF<300||bF===304){if(bl.ifModified){if((bB=br.getResponseHeader("Last-Modified"))){a.lastModified[bk]=bB}if((bI=br.getResponseHeader("Etag"))){a.etag[bk]=bI}}if(bF===304){bD="notmodified";bA=true}else{try{bK=D(bl,bE);bD="success";bA=true}catch(bH){bD="parsererror";bJ=bH}}}else{bJ=bD;if(!bD||bF){bD="error";if(bF<0){bF=0}}}br.status=bF;br.statusText=bD;if(bA){by.resolveWith(bz,[bK,bD,br])}else{by.rejectWith(bz,[br,bD,bJ])}br.statusCode(bj);bj=H;if(be){bo.trigger("ajax"+(bA?"Success":"Error"),[br,bl,bA?bK:bJ])}bv.resolveWith(bz,[br,bD]);if(be){bo.trigger("ajaxComplete",[br,bl]);if(!(--a.active)){a.event.trigger("ajaxStop")}}}by.promise(br);br.success=br.done;br.error=br.fail;br.complete=bv.done;br.statusCode=function(bA){if(bA){var e;if(bi<2){for(e in bA){bj[e]=[bj[e],bA[e]]}}else{e=bA[br.status];br.then(e,e)}}return this};bl.url=((bh||bl.url)+"").replace(ba,"").replace(b,r[1]+"//");bl.dataTypes=a.trim(bl.dataType||"*").toLowerCase().split(g);if(!bl.crossDomain){bq=G.exec(bl.url.toLowerCase());bl.crossDomain=!!(bq&&(bq[1]!=r[1]||bq[2]!=r[2]||(bq[3]||(bq[1]==="http:"?80:443))!=(r[3]||(r[1]==="http:"?80:443))))}if(bl.data&&bl.processData&&typeof bl.data!=="string"){bl.data=a.param(bl.data,bl.traditional)}aI(V,bl,bf,br);if(bi===2){return false}be=bl.global;bl.type=bl.type.toUpperCase();bl.hasContent=!aD.test(bl.type);if(be&&a.active++===0){a.event.trigger("ajaxStart")}if(!bl.hasContent){if(bl.data){bl.url+=(I.test(bl.url)?"&":"?")+bl.data}bk=bl.url;if(bl.cache===false){var bd=a.now(),bw=bl.url.replace(bb,"$1_="+bd);bl.url=bw+((bw===bl.url)?(I.test(bl.url)?"&":"?")+"_="+bd:"")}}if(bl.data&&bl.hasContent&&bl.contentType!==false||bf.contentType){bp["Content-Type"]=bl.contentType}if(bl.ifModified){bk=bk||bl.url;if(a.lastModified[bk]){bp["If-Modified-Since"]=a.lastModified[bk]}if(a.etag[bk]){bp["If-None-Match"]=a.etag[bk]}}bp.Accept=bl.dataTypes[0]&&bl.accepts[bl.dataTypes[0]]?bl.accepts[bl.dataTypes[0]]+(bl.dataTypes[0]!=="*"?", */*; q=0.01":""):bl.accepts["*"];for(bs in bl.headers){br.setRequestHeader(bs,bl.headers[bs])}if(bl.beforeSend&&(bl.beforeSend.call(bz,br,bl)===false||bi===2)){br.abort();return false}for(bs in {success:1,error:1,complete:1}){br[bs](bl[bs])}bt=aI(q,bl,bf,br);if(!bt){bn(-1,"No Transport")}else{br.readyState=1;if(be){bo.trigger("ajaxSend",[br,bl])}if(bl.async&&bl.timeout>0){bm=setTimeout(function(){br.abort("timeout")},bl.timeout)}try{bi=1;bt.send(bp,bn)}catch(bu){if(status<2){bn(-1,bu)}else{a.error(bu)}}}return br},param:function(e,be){var bd=[],bg=function(bh,bi){bi=a.isFunction(bi)?bi():bi;bd[bd.length]=encodeURIComponent(bh)+"="+encodeURIComponent(bi)};if(be===H){be=a.ajaxSettings.traditional}if(a.isArray(e)||(e.jquery&&!a.isPlainObject(e))){a.each(e,function(){bg(this.name,this.value)})}else{for(var bf in e){u(bf,e[bf],be,bg)}}return bd.join("&").replace(i,"+")}});function u(be,bg,bd,bf){if(a.isArray(bg)&&bg.length){a.each(bg,function(bi,bh){if(bd||ah.test(be)){bf(be,bh)}else{u(be+"["+(typeof bh==="object"||a.isArray(bh)?bi:"")+"]",bh,bd,bf)}})}else{if(!bd&&bg!=null&&typeof bg==="object"){if(a.isArray(bg)||a.isEmptyObject(bg)){bf(be,"")}else{for(var e in bg){u(be+"["+e+"]",bg[e],bd,bf)}}}else{bf(be,bg)}}}a.extend({active:0,lastModified:{},etag:{}});function a4(bl,bk,bh){var bd=bl.contents,bj=bl.dataTypes,be=bl.responseFields,bg,bi,bf,e;for(bi in be){if(bi in bh){bk[be[bi]]=bh[bi]}}while(bj[0]==="*"){bj.shift();if(bg===H){bg=bl.mimeType||bk.getResponseHeader("content-type")}}if(bg){for(bi in bd){if(bd[bi]&&bd[bi].test(bg)){bj.unshift(bi);break}}}if(bj[0] in bh){bf=bj[0]}else{for(bi in bh){if(!bj[0]||bl.converters[bi+" "+bj[0]]){bf=bi;break}if(!e){e=bi}}bf=bf||e}if(bf){if(bf!==bj[0]){bj.unshift(bf)}return bh[bf]}}function D(bp,bh){if(bp.dataFilter){bh=bp.dataFilter(bh,bp.dataType)}var bl=bp.dataTypes,bo={},bi,bm,be=bl.length,bj,bk=bl[0],bf,bg,bn,bd,e;for(bi=1;bi<be;bi++){if(bi===1){for(bm in bp.converters){if(typeof bm==="string"){bo[bm.toLowerCase()]=bp.converters[bm]}}}bf=bk;bk=bl[bi];if(bk==="*"){bk=bf}else{if(bf!=="*"&&bf!==bk){bg=bf+" "+bk;bn=bo[bg]||bo["* "+bk];if(!bn){e=H;for(bd in bo){bj=bd.split(" ");if(bj[0]===bf||bj[0]==="*"){e=bo[bj[1]+" "+bk];if(e){bd=bo[bd];if(bd===true){bn=e}else{if(e===true){bn=bd}}break}}}}if(!(bn||e)){a.error("No conversion from "+bg.replace(" "," to "))}if(bn!==true){bh=bn?bn(bh):e(bd(bh))}}}}return bh}var aq=a.now(),t=/(\=)\?(&|$)|()\?\?()/i;a.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return a.expando+"_"+(aq++)}});a.ajaxPrefilter("json jsonp",function(bm,bi,bl){var bk=(typeof bm.data==="string");if(bm.dataTypes[0]==="jsonp"||bi.jsonpCallback||bi.jsonp!=null||bm.jsonp!==false&&(t.test(bm.url)||bk&&t.test(bm.data))){var bj,be=bm.jsonpCallback=a.isFunction(bm.jsonpCallback)?bm.jsonpCallback():bm.jsonpCallback,bh=aY[be],e=bm.url,bg=bm.data,bd="$1"+be+"$2",bf=function(){aY[be]=bh;if(bj&&a.isFunction(bh)){aY[be](bj[0])}};if(bm.jsonp!==false){e=e.replace(t,bd);if(bm.url===e){if(bk){bg=bg.replace(t,bd)}if(bm.data===bg){e+=(/\?/.test(e)?"&":"?")+bm.jsonp+"="+be}}}bm.url=e;bm.data=bg;aY[be]=function(bn){bj=[bn]};bl.then(bf,bf);bm.converters["script json"]=function(){if(!bj){a.error(be+" was not called")}return bj[0]};bm.dataTypes[0]="json";return"script"}});a.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){a.globalEval(e);return e}}});a.ajaxPrefilter("script",function(e){if(e.cache===H){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});a.ajaxTransport("script",function(be){if(be.crossDomain){var e,bd=al.head||al.getElementsByTagName("head")[0]||al.documentElement;return{send:function(bf,bg){e=al.createElement("script");e.async="async";if(be.scriptCharset){e.charset=be.scriptCharset}e.src=be.url;e.onload=e.onreadystatechange=function(bi,bh){if(!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bd&&e.parentNode){bd.removeChild(e)}e=H;if(!bh){bg(200,"success")}}};bd.insertBefore(e,bd.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var x=a.now(),J,at;function A(){a(aY).unload(function(){for(var e in J){J[e](0,1)}})}function aA(){try{return new aY.XMLHttpRequest()}catch(bd){}}function ad(){try{return new aY.ActiveXObject("Microsoft.XMLHTTP")}catch(bd){}}a.ajaxSettings.xhr=aY.ActiveXObject?function(){return !this.isLocal&&aA()||ad()}:aA;at=a.ajaxSettings.xhr();a.support.ajax=!!at;a.support.cors=at&&("withCredentials" in at);at=H;if(a.support.ajax){a.ajaxTransport(function(e){if(!e.crossDomain||a.support.cors){var bd;return{send:function(bj,be){var bi=e.xhr(),bh,bg;if(e.username){bi.open(e.type,e.url,e.async,e.username,e.password)}else{bi.open(e.type,e.url,e.async)}if(e.xhrFields){for(bg in e.xhrFields){bi[bg]=e.xhrFields[bg]}}if(e.mimeType&&bi.overrideMimeType){bi.overrideMimeType(e.mimeType)}if(!(e.crossDomain&&!e.hasContent)&&!bj["X-Requested-With"]){bj["X-Requested-With"]="XMLHttpRequest"}try{for(bg in bj){bi.setRequestHeader(bg,bj[bg])}}catch(bf){}bi.send((e.hasContent&&e.data)||null);bd=function(bs,bm){var bn,bl,bk,bq,bp;try{if(bd&&(bm||bi.readyState===4)){bd=H;if(bh){bi.onreadystatechange=a.noop;delete J[bh]}if(bm){if(bi.readyState!==4){bi.abort()}}else{bn=bi.status;bk=bi.getAllResponseHeaders();bq={};bp=bi.responseXML;if(bp&&bp.documentElement){bq.xml=bp}bq.text=bi.responseText;try{bl=bi.statusText}catch(br){bl=""}if(!bn&&e.isLocal&&!e.crossDomain){bn=bq.text?200:404}else{if(bn===1223){bn=204}}}}}catch(bo){if(!bm){be(-1,bo)}}if(bq){be(bn,bl,bq,bk)}};if(!e.async||bi.readyState===4){bd()}else{if(!J){J={};A()}bh=x++;bi.onreadystatechange=J[bh]=bd}},abort:function(){if(bd){bd(0,1)}}}}})}var N={},ap=/^(?:toggle|show|hide)$/,aF=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,aS,ax=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];a.fn.extend({show:function(bf,bi,bh){var be,bg;if(bf||bf===0){return this.animate(aQ("show",3),bf,bi,bh)}else{for(var bd=0,e=this.length;bd<e;bd++){be=this[bd];bg=be.style.display;if(!a._data(be,"olddisplay")&&bg==="none"){bg=be.style.display=""}if(bg===""&&a.css(be,"display")==="none"){a._data(be,"olddisplay",w(be.nodeName))}}for(bd=0;bd<e;bd++){be=this[bd];bg=be.style.display;if(bg===""||bg==="none"){be.style.display=a._data(be,"olddisplay")||""}}return this}},hide:function(be,bh,bg){if(be||be===0){return this.animate(aQ("hide",3),be,bh,bg)}else{for(var bd=0,e=this.length;bd<e;bd++){var bf=a.css(this[bd],"display");if(bf!=="none"&&!a._data(this[bd],"olddisplay")){a._data(this[bd],"olddisplay",bf)}}for(bd=0;bd<e;bd++){this[bd].style.display="none"}return this}},_toggle:a.fn.toggle,toggle:function(be,bd,bf){var e=typeof be==="boolean";if(a.isFunction(be)&&a.isFunction(bd)){this._toggle.apply(this,arguments)}else{if(be==null||e){this.each(function(){var bg=e?be:a(this).is(":hidden");a(this)[bg?"show":"hide"]()})}else{this.animate(aQ("toggle",3),be,bd,bf)}}return this},fadeTo:function(e,bf,be,bd){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bf},e,be,bd)},animate:function(bg,bd,bf,be){var e=a.speed(bd,bf,be);if(a.isEmptyObject(bg)){return this.each(e.complete)}return this[e.queue===false?"each":"queue"](function(){var bj=a.extend({},e),bn,bk=this.nodeType===1,bl=bk&&a(this).is(":hidden"),bh=this;for(bn in bg){var bi=a.camelCase(bn);if(bn!==bi){bg[bi]=bg[bn];delete bg[bn];bn=bi}if(bg[bn]==="hide"&&bl||bg[bn]==="show"&&!bl){return bj.complete.call(this)}if(bk&&(bn==="height"||bn==="width")){bj.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(a.css(this,"display")==="inline"&&a.css(this,"float")==="none"){if(!a.support.inlineBlockNeedsLayout){this.style.display="inline-block"}else{var bm=w(this.nodeName);if(bm==="inline"){this.style.display="inline-block"}else{this.style.display="inline";this.style.zoom=1}}}}if(a.isArray(bg[bn])){(bj.specialEasing=bj.specialEasing||{})[bn]=bg[bn][1];bg[bn]=bg[bn][0]}}if(bj.overflow!=null){this.style.overflow="hidden"}bj.curAnim=a.extend({},bg);a.each(bg,function(bp,bt){var bs=new a.fx(bh,bj,bp);if(ap.test(bt)){bs[bt==="toggle"?bl?"show":"hide":bt](bg)}else{var br=aF.exec(bt),bu=bs.cur();if(br){var bo=parseFloat(br[2]),bq=br[3]||(a.cssNumber[bp]?"":"px");if(bq!=="px"){a.style(bh,bp,(bo||1)+bq);bu=((bo||1)/bs.cur())*bu;a.style(bh,bp,bu+bq)}if(br[1]){bo=((br[1]==="-="?-1:1)*bo)+bu}bs.custom(bu,bo,bq)}else{bs.custom(bu,bt,"")}}});return true})},stop:function(bd,e){var be=a.timers;if(bd){this.queue([])}this.each(function(){for(var bf=be.length-1;bf>=0;bf--){if(be[bf].elem===this){if(e){be[bf](true)}be.splice(bf,1)}}});if(!e){this.dequeue()}return this}});function aQ(bd,e){var be={};a.each(ax.concat.apply([],ax.slice(0,e)),function(){be[this]=bd});return be}a.each({slideDown:aQ("show",1),slideUp:aQ("hide",1),slideToggle:aQ("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bd){a.fn[e]=function(be,bg,bf){return this.animate(bd,be,bg,bf)}});a.extend({speed:function(be,bf,bd){var e=be&&typeof be==="object"?a.extend({},be):{complete:bd||!bd&&bf||a.isFunction(be)&&be,duration:be,easing:bd&&bf||bf&&!a.isFunction(bf)&&bf};e.duration=a.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in a.fx.speeds?a.fx.speeds[e.duration]:a.fx.speeds._default;e.old=e.complete;e.complete=function(){if(e.queue!==false){a(this).dequeue()}if(a.isFunction(e.old)){e.old.call(this)}};return e},easing:{linear:function(be,bf,e,bd){return e+bd*be},swing:function(be,bf,e,bd){return((-Math.cos(be*Math.PI)/2)+0.5)*bd+e}},timers:[],fx:function(bd,e,be){this.options=e;this.elem=bd;this.prop=be;if(!e.orig){e.orig={}}}});a.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(a.fx.step[this.prop]||a.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bd=a.css(this.elem,this.prop);return isNaN(e=parseFloat(bd))?!bd||bd==="auto"?0:bd:e},custom:function(bh,bg,bf){var e=this,be=a.fx;this.startTime=a.now();this.start=bh;this.end=bg;this.unit=bf||this.unit||(a.cssNumber[this.prop]?"":"px");this.now=this.start;this.pos=this.state=0;function bd(bi){return e.step(bi)}bd.elem=this.elem;if(bd()&&a.timers.push(bd)&&!aS){aS=setInterval(be.tick,be.interval)}},show:function(){this.options.orig[this.prop]=a.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());a(this.elem).show()},hide:function(){this.options.orig[this.prop]=a.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(bf){var bk=a.now(),bg=true;if(bf||bk>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var bh in this.options.curAnim){if(this.options.curAnim[bh]!==true){bg=false}}if(bg){if(this.options.overflow!=null&&!a.support.shrinkWrapBlocks){var be=this.elem,bl=this.options;a.each(["","X","Y"],function(bm,bn){be.style["overflow"+bn]=bl.overflow[bm]})}if(this.options.hide){a(this.elem).hide()}if(this.options.hide||this.options.show){for(var e in this.options.curAnim){a.style(this.elem,e,this.options.orig[e])}}this.options.complete.call(this.elem)}return false}else{var bd=bk-this.startTime;this.state=bd/this.options.duration;var bi=this.options.specialEasing&&this.options.specialEasing[this.prop];var bj=this.options.easing||(a.easing.swing?"swing":"linear");this.pos=a.easing[bi||bj](this.state,bd,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};a.extend(a.fx,{tick:function(){var bd=a.timers;for(var e=0;e<bd.length;e++){if(!bd[e]()){bd.splice(e--,1)}}if(!bd.length){a.fx.stop()}},interval:13,stop:function(){clearInterval(aS);aS=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){a.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=(e.prop==="width"||e.prop==="height"?Math.max(0,e.now):e.now)+e.unit}else{e.elem[e.prop]=e.now}}}});if(a.expr&&a.expr.filters){a.expr.filters.animated=function(e){return a.grep(a.timers,function(bd){return e===bd.elem}).length}}function w(be){if(!N[be]){var e=a("<"+be+">").appendTo("body"),bd=e.css("display");e.remove();if(bd==="none"||bd===""){bd="block"}N[be]=bd}return N[be]}var S=/^t(?:able|d|h)$/i,Y=/^(?:body|html)$/i;if("getBoundingClientRect" in al.documentElement){a.fn.offset=function(bq){var bg=this[0],bj;if(bq){return this.each(function(e){a.offset.setOffset(this,bq,e)})}if(!bg||!bg.ownerDocument){return null}if(bg===bg.ownerDocument.body){return a.offset.bodyOffset(bg)}try{bj=bg.getBoundingClientRect()}catch(bn){}var bp=bg.ownerDocument,be=bp.documentElement;if(!bj||!a.contains(be,bg)){return bj?{top:bj.top,left:bj.left}:{top:0,left:0}}var bk=bp.body,bl=az(bp),bi=be.clientTop||bk.clientTop||0,bm=be.clientLeft||bk.clientLeft||0,bd=(bl.pageYOffset||a.support.boxModel&&be.scrollTop||bk.scrollTop),bh=(bl.pageXOffset||a.support.boxModel&&be.scrollLeft||bk.scrollLeft),bo=bj.top+bd-bi,bf=bj.left+bh-bm;return{top:bo,left:bf}}}else{a.fn.offset=function(bn){var bh=this[0];if(bn){return this.each(function(bo){a.offset.setOffset(this,bn,bo)})}if(!bh||!bh.ownerDocument){return null}if(bh===bh.ownerDocument.body){return a.offset.bodyOffset(bh)}a.offset.initialize();var bk,be=bh.offsetParent,bd=bh,bm=bh.ownerDocument,bf=bm.documentElement,bi=bm.body,bj=bm.defaultView,e=bj?bj.getComputedStyle(bh,null):bh.currentStyle,bl=bh.offsetTop,bg=bh.offsetLeft;while((bh=bh.parentNode)&&bh!==bi&&bh!==bf){if(a.offset.supportsFixedPosition&&e.position==="fixed"){break}bk=bj?bj.getComputedStyle(bh,null):bh.currentStyle;bl-=bh.scrollTop;bg-=bh.scrollLeft;if(bh===be){bl+=bh.offsetTop;bg+=bh.offsetLeft;if(a.offset.doesNotAddBorder&&!(a.offset.doesAddBorderForTableAndCells&&S.test(bh.nodeName))){bl+=parseFloat(bk.borderTopWidth)||0;bg+=parseFloat(bk.borderLeftWidth)||0}bd=be;be=bh.offsetParent}if(a.offset.subtractsBorderForOverflowNotVisible&&bk.overflow!=="visible"){bl+=parseFloat(bk.borderTopWidth)||0;bg+=parseFloat(bk.borderLeftWidth)||0}e=bk}if(e.position==="relative"||e.position==="static"){bl+=bi.offsetTop;bg+=bi.offsetLeft}if(a.offset.supportsFixedPosition&&e.position==="fixed"){bl+=Math.max(bf.scrollTop,bi.scrollTop);bg+=Math.max(bf.scrollLeft,bi.scrollLeft)}return{top:bl,left:bg}}}a.offset={initialize:function(){var e=al.body,bd=al.createElement("div"),bg,bi,bh,bj,be=parseFloat(a.css(e,"marginTop"))||0,bf="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.extend(bd.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});bd.innerHTML=bf;e.insertBefore(bd,e.firstChild);bg=bd.firstChild;bi=bg.firstChild;bj=bg.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(bi.offsetTop!==5);this.doesAddBorderForTableAndCells=(bj.offsetTop===5);bi.style.position="fixed";bi.style.top="20px";this.supportsFixedPosition=(bi.offsetTop===20||bi.offsetTop===15);bi.style.position=bi.style.top="";bg.style.overflow="hidden";bg.style.position="relative";this.subtractsBorderForOverflowNotVisible=(bi.offsetTop===-5);this.doesNotIncludeMarginInBodyOffset=(e.offsetTop!==be);e.removeChild(bd);e=bd=bg=bi=bh=bj=null;a.offset.initialize=a.noop},bodyOffset:function(e){var be=e.offsetTop,bd=e.offsetLeft;a.offset.initialize();if(a.offset.doesNotIncludeMarginInBodyOffset){be+=parseFloat(a.css(e,"marginTop"))||0;bd+=parseFloat(a.css(e,"marginLeft"))||0}return{top:be,left:bd}},setOffset:function(bf,bo,bi){var bj=a.css(bf,"position");if(bj==="static"){bf.style.position="relative"}var bh=a(bf),bd=bh.offset(),e=a.css(bf,"top"),bm=a.css(bf,"left"),bn=(bj==="absolute"&&a.inArray("auto",[e,bm])>-1),bl={},bk={},be,bg;if(bn){bk=bh.position()}be=bn?bk.top:parseInt(e,10)||0;bg=bn?bk.left:parseInt(bm,10)||0;if(a.isFunction(bo)){bo=bo.call(bf,bi,bd)}if(bo.top!=null){bl.top=(bo.top-bd.top)+be}if(bo.left!=null){bl.left=(bo.left-bd.left)+bg}if("using" in bo){bo.using.call(bf,bl)}else{bh.css(bl)}}};a.fn.extend({position:function(){if(!this[0]){return null}var be=this[0],bd=this.offsetParent(),bf=this.offset(),e=Y.test(bd[0].nodeName)?{top:0,left:0}:bd.offset();bf.top-=parseFloat(a.css(be,"marginTop"))||0;bf.left-=parseFloat(a.css(be,"marginLeft"))||0;e.top+=parseFloat(a.css(bd[0],"borderTopWidth"))||0;e.left+=parseFloat(a.css(bd[0],"borderLeftWidth"))||0;return{top:bf.top-e.top,left:bf.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||al.body;while(e&&(!Y.test(e.nodeName)&&a.css(e,"position")==="static")){e=e.offsetParent}return e})}});a.each(["Left","Top"],function(bd,e){var be="scroll"+e;a.fn[be]=function(bh){var bf=this[0],bg;if(!bf){return null}if(bh!==H){return this.each(function(){bg=az(this);if(bg){bg.scrollTo(!bd?bh:a(bg).scrollLeft(),bd?bh:a(bg).scrollTop())}else{this[be]=bh}})}else{bg=az(bf);return bg?("pageXOffset" in bg)?bg[bd?"pageYOffset":"pageXOffset"]:a.support.boxModel&&bg.document.documentElement[be]||bg.document.body[be]:bf[be]}}});function az(e){return a.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}a.each(["Height","Width"],function(bd,e){var be=e.toLowerCase();a.fn["inner"+e]=function(){return this[0]?parseFloat(a.css(this[0],be,"padding")):null};a.fn["outer"+e]=function(bf){return this[0]?parseFloat(a.css(this[0],be,bf?"margin":"border")):null};a.fn[be]=function(bg){var bh=this[0];if(!bh){return bg==null?null:this}if(a.isFunction(bg)){return this.each(function(bl){var bk=a(this);bk[be](bg.call(this,bl,bk[be]()))})}if(a.isWindow(bh)){var bi=bh.document.documentElement["client"+e];return bh.document.compatMode==="CSS1Compat"&&bi||bh.document.body["client"+e]||bi}else{if(bh.nodeType===9){return Math.max(bh.documentElement["client"+e],bh.body["scroll"+e],bh.documentElement["scroll"+e],bh.body["offset"+e],bh.documentElement["offset"+e])}else{if(bg===H){var bj=a.css(bh,be),bf=parseFloat(bj);return a.isNaN(bf)?bj:bf}else{return this.css(be,typeof bg==="string"?bg:bg+"px")}}}}});aY.jQuery=aY.$=a})(window);
\ No newline at end of file
+(function(){var bp=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,bq=0,bt=Object.prototype.toString,bk=false,bj=true,br=/\\/g,bx=/\W/;[0,0].sort(function(){bj=false;return 0});var bh=function(bC,e,bF,bG){bF=bF||[];e=e||am;var bI=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!bC||typeof bC!=="string"){return bF}var bz,bK,bN,by,bJ,bM,bL,bE,bB=true,bA=bh.isXML(e),bD=[],bH=bC;do{bp.exec("");bz=bp.exec(bH);if(bz){bH=bz[3];bD.push(bz[1]);if(bz[2]){by=bz[3];break}}}while(bz);if(bD.length>1&&bl.exec(bC)){if(bD.length===2&&bm.relative[bD[0]]){bK=bu(bD[0]+bD[1],e)}else{bK=bm.relative[bD[0]]?[e]:bh(bD.shift(),e);while(bD.length){bC=bD.shift();if(bm.relative[bC]){bC+=bD.shift()}bK=bu(bC,bK)}}}else{if(!bG&&bD.length>1&&e.nodeType===9&&!bA&&bm.match.ID.test(bD[0])&&!bm.match.ID.test(bD[bD.length-1])){bJ=bh.find(bD.shift(),e,bA);e=bJ.expr?bh.filter(bJ.expr,bJ.set)[0]:bJ.set[0]}if(e){bJ=bG?{expr:bD.pop(),set:bn(bG)}:bh.find(bD.pop(),bD.length===1&&(bD[0]==="~"||bD[0]==="+")&&e.parentNode?e.parentNode:e,bA);bK=bJ.expr?bh.filter(bJ.expr,bJ.set):bJ.set;if(bD.length>0){bN=bn(bK)}else{bB=false}while(bD.length){bM=bD.pop();bL=bM;if(!bm.relative[bM]){bM=""}else{bL=bD.pop()}if(bL==null){bL=e}bm.relative[bM](bN,bL,bA)}}else{bN=bD=[]}}if(!bN){bN=bK}if(!bN){bh.error(bM||bC)}if(bt.call(bN)==="[object Array]"){if(!bB){bF.push.apply(bF,bN)}else{if(e&&e.nodeType===1){for(bE=0;bN[bE]!=null;bE++){if(bN[bE]&&(bN[bE]===true||bN[bE].nodeType===1&&bh.contains(e,bN[bE]))){bF.push(bK[bE])}}}else{for(bE=0;bN[bE]!=null;bE++){if(bN[bE]&&bN[bE].nodeType===1){bF.push(bK[bE])}}}}}else{bn(bN,bF)}if(by){bh(by,bI,bF,bG);bh.uniqueSort(bF)}return bF};bh.uniqueSort=function(by){if(bs){bk=bj;by.sort(bs);if(bk){for(var e=1;e<by.length;e++){if(by[e]===by[e-1]){by.splice(e--,1)}}}}return by};bh.matches=function(e,by){return bh(e,null,null,by)};bh.matchesSelector=function(e,by){return bh(by,null,null,[e]).length>0};bh.find=function(bE,e,bF){var bD;if(!bE){return[]}for(var bA=0,bz=bm.order.length;bA<bz;bA++){var bB,bC=bm.order[bA];if((bB=bm.leftMatch[bC].exec(bE))){var by=bB[1];bB.splice(1,1);if(by.substr(by.length-1)!=="\\"){bB[1]=(bB[1]||"").replace(br,"");bD=bm.find[bC](bB,e,bF);if(bD!=null){bE=bE.replace(bm.match[bC],"");break}}}}if(!bD){bD=typeof e.getElementsByTagName!=="undefined"?e.getElementsByTagName("*"):[]}return{set:bD,expr:bE}};bh.filter=function(bI,bH,bL,bB){var bD,e,bz=bI,bN=[],bF=bH,bE=bH&&bH[0]&&bh.isXML(bH[0]);while(bI&&bH.length){for(var bG in bm.filter){if((bD=bm.leftMatch[bG].exec(bI))!=null&&bD[2]){var bM,bK,by=bm.filter[bG],bA=bD[1];e=false;bD.splice(1,1);if(bA.substr(bA.length-1)==="\\"){continue}if(bF===bN){bN=[]}if(bm.preFilter[bG]){bD=bm.preFilter[bG](bD,bF,bL,bN,bB,bE);if(!bD){e=bM=true}else{if(bD===true){continue}}}if(bD){for(var bC=0;(bK=bF[bC])!=null;bC++){if(bK){bM=by(bK,bD,bC,bF);var bJ=bB^!!bM;if(bL&&bM!=null){if(bJ){e=true}else{bF[bC]=false}}else{if(bJ){bN.push(bK);e=true}}}}}if(bM!==I){if(!bL){bF=bN}bI=bI.replace(bm.match[bG],"");if(!e){return[]}break}}}if(bI===bz){if(e==null){bh.error(bI)}else{break}}bz=bI}return bF};bh.error=function(e){throw"Syntax error, unrecognized expression: "+e};var bm=bh.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(e){return e.getAttribute("href")},type:function(e){return e.getAttribute("type")}},relative:{"+":function(bD,by){var bA=typeof by==="string",bC=bA&&!bx.test(by),bE=bA&&!bC;if(bC){by=by.toLowerCase()}for(var bz=0,e=bD.length,bB;bz<e;bz++){if((bB=bD[bz])){while((bB=bB.previousSibling)&&bB.nodeType!==1){}bD[bz]=bE||bB&&bB.nodeName.toLowerCase()===by?bB||false:bB===by}}if(bE){bh.filter(by,bD,true)}},">":function(bD,by){var bC,bB=typeof by==="string",bz=0,e=bD.length;if(bB&&!bx.test(by)){by=by.toLowerCase();for(;bz<e;bz++){bC=bD[bz];if(bC){var bA=bC.parentNode;bD[bz]=bA.nodeName.toLowerCase()===by?bA:false}}}else{for(;bz<e;bz++){bC=bD[bz];if(bC){bD[bz]=bB?bC.parentNode:bC.parentNode===by}}if(bB){bh.filter(by,bD,true)}}},"":function(bA,by,bC){var bB,bz=bq++,e=bv;if(typeof by==="string"&&!bx.test(by)){by=by.toLowerCase();bB=by;e=bf}e("parentNode",by,bz,bA,bB,bC)},"~":function(bA,by,bC){var bB,bz=bq++,e=bv;if(typeof by==="string"&&!bx.test(by)){by=by.toLowerCase();bB=by;e=bf}e("previousSibling",by,bz,bA,bB,bC)}},find:{ID:function(by,bz,bA){if(typeof bz.getElementById!=="undefined"&&!bA){var e=bz.getElementById(by[1]);return e&&e.parentNode?[e]:[]}},NAME:function(bz,bC){if(typeof bC.getElementsByName!=="undefined"){var by=[],bB=bC.getElementsByName(bz[1]);for(var bA=0,e=bB.length;bA<e;bA++){if(bB[bA].getAttribute("name")===bz[1]){by.push(bB[bA])}}return by.length===0?null:by}},TAG:function(e,by){if(typeof by.getElementsByTagName!=="undefined"){return by.getElementsByTagName(e[1])}}},preFilter:{CLASS:function(bA,by,bz,e,bD,bE){bA=" "+bA[1].replace(br,"")+" ";if(bE){return bA}for(var bB=0,bC;(bC=by[bB])!=null;bB++){if(bC){if(bD^(bC.className&&(" "+bC.className+" ").replace(/[\t\n\r]/g," ").indexOf(bA)>=0)){if(!bz){e.push(bC)}}else{if(bz){by[bB]=false}}}}return false},ID:function(e){return e[1].replace(br,"")},TAG:function(by,e){return by[1].replace(br,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){bh.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var by=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(by[1]+(by[2]||1))-0;e[3]=by[3]-0}else{if(e[2]){bh.error(e[0])}}e[0]=bq++;return e},ATTR:function(bB,by,bz,e,bC,bD){var bA=bB[1]=bB[1].replace(br,"");if(!bD&&bm.attrMap[bA]){bB[1]=bm.attrMap[bA]}bB[4]=(bB[4]||bB[5]||"").replace(br,"");if(bB[2]==="~="){bB[4]=" "+bB[4]+" "}return bB},PSEUDO:function(bB,by,bz,e,bC){if(bB[1]==="not"){if((bp.exec(bB[3])||"").length>1||/^\w/.test(bB[3])){bB[3]=bh(bB[3],null,null,by)}else{var bA=bh.filter(bB[3],by,bz,true^bC);if(!bz){e.push.apply(e,bA)}return false}}else{if(bm.match.POS.test(bB[0])||bm.match.CHILD.test(bB[0])){return true}}return bB},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(bz,by,e){return !!bh(e[3],bz).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(bz){var e=bz.getAttribute("type"),by=bz.type;return"text"===by&&(e===by||e===null)},radio:function(e){return"radio"===e.type},checkbox:function(e){return"checkbox"===e.type},file:function(e){return"file"===e.type},password:function(e){return"password"===e.type},submit:function(e){return"submit"===e.type},image:function(e){return"image"===e.type},reset:function(e){return"reset"===e.type},button:function(e){return"button"===e.type||e.nodeName.toLowerCase()==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)}},setFilters:{first:function(by,e){return e===0},last:function(bz,by,e,bA){return by===bA.length-1},even:function(by,e){return e%2===0},odd:function(by,e){return e%2===1},lt:function(bz,by,e){return by<e[3]-0},gt:function(bz,by,e){return by>e[3]-0},nth:function(bz,by,e){return e[3]-0===by},eq:function(bz,by,e){return e[3]-0===by}},filter:{PSEUDO:function(bz,bE,bD,bF){var e=bE[1],by=bm.filters[e];if(by){return by(bz,bD,bE,bF)}else{if(e==="contains"){return(bz.textContent||bz.innerText||bh.getText([bz])||"").indexOf(bE[3])>=0}else{if(e==="not"){var bA=bE[3];for(var bC=0,bB=bA.length;bC<bB;bC++){if(bA[bC]===bz){return false}}return true}else{bh.error(e)}}}},CHILD:function(e,bA){var bD=bA[1],by=e;switch(bD){case"only":case"first":while((by=by.previousSibling)){if(by.nodeType===1){return false}}if(bD==="first"){return true}by=e;case"last":while((by=by.nextSibling)){if(by.nodeType===1){return false}}return true;case"nth":var bz=bA[2],bG=bA[3];if(bz===1&&bG===0){return true}var bC=bA[0],bF=e.parentNode;if(bF&&(bF.sizcache!==bC||!e.nodeIndex)){var bB=0;for(by=bF.firstChild;by;by=by.nextSibling){if(by.nodeType===1){by.nodeIndex=++bB}}bF.sizcache=bC}var bE=e.nodeIndex-bG;if(bz===0){return bE===0}else{return(bE%bz===0&&bE/bz>=0)}}},ID:function(by,e){return by.nodeType===1&&by.getAttribute("id")===e},TAG:function(by,e){return(e==="*"&&by.nodeType===1)||by.nodeName.toLowerCase()===e},CLASS:function(by,e){return(" "+(by.className||by.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(bC,bA){var bz=bA[1],e=bm.attrHandle[bz]?bm.attrHandle[bz](bC):bC[bz]!=null?bC[bz]:bC.getAttribute(bz),bD=e+"",bB=bA[2],by=bA[4];return e==null?bB==="!=":bB==="="?bD===by:bB==="*="?bD.indexOf(by)>=0:bB==="~="?(" "+bD+" ").indexOf(by)>=0:!by?bD&&e!==false:bB==="!="?bD!==by:bB==="^="?bD.indexOf(by)===0:bB==="$="?bD.substr(bD.length-by.length)===by:bB==="|="?bD===by||bD.substr(0,by.length+1)===by+"-":false},POS:function(bB,by,bz,bC){var e=by[2],bA=bm.setFilters[e];if(bA){return bA(bB,bz,by,bC)}}}};var bl=bm.match.POS,bg=function(by,e){return"\\"+(e-0+1)};for(var bi in bm.match){bm.match[bi]=new RegExp(bm.match[bi].source+(/(?![^\[]*\])(?![^\(]*\))/.source));bm.leftMatch[bi]=new RegExp(/(^(?:.|\r|\n)*?)/.source+bm.match[bi].source.replace(/\\(\d+)/g,bg))}var bn=function(by,e){by=Array.prototype.slice.call(by,0);if(e){e.push.apply(e,by);return e}return by};try{Array.prototype.slice.call(am.documentElement.childNodes,0)[0].nodeType}catch(bw){bn=function(bB,bA){var bz=0,by=bA||[];if(bt.call(bB)==="[object Array]"){Array.prototype.push.apply(by,bB)}else{if(typeof bB.length==="number"){for(var e=bB.length;bz<e;bz++){by.push(bB[bz])}}else{for(;bB[bz];bz++){by.push(bB[bz])}}}return by}}var bs,bo;if(am.documentElement.compareDocumentPosition){bs=function(by,e){if(by===e){bk=true;return 0}if(!by.compareDocumentPosition||!e.compareDocumentPosition){return by.compareDocumentPosition?-1:1}return by.compareDocumentPosition(e)&4?-1:1}}else{bs=function(bF,bE){var bC,by,bz=[],e=[],bB=bF.parentNode,bD=bE.parentNode,bG=bB;if(bF===bE){bk=true;return 0}else{if(bB===bD){return bo(bF,bE)}else{if(!bB){return -1}else{if(!bD){return 1}}}}while(bG){bz.unshift(bG);bG=bG.parentNode}bG=bD;while(bG){e.unshift(bG);bG=bG.parentNode}bC=bz.length;by=e.length;for(var bA=0;bA<bC&&bA<by;bA++){if(bz[bA]!==e[bA]){return bo(bz[bA],e[bA])}}return bA===bC?bo(bF,e[bA],-1):bo(bz[bA],bE,1)};bo=function(by,e,bz){if(by===e){return bz}var bA=by.nextSibling;while(bA){if(bA===e){return -1}bA=bA.nextSibling}return 1}}bh.getText=function(e){var by="",bA;for(var bz=0;e[bz];bz++){bA=e[bz];if(bA.nodeType===3||bA.nodeType===4){by+=bA.nodeValue}else{if(bA.nodeType!==8){by+=bh.getText(bA.childNodes)}}}return by};(function(){var by=am.createElement("div"),bz="script"+(new Date()).getTime(),e=am.documentElement;by.innerHTML="<a name='"+bz+"'/>";e.insertBefore(by,e.firstChild);if(am.getElementById(bz)){bm.find.ID=function(bB,bC,bD){if(typeof bC.getElementById!=="undefined"&&!bD){var bA=bC.getElementById(bB[1]);return bA?bA.id===bB[1]||typeof bA.getAttributeNode!=="undefined"&&bA.getAttributeNode("id").nodeValue===bB[1]?[bA]:I:[]}};bm.filter.ID=function(bC,bA){var bB=typeof bC.getAttributeNode!=="undefined"&&bC.getAttributeNode("id");return bC.nodeType===1&&bB&&bB.nodeValue===bA}}e.removeChild(by);e=by=null})();(function(){var e=am.createElement("div");e.appendChild(am.createComment(""));if(e.getElementsByTagName("*").length>0){bm.find.TAG=function(by,bC){var bB=bC.getElementsByTagName(by[1]);if(by[1]==="*"){var bA=[];for(var bz=0;bB[bz];bz++){if(bB[bz].nodeType===1){bA.push(bB[bz])}}bB=bA}return bB}}e.innerHTML="<a href='#'></a>";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){bm.attrHandle.href=function(by){return by.getAttribute("href",2)}}e=null})();if(am.querySelectorAll){(function(){var e=bh,bA=am.createElement("div"),bz="__sizzle__";bA.innerHTML="<p class='TEST'></p>";if(bA.querySelectorAll&&bA.querySelectorAll(".TEST").length===0){return}bh=function(bL,bC,bG,bK){bC=bC||am;if(!bK&&!bh.isXML(bC)){var bJ=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(bL);if(bJ&&(bC.nodeType===1||bC.nodeType===9)){if(bJ[1]){return bn(bC.getElementsByTagName(bL),bG)}else{if(bJ[2]&&bm.find.CLASS&&bC.getElementsByClassName){return bn(bC.getElementsByClassName(bJ[2]),bG)}}}if(bC.nodeType===9){if(bL==="body"&&bC.body){return bn([bC.body],bG)}else{if(bJ&&bJ[3]){var bF=bC.getElementById(bJ[3]);if(bF&&bF.parentNode){if(bF.id===bJ[3]){return bn([bF],bG)}}else{return bn([],bG)}}}try{return bn(bC.querySelectorAll(bL),bG)}catch(bH){}}else{if(bC.nodeType===1&&bC.nodeName.toLowerCase()!=="object"){var bD=bC,bE=bC.getAttribute("id"),bB=bE||bz,bN=bC.parentNode,bM=/^\s*[+~]/.test(bL);if(!bE){bC.setAttribute("id",bB)}else{bB=bB.replace(/'/g,"\\$&")}if(bM&&bN){bC=bC.parentNode}try{if(!bM||bN){return bn(bC.querySelectorAll("[id='"+bB+"'] "+bL),bG)}}catch(bI){}finally{if(!bE){bD.removeAttribute("id")}}}}}return e(bL,bC,bG,bK)};for(var by in e){bh[by]=e[by]}bA=null})()}(function(){var e=am.documentElement,bz=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(bz){var bB=!bz.call(am.createElement("div"),"div"),by=false;try{bz.call(am.documentElement,"[test!='']:sizzle")}catch(bA){by=true}bh.matchesSelector=function(bD,bF){bF=bF.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!bh.isXML(bD)){try{if(by||!bm.match.PSEUDO.test(bF)&&!/!=/.test(bF)){var bC=bz.call(bD,bF);if(bC||!bB||bD.document&&bD.document.nodeType!==11){return bC}}}catch(bE){}}return bh(bF,null,null,[bD]).length>0}}})();(function(){var e=am.createElement("div");e.innerHTML="<div class='test e'></div><div class='test'></div>";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}bm.order.splice(1,0,"CLASS");bm.find.CLASS=function(by,bz,bA){if(typeof bz.getElementsByClassName!=="undefined"&&!bA){return bz.getElementsByClassName(by[1])}};e=null})();function bf(by,bD,bC,bG,bE,bF){for(var bA=0,bz=bG.length;bA<bz;bA++){var e=bG[bA];if(e){var bB=false;e=e[by];while(e){if(e.sizcache===bC){bB=bG[e.sizset];break}if(e.nodeType===1&&!bF){e.sizcache=bC;e.sizset=bA}if(e.nodeName.toLowerCase()===bD){bB=e;break}e=e[by]}bG[bA]=bB}}}function bv(by,bD,bC,bG,bE,bF){for(var bA=0,bz=bG.length;bA<bz;bA++){var e=bG[bA];if(e){var bB=false;e=e[by];while(e){if(e.sizcache===bC){bB=bG[e.sizset];break}if(e.nodeType===1){if(!bF){e.sizcache=bC;e.sizset=bA}if(typeof bD!=="string"){if(e===bD){bB=true;break}}else{if(bh.filter(bD,[e]).length>0){bB=e;break}}}e=e[by]}bG[bA]=bB}}}if(am.documentElement.contains){bh.contains=function(by,e){return by!==e&&(by.contains?by.contains(e):true)}}else{if(am.documentElement.compareDocumentPosition){bh.contains=function(by,e){return !!(by.compareDocumentPosition(e)&16)}}else{bh.contains=function(){return false}}}bh.isXML=function(e){var by=(e?e.ownerDocument||e:0).documentElement;return by?by.nodeName!=="HTML":false};var bu=function(e,bE){var bC,bA=[],bB="",bz=bE.nodeType?[bE]:bE;while((bC=bm.match.PSEUDO.exec(e))){bB+=bC[0];e=e.replace(bm.match.PSEUDO,"")}e=bm.relative[e]?e+"*":e;for(var bD=0,by=bz.length;bD<by;bD++){bh(e,bz[bD],bA)}return bh.filter(bB,bA)};b.find=bh;b.expr=bh.selectors;b.expr[":"]=b.expr.filters;b.unique=bh.uniqueSort;b.text=bh.getText;b.isXMLDoc=bh.isXML;b.contains=bh.contains})();var X=/Until$/,aj=/^(?:parents|prevUntil|prevAll)/,aY=/,/,bb=/^.[^:#\[\.,]*$/,N=Array.prototype.slice,G=b.expr.match.POS,ap={children:true,contents:true,next:true,prev:true};b.fn.extend({find:function(e){var bg=this.pushStack("","find",e),bj=0;for(var bh=0,bf=this.length;bh<bf;bh++){bj=bg.length;b.find(e,this[bh],bg);if(bh>0){for(var bk=bj;bk<bg.length;bk++){for(var bi=0;bi<bj;bi++){if(bg[bi]===bg[bk]){bg.splice(bk--,1);break}}}}}return bg},has:function(bf){var e=b(bf);return this.filter(function(){for(var bh=0,bg=e.length;bh<bg;bh++){if(b.contains(this,e[bh])){return true}}})},not:function(e){return this.pushStack(aw(this,e,false),"not",e)},filter:function(e){return this.pushStack(aw(this,e,true),"filter",e)},is:function(e){return !!e&&b.filter(e,this).length>0},closest:function(bo,bf){var bl=[],bi,bg,bn=this[0];if(b.isArray(bo)){var bk,bh,bj={},e=1;if(bn&&bo.length){for(bi=0,bg=bo.length;bi<bg;bi++){bh=bo[bi];if(!bj[bh]){bj[bh]=b.expr.match.POS.test(bh)?b(bh,bf||this.context):bh}}while(bn&&bn.ownerDocument&&bn!==bf){for(bh in bj){bk=bj[bh];if(bk.jquery?bk.index(bn)>-1:b(bn).is(bk)){bl.push({selector:bh,elem:bn,level:e})}}bn=bn.parentNode;e++}}return bl}var bm=G.test(bo)?b(bo,bf||this.context):null;for(bi=0,bg=this.length;bi<bg;bi++){bn=this[bi];while(bn){if(bm?bm.index(bn)>-1:b.find.matchesSelector(bn,bo)){bl.push(bn);break}else{bn=bn.parentNode;if(!bn||!bn.ownerDocument||bn===bf){break}}}}bl=bl.length>1?b.unique(bl):bl;return this.pushStack(bl,"closest",bo)},index:function(e){if(!e||typeof e==="string"){return b.inArray(this[0],e?b(e):this.parent().children())}return b.inArray(e.jquery?e[0]:e,this)},add:function(e,bf){var bh=typeof e==="string"?b(e,bf):b.makeArray(e),bg=b.merge(this.get(),bh);return this.pushStack(C(bh[0])||C(bg[0])?bg:b.unique(bg))},andSelf:function(){return this.add(this.prevObject)}});function C(e){return !e||!e.parentNode||e.parentNode.nodeType===11}b.each({parent:function(bf){var e=bf.parentNode;return e&&e.nodeType!==11?e:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(bf,e,bg){return b.dir(bf,"parentNode",bg)},next:function(e){return b.nth(e,2,"nextSibling")},prev:function(e){return b.nth(e,2,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(bf,e,bg){return b.dir(bf,"nextSibling",bg)},prevUntil:function(bf,e,bg){return b.dir(bf,"previousSibling",bg)},siblings:function(e){return b.sibling(e.parentNode.firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.makeArray(e.childNodes)}},function(e,bf){b.fn[e]=function(bj,bg){var bi=b.map(this,bf,bj),bh=N.call(arguments);if(!X.test(e)){bg=bj}if(bg&&typeof bg==="string"){bi=b.filter(bg,bi)}bi=this.length>1&&!ap[e]?b.unique(bi):bi;if((this.length>1||aY.test(bg))&&aj.test(e)){bi=bi.reverse()}return this.pushStack(bi,e,bh.join(","))}});b.extend({filter:function(bg,e,bf){if(bf){bg=":not("+bg+")"}return e.length===1?b.find.matchesSelector(e[0],bg)?[e[0]]:[]:b.find.matches(bg,e)},dir:function(bg,bf,bi){var e=[],bh=bg[bf];while(bh&&bh.nodeType!==9&&(bi===I||bh.nodeType!==1||!b(bh).is(bi))){if(bh.nodeType===1){e.push(bh)}bh=bh[bf]}return e},nth:function(bi,e,bg,bh){e=e||1;var bf=0;for(;bi;bi=bi[bg]){if(bi.nodeType===1&&++bf===e){break}}return bi},sibling:function(bg,bf){var e=[];for(;bg;bg=bg.nextSibling){if(bg.nodeType===1&&bg!==bf){e.push(bg)}}return e}});function aw(bh,bg,e){if(b.isFunction(bg)){return b.grep(bh,function(bj,bi){var bk=!!bg.call(bj,bi,bj);return bk===e})}else{if(bg.nodeType){return b.grep(bh,function(bj,bi){return(bj===bg)===e})}else{if(typeof bg==="string"){var bf=b.grep(bh,function(bi){return bi.nodeType===1});if(bb.test(bg)){return b.filter(bg,bf,!e)}else{bg=b.filter(bg,bf)}}}}return b.grep(bh,function(bj,bi){return(b.inArray(bj,bg)>=0)===e})}var ac=/ jQuery\d+="(?:\d+|null)"/g,ak=/^\s+/,P=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,d=/<([\w:]+)/,w=/<tbody/i,U=/<|&#?\w+;/,M=/<(?:script|object|embed|option|style)/i,n=/checked\s*(?:[^=]|=\s*.checked.)/i,ao={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};ao.optgroup=ao.option;ao.tbody=ao.tfoot=ao.colgroup=ao.caption=ao.thead;ao.th=ao.td;if(!b.support.htmlSerialize){ao._default=[1,"div<div>","</div>"]}b.fn.extend({text:function(e){if(b.isFunction(e)){return this.each(function(bg){var bf=b(this);bf.text(e.call(this,bg,bf.text()))})}if(typeof e!=="object"&&e!==I){return this.empty().append((this[0]&&this[0].ownerDocument||am).createTextNode(e))}return b.text(this)},wrapAll:function(e){if(b.isFunction(e)){return this.each(function(bg){b(this).wrapAll(e.call(this,bg))})}if(this[0]){var bf=b(e,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){bf.insertBefore(this[0])}bf.map(function(){var bg=this;while(bg.firstChild&&bg.firstChild.nodeType===1){bg=bg.firstChild}return bg}).append(this)}return this},wrapInner:function(e){if(b.isFunction(e)){return this.each(function(bf){b(this).wrapInner(e.call(this,bf))})}return this.each(function(){var bf=b(this),bg=bf.contents();if(bg.length){bg.wrapAll(e)}else{bf.append(e)}})},wrap:function(e){return this.each(function(){b(this).wrapAll(e)})},unwrap:function(){return this.parent().each(function(){if(!b.nodeName(this,"body")){b(this).replaceWith(this.childNodes)}}).end()},append:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.appendChild(e)}})},prepend:function(){return this.domManip(arguments,true,function(e){if(this.nodeType===1){this.insertBefore(e,this.firstChild)}})},before:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bf){this.parentNode.insertBefore(bf,this)})}else{if(arguments.length){var e=b(arguments[0]);e.push.apply(e,this.toArray());return this.pushStack(e,"before",arguments)}}},after:function(){if(this[0]&&this[0].parentNode){return this.domManip(arguments,false,function(bf){this.parentNode.insertBefore(bf,this.nextSibling)})}else{if(arguments.length){var e=this.pushStack(this,"after",arguments);e.push.apply(e,b(arguments[0]).toArray());return e}}},remove:function(e,bh){for(var bf=0,bg;(bg=this[bf])!=null;bf++){if(!e||b.filter(e,[bg]).length){if(!bh&&bg.nodeType===1){b.cleanData(bg.getElementsByTagName("*"));b.cleanData([bg])}if(bg.parentNode){bg.parentNode.removeChild(bg)}}}return this},empty:function(){for(var e=0,bf;(bf=this[e])!=null;e++){if(bf.nodeType===1){b.cleanData(bf.getElementsByTagName("*"))}while(bf.firstChild){bf.removeChild(bf.firstChild)}}return this},clone:function(bf,e){bf=bf==null?false:bf;e=e==null?bf:e;return this.map(function(){return b.clone(this,bf,e)})},html:function(bh){if(bh===I){return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(ac,""):null}else{if(typeof bh==="string"&&!M.test(bh)&&(b.support.leadingWhitespace||!ak.test(bh))&&!ao[(d.exec(bh)||["",""])[1].toLowerCase()]){bh=bh.replace(P,"<$1></$2>");try{for(var bg=0,bf=this.length;bg<bf;bg++){if(this[bg].nodeType===1){b.cleanData(this[bg].getElementsByTagName("*"));this[bg].innerHTML=bh}}}catch(bi){this.empty().append(bh)}}else{if(b.isFunction(bh)){this.each(function(bj){var e=b(this);e.html(bh.call(this,bj,e.html()))})}else{this.empty().append(bh)}}}return this},replaceWith:function(e){if(this[0]&&this[0].parentNode){if(b.isFunction(e)){return this.each(function(bh){var bg=b(this),bf=bg.html();bg.replaceWith(e.call(this,bh,bf))})}if(typeof e!=="string"){e=b(e).detach()}return this.each(function(){var bg=this.nextSibling,bf=this.parentNode;b(this).remove();if(bg){b(bg).before(e)}else{b(bf).append(e)}})}else{return this.length?this.pushStack(b(b.isFunction(e)?e():e),"replaceWith",e):this}},detach:function(e){return this.remove(e,true)},domManip:function(bl,bp,bo){var bh,bi,bk,bn,bm=bl[0],bf=[];if(!b.support.checkClone&&arguments.length===3&&typeof bm==="string"&&n.test(bm)){return this.each(function(){b(this).domManip(bl,bp,bo,true)})}if(b.isFunction(bm)){return this.each(function(br){var bq=b(this);bl[0]=bm.call(this,br,bp?bq.html():I);bq.domManip(bl,bp,bo)})}if(this[0]){bn=bm&&bm.parentNode;if(b.support.parentNode&&bn&&bn.nodeType===11&&bn.childNodes.length===this.length){bh={fragment:bn}}else{bh=b.buildFragment(bl,this,bf)}bk=bh.fragment;if(bk.childNodes.length===1){bi=bk=bk.firstChild}else{bi=bk.firstChild}if(bi){bp=bp&&b.nodeName(bi,"tr");for(var bg=0,e=this.length,bj=e-1;bg<e;bg++){bo.call(bp?aZ(this[bg],bi):this[bg],bh.cacheable||(e>1&&bg<bj)?b.clone(bk,true,true):bk)}}if(bf.length){b.each(bf,ba)}}return this}});function aZ(e,bf){return b.nodeName(e,"table")?(e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody"))):e}function t(e,bl){if(bl.nodeType!==1||!b.hasData(e)){return}var bk=b.expando,bh=b.data(e),bi=b.data(bl,bh);if((bh=bh[bk])){var bm=bh.events;bi=bi[bk]=b.extend({},bh);if(bm){delete bi.handle;bi.events={};for(var bj in bm){for(var bg=0,bf=bm[bj].length;bg<bf;bg++){b.event.add(bl,bj+(bm[bj][bg].namespace?".":"")+bm[bj][bg].namespace,bm[bj][bg],bm[bj][bg].data)}}}}}function ad(bf,e){if(e.nodeType!==1){return}var bg=e.nodeName.toLowerCase();e.clearAttributes();e.mergeAttributes(bf);if(bg==="object"){e.outerHTML=bf.outerHTML}else{if(bg==="input"&&(bf.type==="checkbox"||bf.type==="radio")){if(bf.checked){e.defaultChecked=e.checked=bf.checked}if(e.value!==bf.value){e.value=bf.value}}else{if(bg==="option"){e.selected=bf.defaultSelected}else{if(bg==="input"||bg==="textarea"){e.defaultValue=bf.defaultValue}}}}e.removeAttribute(b.expando)}b.buildFragment=function(bj,bh,bf){var bi,e,bg,bk=(bh&&bh[0]?bh[0].ownerDocument||bh[0]:am);if(bj.length===1&&typeof bj[0]==="string"&&bj[0].length<512&&bk===am&&bj[0].charAt(0)==="<"&&!M.test(bj[0])&&(b.support.checkClone||!n.test(bj[0]))){e=true;bg=b.fragments[bj[0]];if(bg){if(bg!==1){bi=bg}}}if(!bi){bi=bk.createDocumentFragment();b.clean(bj,bk,bi,bf)}if(e){b.fragments[bj[0]]=bg?bi:1}return{fragment:bi,cacheable:e}};b.fragments={};b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,bf){b.fn[e]=function(bg){var bj=[],bm=b(bg),bl=this.length===1&&this[0].parentNode;if(bl&&bl.nodeType===11&&bl.childNodes.length===1&&bm.length===1){bm[bf](this[0]);return this}else{for(var bk=0,bh=bm.length;bk<bh;bk++){var bi=(bk>0?this.clone(true):this).get();b(bm[bk])[bf](bi);bj=bj.concat(bi)}return this.pushStack(bj,e,bm.selector)}}});function a3(e){if("getElementsByTagName" in e){return e.getElementsByTagName("*")}else{if("querySelectorAll" in e){return e.querySelectorAll("*")}else{return[]}}}b.extend({clone:function(bi,bk,bg){var bj=bi.cloneNode(true),e,bf,bh;if((!b.support.noCloneEvent||!b.support.noCloneChecked)&&(bi.nodeType===1||bi.nodeType===11)&&!b.isXMLDoc(bi)){ad(bi,bj);e=a3(bi);bf=a3(bj);for(bh=0;e[bh];++bh){ad(e[bh],bf[bh])}}if(bk){t(bi,bj);if(bg){e=a3(bi);bf=a3(bj);for(bh=0;e[bh];++bh){t(e[bh],bf[bh])}}}return bj},clean:function(bg,bi,bp,bk){bi=bi||am;if(typeof bi.createElement==="undefined"){bi=bi.ownerDocument||bi[0]&&bi[0].ownerDocument||am}var bq=[];for(var bo=0,bj;(bj=bg[bo])!=null;bo++){if(typeof bj==="number"){bj+=""}if(!bj){continue}if(typeof bj==="string"&&!U.test(bj)){bj=bi.createTextNode(bj)}else{if(typeof bj==="string"){bj=bj.replace(P,"<$1></$2>");var br=(d.exec(bj)||["",""])[1].toLowerCase(),bh=ao[br]||ao._default,bn=bh[0],bf=bi.createElement("div");bf.innerHTML=bh[1]+bj+bh[2];while(bn--){bf=bf.lastChild}if(!b.support.tbody){var e=w.test(bj),bm=br==="table"&&!e?bf.firstChild&&bf.firstChild.childNodes:bh[1]==="<table>"&&!e?bf.childNodes:[];for(var bl=bm.length-1;bl>=0;--bl){if(b.nodeName(bm[bl],"tbody")&&!bm[bl].childNodes.length){bm[bl].parentNode.removeChild(bm[bl])}}}if(!b.support.leadingWhitespace&&ak.test(bj)){bf.insertBefore(bi.createTextNode(ak.exec(bj)[0]),bf.firstChild)}bj=bf.childNodes}}if(bj.nodeType){bq.push(bj)}else{bq=b.merge(bq,bj)}}if(bp){for(bo=0;bq[bo];bo++){if(bk&&b.nodeName(bq[bo],"script")&&(!bq[bo].type||bq[bo].type.toLowerCase()==="text/javascript")){bk.push(bq[bo].parentNode?bq[bo].parentNode.removeChild(bq[bo]):bq[bo])}else{if(bq[bo].nodeType===1){bq.splice.apply(bq,[bo+1,0].concat(b.makeArray(bq[bo].getElementsByTagName("script"))))}bp.appendChild(bq[bo])}}}return bq},cleanData:function(bf){var bi,bg,e=b.cache,bn=b.expando,bl=b.event.special,bk=b.support.deleteExpando;for(var bj=0,bh;(bh=bf[bj])!=null;bj++){if(bh.nodeName&&b.noData[bh.nodeName.toLowerCase()]){continue}bg=bh[b.expando];if(bg){bi=e[bg]&&e[bg][bn];if(bi&&bi.events){for(var bm in bi.events){if(bl[bm]){b.event.remove(bh,bm)}else{b.removeEvent(bh,bm,bi.handle)}}if(bi.handle){bi.handle.elem=null}}if(bk){delete bh[b.expando]}else{if(bh.removeAttribute){bh.removeAttribute(b.expando)}}delete e[bg]}}}});function ba(e,bf){if(bf.src){b.ajax({url:bf.src,async:false,dataType:"script"})}else{b.globalEval(bf.text||bf.textContent||bf.innerHTML||"")}if(bf.parentNode){bf.parentNode.removeChild(bf)}}var af=/alpha\([^)]*\)/i,al=/opacity=([^)]*)/,aO=/-([a-z])/ig,z=/([A-Z]|^ms)/g,a1=/^-?\d+(?:px)?$/i,a9=/^-?\d/,aX={position:"absolute",visibility:"hidden",display:"block"},ah=["Left","Right"],aT=["Top","Bottom"],V,az,aN,m=function(e,bf){return bf.toUpperCase()};b.fn.css=function(e,bf){if(arguments.length===2&&bf===I){return this}return b.access(this,e,bf,true,function(bh,bg,bi){return bi!==I?b.style(bh,bg,bi):b.css(bh,bg)})};b.extend({cssHooks:{opacity:{get:function(bg,bf){if(bf){var e=V(bg,"opacity","opacity");return e===""?"1":e}else{return bg.style.opacity}}}},cssNumber:{zIndex:true,fontWeight:true,opacity:true,zoom:true,lineHeight:true},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(bh,bg,bm,bi){if(!bh||bh.nodeType===3||bh.nodeType===8||!bh.style){return}var bl,bj=b.camelCase(bg),bf=bh.style,bn=b.cssHooks[bj];bg=b.cssProps[bj]||bj;if(bm!==I){if(typeof bm==="number"&&isNaN(bm)||bm==null){return}if(typeof bm==="number"&&!b.cssNumber[bj]){bm+="px"}if(!bn||!("set" in bn)||(bm=bn.set(bh,bm))!==I){try{bf[bg]=bm}catch(bk){}}}else{if(bn&&"get" in bn&&(bl=bn.get(bh,false,bi))!==I){return bl}return bf[bg]}},css:function(bj,bi,bf){var bh,bg=b.camelCase(bi),e=b.cssHooks[bg];bi=b.cssProps[bg]||bg;if(e&&"get" in e&&(bh=e.get(bj,true,bf))!==I){return bh}else{if(V){return V(bj,bi,bg)}}},swap:function(bh,bg,bi){var e={};for(var bf in bg){e[bf]=bh.style[bf];bh.style[bf]=bg[bf]}bi.call(bh);for(bf in bg){bh.style[bf]=e[bf]}},camelCase:function(e){return e.replace(aO,m)}});b.curCSS=b.css;b.each(["height","width"],function(bf,e){b.cssHooks[e]={get:function(bi,bh,bg){var bj;if(bh){if(bi.offsetWidth!==0){bj=p(bi,e,bg)}else{b.swap(bi,aX,function(){bj=p(bi,e,bg)})}if(bj<=0){bj=V(bi,e,e);if(bj==="0px"&&aN){bj=aN(bi,e,e)}if(bj!=null){return bj===""||bj==="auto"?"0px":bj}}if(bj<0||bj==null){bj=bi.style[e];return bj===""||bj==="auto"?"0px":bj}return typeof bj==="string"?bj:bj+"px"}},set:function(bg,bh){if(a1.test(bh)){bh=parseFloat(bh);if(bh>=0){return bh+"px"}}else{return bh}}}});if(!b.support.opacity){b.cssHooks.opacity={get:function(bf,e){return al.test((e&&bf.currentStyle?bf.currentStyle.filter:bf.style.filter)||"")?(parseFloat(RegExp.$1)/100)+"":e?"1":""},set:function(bh,bi){var bg=bh.style;bg.zoom=1;var e=b.isNaN(bi)?"":"alpha(opacity="+bi*100+")",bf=bg.filter||"";bg.filter=af.test(bf)?bf.replace(af,e):bg.filter+" "+e}}}b(function(){if(!b.support.reliableMarginRight){b.cssHooks.marginRight={get:function(bg,bf){var e;b.swap(bg,{display:"inline-block"},function(){if(bf){e=V(bg,"margin-right","marginRight")}else{e=bg.style.marginRight}});return e}}}});if(am.defaultView&&am.defaultView.getComputedStyle){az=function(bj,e,bh){var bg,bi,bf;bh=bh.replace(z,"-$1").toLowerCase();if(!(bi=bj.ownerDocument.defaultView)){return I}if((bf=bi.getComputedStyle(bj,null))){bg=bf.getPropertyValue(bh);if(bg===""&&!b.contains(bj.ownerDocument.documentElement,bj)){bg=b.style(bj,bh)}}return bg}}if(am.documentElement.currentStyle){aN=function(bi,bg){var bj,bf=bi.currentStyle&&bi.currentStyle[bg],e=bi.runtimeStyle&&bi.runtimeStyle[bg],bh=bi.style;if(!a1.test(bf)&&a9.test(bf)){bj=bh.left;if(e){bi.runtimeStyle.left=bi.currentStyle.left}bh.left=bg==="fontSize"?"1em":(bf||0);bf=bh.pixelLeft+"px";bh.left=bj;if(e){bi.runtimeStyle.left=e}}return bf===""?"auto":bf}}V=az||aN;function p(bg,bf,e){var bi=bf==="width"?ah:aT,bh=bf==="width"?bg.offsetWidth:bg.offsetHeight;if(e==="border"){return bh}b.each(bi,function(){if(!e){bh-=parseFloat(b.css(bg,"padding"+this))||0}if(e==="margin"){bh+=parseFloat(b.css(bg,"margin"+this))||0}else{bh-=parseFloat(b.css(bg,"border"+this+"Width"))||0}});return bh}if(b.expr&&b.expr.filters){b.expr.filters.hidden=function(bg){var bf=bg.offsetWidth,e=bg.offsetHeight;return(bf===0&&e===0)||(!b.support.reliableHiddenOffsets&&(bg.style.display||b.css(bg,"display"))==="none")};b.expr.filters.visible=function(e){return !b.expr.filters.hidden(e)}}var j=/%20/g,ai=/\[\]$/,be=/\r?\n/g,bc=/#.*$/,at=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,aQ=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,aD=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,aF=/^(?:GET|HEAD)$/,c=/^\/\//,J=/\?/,aW=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,q=/^(?:select|textarea)/i,h=/\s+/,bd=/([?&])_=[^&]*/,S=/(^|\-)([a-z])/g,aL=function(bf,e,bg){return e+bg.toUpperCase()},H=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,A=b.fn.load,W={},r={},av,s;try{av=am.location.href}catch(an){av=am.createElement("a");av.href="";av=av.href}s=H.exec(av.toLowerCase())||[];function f(e){return function(bi,bk){if(typeof bi!=="string"){bk=bi;bi="*"}if(b.isFunction(bk)){var bh=bi.toLowerCase().split(h),bg=0,bj=bh.length,bf,bl,bm;for(;bg<bj;bg++){bf=bh[bg];bm=/^\+/.test(bf);if(bm){bf=bf.substr(1)||"*"}bl=e[bf]=e[bf]||[];bl[bm?"unshift":"push"](bk)}}}}function aK(bf,bo,bj,bn,bl,bh){bl=bl||bo.dataTypes[0];bh=bh||{};bh[bl]=true;var bk=bf[bl],bg=0,e=bk?bk.length:0,bi=(bf===W),bm;for(;bg<e&&(bi||!bm);bg++){bm=bk[bg](bo,bj,bn);if(typeof bm==="string"){if(!bi||bh[bm]){bm=I}else{bo.dataTypes.unshift(bm);bm=aK(bf,bo,bj,bn,bm,bh)}}}if((bi||!bm)&&!bh["*"]){bm=aK(bf,bo,bj,bn,"*",bh)}return bm}b.fn.extend({load:function(bg,bj,bk){if(typeof bg!=="string"&&A){return A.apply(this,arguments)}else{if(!this.length){return this}}var bi=bg.indexOf(" ");if(bi>=0){var e=bg.slice(bi,bg.length);bg=bg.slice(0,bi)}var bh="GET";if(bj){if(b.isFunction(bj)){bk=bj;bj=I}else{if(typeof bj==="object"){bj=b.param(bj,b.ajaxSettings.traditional);bh="POST"}}}var bf=this;b.ajax({url:bg,type:bh,dataType:"html",data:bj,complete:function(bm,bl,bn){bn=bm.responseText;if(bm.isResolved()){bm.done(function(bo){bn=bo});bf.html(e?b("<div>").append(bn.replace(aW,"")).find(e):bn)}if(bk){bf.each(bk,[bn,bl,bm])}}});return this},serialize:function(){return b.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?b.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||q.test(this.nodeName)||aQ.test(this.type))}).map(function(e,bf){var bg=b(this).val();return bg==null?null:b.isArray(bg)?b.map(bg,function(bi,bh){return{name:bf.name,value:bi.replace(be,"\r\n")}}):{name:bf.name,value:bg.replace(be,"\r\n")}}).get()}});b.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(e,bf){b.fn[bf]=function(bg){return this.bind(bf,bg)}});b.each(["get","post"],function(e,bf){b[bf]=function(bg,bi,bj,bh){if(b.isFunction(bi)){bh=bh||bj;bj=bi;bi=I}return b.ajax({type:bf,url:bg,data:bi,success:bj,dataType:bh})}});b.extend({getScript:function(e,bf){return b.get(e,I,bf,"script")},getJSON:function(e,bf,bg){return b.get(e,bf,bg,"json")},ajaxSetup:function(bg,e){if(!e){e=bg;bg=b.extend(true,b.ajaxSettings,e)}else{b.extend(true,bg,b.ajaxSettings,e)}for(var bf in {context:1,url:1}){if(bf in e){bg[bf]=e[bf]}else{if(bf in b.ajaxSettings){bg[bf]=b.ajaxSettings[bf]}}}return bg},ajaxSettings:{url:av,isLocal:aD.test(s[1]),global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a0.String,"text html":true,"text json":b.parseJSON,"text xml":b.parseXML}},ajaxPrefilter:f(W),ajaxTransport:f(r),ajax:function(bj,bh){if(typeof bj==="object"){bh=bj;bj=I}bh=bh||{};var bn=b.ajaxSetup({},bh),bB=bn.context||bn,bq=bB!==bn&&(bB.nodeType||bB instanceof b)?b(bB):b.event,bA=b.Deferred(),bx=b._Deferred(),bl=bn.statusCode||{},bm,br={},bz,bi,bv,bo,bs,bk=0,bg,bu,bt={readyState:0,setRequestHeader:function(e,bC){if(!bk){br[e.toLowerCase().replace(S,aL)]=bC}return this},getAllResponseHeaders:function(){return bk===2?bz:null},getResponseHeader:function(bC){var e;if(bk===2){if(!bi){bi={};while((e=at.exec(bz))){bi[e[1].toLowerCase()]=e[2]}}e=bi[bC.toLowerCase()]}return e===I?null:e},overrideMimeType:function(e){if(!bk){bn.mimeType=e}return this},abort:function(e){e=e||"abort";if(bv){bv.abort(e)}bp(0,e);return this}};function bp(bH,bF,bI,bE){if(bk===2){return}bk=2;if(bo){clearTimeout(bo)}bv=I;bz=bE||"";bt.readyState=bH?4:0;var bC,bM,bL,bG=bI?a6(bn,bt,bI):I,bD,bK;if(bH>=200&&bH<300||bH===304){if(bn.ifModified){if((bD=bt.getResponseHeader("Last-Modified"))){b.lastModified[bm]=bD}if((bK=bt.getResponseHeader("Etag"))){b.etag[bm]=bK}}if(bH===304){bF="notmodified";bC=true}else{try{bM=E(bn,bG);bF="success";bC=true}catch(bJ){bF="parsererror";bL=bJ}}}else{bL=bF;if(!bF||bH){bF="error";if(bH<0){bH=0}}}bt.status=bH;bt.statusText=bF;if(bC){bA.resolveWith(bB,[bM,bF,bt])}else{bA.rejectWith(bB,[bt,bF,bL])}bt.statusCode(bl);bl=I;if(bg){bq.trigger("ajax"+(bC?"Success":"Error"),[bt,bn,bC?bM:bL])}bx.resolveWith(bB,[bt,bF]);if(bg){bq.trigger("ajaxComplete",[bt,bn]);if(!(--b.active)){b.event.trigger("ajaxStop")}}}bA.promise(bt);bt.success=bt.done;bt.error=bt.fail;bt.complete=bx.done;bt.statusCode=function(bC){if(bC){var e;if(bk<2){for(e in bC){bl[e]=[bl[e],bC[e]]}}else{e=bC[bt.status];bt.then(e,e)}}return this};bn.url=((bj||bn.url)+"").replace(bc,"").replace(c,s[1]+"//");bn.dataTypes=b.trim(bn.dataType||"*").toLowerCase().split(h);if(bn.crossDomain==null){bs=H.exec(bn.url.toLowerCase());bn.crossDomain=!!(bs&&(bs[1]!=s[1]||bs[2]!=s[2]||(bs[3]||(bs[1]==="http:"?80:443))!=(s[3]||(s[1]==="http:"?80:443))))}if(bn.data&&bn.processData&&typeof bn.data!=="string"){bn.data=b.param(bn.data,bn.traditional)}aK(W,bn,bh,bt);if(bk===2){return false}bg=bn.global;bn.type=bn.type.toUpperCase();bn.hasContent=!aF.test(bn.type);if(bg&&b.active++===0){b.event.trigger("ajaxStart")}if(!bn.hasContent){if(bn.data){bn.url+=(J.test(bn.url)?"&":"?")+bn.data}bm=bn.url;if(bn.cache===false){var bf=b.now(),by=bn.url.replace(bd,"$1_="+bf);bn.url=by+((by===bn.url)?(J.test(bn.url)?"&":"?")+"_="+bf:"")}}if(bn.data&&bn.hasContent&&bn.contentType!==false||bh.contentType){br["Content-Type"]=bn.contentType}if(bn.ifModified){bm=bm||bn.url;if(b.lastModified[bm]){br["If-Modified-Since"]=b.lastModified[bm]}if(b.etag[bm]){br["If-None-Match"]=b.etag[bm]}}br.Accept=bn.dataTypes[0]&&bn.accepts[bn.dataTypes[0]]?bn.accepts[bn.dataTypes[0]]+(bn.dataTypes[0]!=="*"?", */*; q=0.01":""):bn.accepts["*"];for(bu in bn.headers){bt.setRequestHeader(bu,bn.headers[bu])}if(bn.beforeSend&&(bn.beforeSend.call(bB,bt,bn)===false||bk===2)){bt.abort();return false}for(bu in {success:1,error:1,complete:1}){bt[bu](bn[bu])}bv=aK(r,bn,bh,bt);if(!bv){bp(-1,"No Transport")}else{bt.readyState=1;if(bg){bq.trigger("ajaxSend",[bt,bn])}if(bn.async&&bn.timeout>0){bo=setTimeout(function(){bt.abort("timeout")},bn.timeout)}try{bk=1;bv.send(br,bp)}catch(bw){if(status<2){bp(-1,bw)}else{b.error(bw)}}}return bt},param:function(e,bg){var bf=[],bi=function(bj,bk){bk=b.isFunction(bk)?bk():bk;bf[bf.length]=encodeURIComponent(bj)+"="+encodeURIComponent(bk)};if(bg===I){bg=b.ajaxSettings.traditional}if(b.isArray(e)||(e.jquery&&!b.isPlainObject(e))){b.each(e,function(){bi(this.name,this.value)})}else{for(var bh in e){v(bh,e[bh],bg,bi)}}return bf.join("&").replace(j,"+")}});function v(bg,bi,bf,bh){if(b.isArray(bi)&&bi.length){b.each(bi,function(bk,bj){if(bf||ai.test(bg)){bh(bg,bj)}else{v(bg+"["+(typeof bj==="object"||b.isArray(bj)?bk:"")+"]",bj,bf,bh)}})}else{if(!bf&&bi!=null&&typeof bi==="object"){if(b.isArray(bi)||b.isEmptyObject(bi)){bh(bg,"")}else{for(var e in bi){v(bg+"["+e+"]",bi[e],bf,bh)}}}else{bh(bg,bi)}}}b.extend({active:0,lastModified:{},etag:{}});function a6(bn,bm,bj){var bf=bn.contents,bl=bn.dataTypes,bg=bn.responseFields,bi,bk,bh,e;for(bk in bg){if(bk in bj){bm[bg[bk]]=bj[bk]}}while(bl[0]==="*"){bl.shift();if(bi===I){bi=bn.mimeType||bm.getResponseHeader("content-type")}}if(bi){for(bk in bf){if(bf[bk]&&bf[bk].test(bi)){bl.unshift(bk);break}}}if(bl[0] in bj){bh=bl[0]}else{for(bk in bj){if(!bl[0]||bn.converters[bk+" "+bl[0]]){bh=bk;break}if(!e){e=bk}}bh=bh||e}if(bh){if(bh!==bl[0]){bl.unshift(bh)}return bj[bh]}}function E(br,bj){if(br.dataFilter){bj=br.dataFilter(bj,br.dataType)}var bn=br.dataTypes,bq={},bk,bo,bg=bn.length,bl,bm=bn[0],bh,bi,bp,bf,e;for(bk=1;bk<bg;bk++){if(bk===1){for(bo in br.converters){if(typeof bo==="string"){bq[bo.toLowerCase()]=br.converters[bo]}}}bh=bm;bm=bn[bk];if(bm==="*"){bm=bh}else{if(bh!=="*"&&bh!==bm){bi=bh+" "+bm;bp=bq[bi]||bq["* "+bm];if(!bp){e=I;for(bf in bq){bl=bf.split(" ");if(bl[0]===bh||bl[0]==="*"){e=bq[bl[1]+" "+bm];if(e){bf=bq[bf];if(bf===true){bp=e}else{if(e===true){bp=bf}}break}}}}if(!(bp||e)){b.error("No conversion from "+bi.replace(" "," to "))}if(bp!==true){bj=bp?bp(bj):e(bf(bj))}}}}return bj}var ar=b.now(),u=/(\=)\?(&|$)|\?\?/i;b.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return b.expando+"_"+(ar++)}});b.ajaxPrefilter("json jsonp",function(bo,bk,bn){var bm=(typeof bo.data==="string");if(bo.dataTypes[0]==="jsonp"||bk.jsonpCallback||bk.jsonp!=null||bo.jsonp!==false&&(u.test(bo.url)||bm&&u.test(bo.data))){var bl,bg=bo.jsonpCallback=b.isFunction(bo.jsonpCallback)?bo.jsonpCallback():bo.jsonpCallback,bj=a0[bg],e=bo.url,bi=bo.data,bf="$1"+bg+"$2",bh=function(){a0[bg]=bj;if(bl&&b.isFunction(bj)){a0[bg](bl[0])}};if(bo.jsonp!==false){e=e.replace(u,bf);if(bo.url===e){if(bm){bi=bi.replace(u,bf)}if(bo.data===bi){e+=(/\?/.test(e)?"&":"?")+bo.jsonp+"="+bg}}}bo.url=e;bo.data=bi;a0[bg]=function(bp){bl=[bp]};bn.then(bh,bh);bo.converters["script json"]=function(){if(!bl){b.error(bg+" was not called")}return bl[0]};bo.dataTypes[0]="json";return"script"}});b.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(e){b.globalEval(e);return e}}});b.ajaxPrefilter("script",function(e){if(e.cache===I){e.cache=false}if(e.crossDomain){e.type="GET";e.global=false}});b.ajaxTransport("script",function(bg){if(bg.crossDomain){var e,bf=am.head||am.getElementsByTagName("head")[0]||am.documentElement;return{send:function(bh,bi){e=am.createElement("script");e.async="async";if(bg.scriptCharset){e.charset=bg.scriptCharset}e.src=bg.url;e.onload=e.onreadystatechange=function(bk,bj){if(!e.readyState||/loaded|complete/.test(e.readyState)){e.onload=e.onreadystatechange=null;if(bf&&e.parentNode){bf.removeChild(e)}e=I;if(!bj){bi(200,"success")}}};bf.insertBefore(e,bf.firstChild)},abort:function(){if(e){e.onload(0,1)}}}}});var y=b.now(),K,au;function B(){b(a0).unload(function(){for(var e in K){K[e](0,1)}})}function aC(){try{return new a0.XMLHttpRequest()}catch(bf){}}function ae(){try{return new a0.ActiveXObject("Microsoft.XMLHTTP")}catch(bf){}}b.ajaxSettings.xhr=a0.ActiveXObject?function(){return !this.isLocal&&aC()||ae()}:aC;au=b.ajaxSettings.xhr();b.support.ajax=!!au;b.support.cors=au&&("withCredentials" in au);au=I;if(b.support.ajax){b.ajaxTransport(function(e){if(!e.crossDomain||b.support.cors){var bf;return{send:function(bl,bg){var bk=e.xhr(),bj,bi;if(e.username){bk.open(e.type,e.url,e.async,e.username,e.password)}else{bk.open(e.type,e.url,e.async)}if(e.xhrFields){for(bi in e.xhrFields){bk[bi]=e.xhrFields[bi]}}if(e.mimeType&&bk.overrideMimeType){bk.overrideMimeType(e.mimeType)}if(!e.crossDomain&&!bl["X-Requested-With"]){bl["X-Requested-With"]="XMLHttpRequest"}try{for(bi in bl){bk.setRequestHeader(bi,bl[bi])}}catch(bh){}bk.send((e.hasContent&&e.data)||null);bf=function(bu,bo){var bp,bn,bm,bs,br;try{if(bf&&(bo||bk.readyState===4)){bf=I;if(bj){bk.onreadystatechange=b.noop;delete K[bj]}if(bo){if(bk.readyState!==4){bk.abort()}}else{bp=bk.status;bm=bk.getAllResponseHeaders();bs={};br=bk.responseXML;if(br&&br.documentElement){bs.xml=br}bs.text=bk.responseText;try{bn=bk.statusText}catch(bt){bn=""}if(!bp&&e.isLocal&&!e.crossDomain){bp=bs.text?200:404}else{if(bp===1223){bp=204}}}}}catch(bq){if(!bo){bg(-1,bq)}}if(bs){bg(bp,bn,bs,bm)}};if(!e.async||bk.readyState===4){bf()}else{if(!K){K={};B()}bj=y++;bk.onreadystatechange=K[bj]=bf}},abort:function(){if(bf){bf(0,1)}}}}})}var O={},aq=/^(?:toggle|show|hide)$/,aH=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,aU,ay=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];b.fn.extend({show:function(bh,bk,bj){var bg,bi;if(bh||bh===0){return this.animate(aS("show",3),bh,bk,bj)}else{for(var bf=0,e=this.length;bf<e;bf++){bg=this[bf];bi=bg.style.display;if(!b._data(bg,"olddisplay")&&bi==="none"){bi=bg.style.display=""}if(bi===""&&b.css(bg,"display")==="none"){b._data(bg,"olddisplay",x(bg.nodeName))}}for(bf=0;bf<e;bf++){bg=this[bf];bi=bg.style.display;if(bi===""||bi==="none"){bg.style.display=b._data(bg,"olddisplay")||""}}return this}},hide:function(bg,bj,bi){if(bg||bg===0){return this.animate(aS("hide",3),bg,bj,bi)}else{for(var bf=0,e=this.length;bf<e;bf++){var bh=b.css(this[bf],"display");if(bh!=="none"&&!b._data(this[bf],"olddisplay")){b._data(this[bf],"olddisplay",bh)}}for(bf=0;bf<e;bf++){this[bf].style.display="none"}return this}},_toggle:b.fn.toggle,toggle:function(bg,bf,bh){var e=typeof bg==="boolean";if(b.isFunction(bg)&&b.isFunction(bf)){this._toggle.apply(this,arguments)}else{if(bg==null||e){this.each(function(){var bi=e?bg:b(this).is(":hidden");b(this)[bi?"show":"hide"]()})}else{this.animate(aS("toggle",3),bg,bf,bh)}}return this},fadeTo:function(e,bh,bg,bf){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:bh},e,bg,bf)},animate:function(bi,bf,bh,bg){var e=b.speed(bf,bh,bg);if(b.isEmptyObject(bi)){return this.each(e.complete)}return this[e.queue===false?"each":"queue"](function(){var bl=b.extend({},e),bp,bm=this.nodeType===1,bn=bm&&b(this).is(":hidden"),bj=this;for(bp in bi){var bk=b.camelCase(bp);if(bp!==bk){bi[bk]=bi[bp];delete bi[bp];bp=bk}if(bi[bp]==="hide"&&bn||bi[bp]==="show"&&!bn){return bl.complete.call(this)}if(bm&&(bp==="height"||bp==="width")){bl.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY];if(b.css(this,"display")==="inline"&&b.css(this,"float")==="none"){if(!b.support.inlineBlockNeedsLayout){this.style.display="inline-block"}else{var bo=x(this.nodeName);if(bo==="inline"){this.style.display="inline-block"}else{this.style.display="inline";this.style.zoom=1}}}}if(b.isArray(bi[bp])){(bl.specialEasing=bl.specialEasing||{})[bp]=bi[bp][1];bi[bp]=bi[bp][0]}}if(bl.overflow!=null){this.style.overflow="hidden"}bl.curAnim=b.extend({},bi);b.each(bi,function(br,bv){var bu=new b.fx(bj,bl,br);if(aq.test(bv)){bu[bv==="toggle"?bn?"show":"hide":bv](bi)}else{var bt=aH.exec(bv),bw=bu.cur();if(bt){var bq=parseFloat(bt[2]),bs=bt[3]||(b.cssNumber[br]?"":"px");if(bs!=="px"){b.style(bj,br,(bq||1)+bs);bw=((bq||1)/bu.cur())*bw;b.style(bj,br,bw+bs)}if(bt[1]){bq=((bt[1]==="-="?-1:1)*bq)+bw}bu.custom(bw,bq,bs)}else{bu.custom(bw,bv,"")}}});return true})},stop:function(bf,e){var bg=b.timers;if(bf){this.queue([])}this.each(function(){for(var bh=bg.length-1;bh>=0;bh--){if(bg[bh].elem===this){if(e){bg[bh](true)}bg.splice(bh,1)}}});if(!e){this.dequeue()}return this}});function aS(bf,e){var bg={};b.each(ay.concat.apply([],ay.slice(0,e)),function(){bg[this]=bf});return bg}b.each({slideDown:aS("show",1),slideUp:aS("hide",1),slideToggle:aS("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,bf){b.fn[e]=function(bg,bi,bh){return this.animate(bf,bg,bi,bh)}});b.extend({speed:function(bg,bh,bf){var e=bg&&typeof bg==="object"?b.extend({},bg):{complete:bf||!bf&&bh||b.isFunction(bg)&&bg,duration:bg,easing:bf&&bh||bh&&!b.isFunction(bh)&&bh};e.duration=b.fx.off?0:typeof e.duration==="number"?e.duration:e.duration in b.fx.speeds?b.fx.speeds[e.duration]:b.fx.speeds._default;e.old=e.complete;e.complete=function(){if(e.queue!==false){b(this).dequeue()}if(b.isFunction(e.old)){e.old.call(this)}};return e},easing:{linear:function(bg,bh,e,bf){return e+bf*bg},swing:function(bg,bh,e,bf){return((-Math.cos(bg*Math.PI)/2)+0.5)*bf+e}},timers:[],fx:function(bf,e,bg){this.options=e;this.elem=bf;this.prop=bg;if(!e.orig){e.orig={}}}});b.fx.prototype={update:function(){if(this.options.step){this.options.step.call(this.elem,this.now,this)}(b.fx.step[this.prop]||b.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null)){return this.elem[this.prop]}var e,bf=b.css(this.elem,this.prop);return isNaN(e=parseFloat(bf))?!bf||bf==="auto"?0:bf:e},custom:function(bj,bi,bh){var e=this,bg=b.fx;this.startTime=b.now();this.start=bj;this.end=bi;this.unit=bh||this.unit||(b.cssNumber[this.prop]?"":"px");this.now=this.start;this.pos=this.state=0;function bf(bk){return e.step(bk)}bf.elem=this.elem;if(bf()&&b.timers.push(bf)&&!aU){aU=setInterval(bg.tick,bg.interval)}},show:function(){this.options.orig[this.prop]=b.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());b(this.elem).show()},hide:function(){this.options.orig[this.prop]=b.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(bh){var bm=b.now(),bi=true;if(bh||bm>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var bj in this.options.curAnim){if(this.options.curAnim[bj]!==true){bi=false}}if(bi){if(this.options.overflow!=null&&!b.support.shrinkWrapBlocks){var bg=this.elem,bn=this.options;b.each(["","X","Y"],function(bo,bp){bg.style["overflow"+bp]=bn.overflow[bo]})}if(this.options.hide){b(this.elem).hide()}if(this.options.hide||this.options.show){for(var e in this.options.curAnim){b.style(this.elem,e,this.options.orig[e])}}this.options.complete.call(this.elem)}return false}else{var bf=bm-this.startTime;this.state=bf/this.options.duration;var bk=this.options.specialEasing&&this.options.specialEasing[this.prop];var bl=this.options.easing||(b.easing.swing?"swing":"linear");this.pos=b.easing[bk||bl](this.state,bf,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update()}return true}};b.extend(b.fx,{tick:function(){var bf=b.timers;for(var e=0;e<bf.length;e++){if(!bf[e]()){bf.splice(e--,1)}}if(!bf.length){b.fx.stop()}},interval:13,stop:function(){clearInterval(aU);aU=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(e){b.style(e.elem,"opacity",e.now)},_default:function(e){if(e.elem.style&&e.elem.style[e.prop]!=null){e.elem.style[e.prop]=(e.prop==="width"||e.prop==="height"?Math.max(0,e.now):e.now)+e.unit}else{e.elem[e.prop]=e.now}}}});if(b.expr&&b.expr.filters){b.expr.filters.animated=function(e){return b.grep(b.timers,function(bf){return e===bf.elem}).length}}function x(bg){if(!O[bg]){var e=b("<"+bg+">").appendTo("body"),bf=e.css("display");e.remove();if(bf==="none"||bf===""){bf="block"}O[bg]=bf}return O[bg]}var T=/^t(?:able|d|h)$/i,Z=/^(?:body|html)$/i;if("getBoundingClientRect" in am.documentElement){b.fn.offset=function(bs){var bi=this[0],bl;if(bs){return this.each(function(e){b.offset.setOffset(this,bs,e)})}if(!bi||!bi.ownerDocument){return null}if(bi===bi.ownerDocument.body){return b.offset.bodyOffset(bi)}try{bl=bi.getBoundingClientRect()}catch(bp){}var br=bi.ownerDocument,bg=br.documentElement;if(!bl||!b.contains(bg,bi)){return bl?{top:bl.top,left:bl.left}:{top:0,left:0}}var bm=br.body,bn=aB(br),bk=bg.clientTop||bm.clientTop||0,bo=bg.clientLeft||bm.clientLeft||0,bf=bn.pageYOffset||b.support.boxModel&&bg.scrollTop||bm.scrollTop,bj=bn.pageXOffset||b.support.boxModel&&bg.scrollLeft||bm.scrollLeft,bq=bl.top+bf-bk,bh=bl.left+bj-bo;return{top:bq,left:bh}}}else{b.fn.offset=function(bp){var bj=this[0];if(bp){return this.each(function(bq){b.offset.setOffset(this,bp,bq)})}if(!bj||!bj.ownerDocument){return null}if(bj===bj.ownerDocument.body){return b.offset.bodyOffset(bj)}b.offset.initialize();var bm,bg=bj.offsetParent,bf=bj,bo=bj.ownerDocument,bh=bo.documentElement,bk=bo.body,bl=bo.defaultView,e=bl?bl.getComputedStyle(bj,null):bj.currentStyle,bn=bj.offsetTop,bi=bj.offsetLeft;while((bj=bj.parentNode)&&bj!==bk&&bj!==bh){if(b.offset.supportsFixedPosition&&e.position==="fixed"){break}bm=bl?bl.getComputedStyle(bj,null):bj.currentStyle;bn-=bj.scrollTop;bi-=bj.scrollLeft;if(bj===bg){bn+=bj.offsetTop;bi+=bj.offsetLeft;if(b.offset.doesNotAddBorder&&!(b.offset.doesAddBorderForTableAndCells&&T.test(bj.nodeName))){bn+=parseFloat(bm.borderTopWidth)||0;bi+=parseFloat(bm.borderLeftWidth)||0}bf=bg;bg=bj.offsetParent}if(b.offset.subtractsBorderForOverflowNotVisible&&bm.overflow!=="visible"){bn+=parseFloat(bm.borderTopWidth)||0;bi+=parseFloat(bm.borderLeftWidth)||0}e=bm}if(e.position==="relative"||e.position==="static"){bn+=bk.offsetTop;bi+=bk.offsetLeft}if(b.offset.supportsFixedPosition&&e.position==="fixed"){bn+=Math.max(bh.scrollTop,bk.scrollTop);bi+=Math.max(bh.scrollLeft,bk.scrollLeft)}return{top:bn,left:bi}}}b.offset={initialize:function(){var e=am.body,bf=am.createElement("div"),bi,bk,bj,bl,bg=parseFloat(b.css(e,"marginTop"))||0,bh="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";b.extend(bf.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});bf.innerHTML=bh;e.insertBefore(bf,e.firstChild);bi=bf.firstChild;bk=bi.firstChild;bl=bi.nextSibling.firstChild.firstChild;this.doesNotAddBorder=(bk.offsetTop!==5);this.doesAddBorderForTableAndCells=(bl.offsetTop===5);bk.style.position="fixed";bk.style.top="20px";this.supportsFixedPosition=(bk.offsetTop===20||bk.offsetTop===15);bk.style.position=bk.style.top="";bi.style.overflow="hidden";bi.style.position="relative";this.subtractsBorderForOverflowNotVisible=(bk.offsetTop===-5);this.doesNotIncludeMarginInBodyOffset=(e.offsetTop!==bg);e.removeChild(bf);b.offset.initialize=b.noop},bodyOffset:function(e){var bg=e.offsetTop,bf=e.offsetLeft;b.offset.initialize();if(b.offset.doesNotIncludeMarginInBodyOffset){bg+=parseFloat(b.css(e,"marginTop"))||0;bf+=parseFloat(b.css(e,"marginLeft"))||0}return{top:bg,left:bf}},setOffset:function(bh,bq,bk){var bl=b.css(bh,"position");if(bl==="static"){bh.style.position="relative"}var bj=b(bh),bf=bj.offset(),e=b.css(bh,"top"),bo=b.css(bh,"left"),bp=(bl==="absolute"||bl==="fixed")&&b.inArray("auto",[e,bo])>-1,bn={},bm={},bg,bi;if(bp){bm=bj.position()}bg=bp?bm.top:parseInt(e,10)||0;bi=bp?bm.left:parseInt(bo,10)||0;if(b.isFunction(bq)){bq=bq.call(bh,bk,bf)}if(bq.top!=null){bn.top=(bq.top-bf.top)+bg}if(bq.left!=null){bn.left=(bq.left-bf.left)+bi}if("using" in bq){bq.using.call(bh,bn)}else{bj.css(bn)}}};b.fn.extend({position:function(){if(!this[0]){return null}var bg=this[0],bf=this.offsetParent(),bh=this.offset(),e=Z.test(bf[0].nodeName)?{top:0,left:0}:bf.offset();bh.top-=parseFloat(b.css(bg,"marginTop"))||0;bh.left-=parseFloat(b.css(bg,"marginLeft"))||0;e.top+=parseFloat(b.css(bf[0],"borderTopWidth"))||0;e.left+=parseFloat(b.css(bf[0],"borderLeftWidth"))||0;return{top:bh.top-e.top,left:bh.left-e.left}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||am.body;while(e&&(!Z.test(e.nodeName)&&b.css(e,"position")==="static")){e=e.offsetParent}return e})}});b.each(["Left","Top"],function(bf,e){var bg="scroll"+e;b.fn[bg]=function(bj){var bh=this[0],bi;if(!bh){return null}if(bj!==I){return this.each(function(){bi=aB(this);if(bi){bi.scrollTo(!bf?bj:b(bi).scrollLeft(),bf?bj:b(bi).scrollTop())}else{this[bg]=bj}})}else{bi=aB(bh);return bi?("pageXOffset" in bi)?bi[bf?"pageYOffset":"pageXOffset"]:b.support.boxModel&&bi.document.documentElement[bg]||bi.document.body[bg]:bh[bg]}}});function aB(e){return b.isWindow(e)?e:e.nodeType===9?e.defaultView||e.parentWindow:false}b.each(["Height","Width"],function(bf,e){var bg=e.toLowerCase();b.fn["inner"+e]=function(){return this[0]?parseFloat(b.css(this[0],bg,"padding")):null};b.fn["outer"+e]=function(bh){return this[0]?parseFloat(b.css(this[0],bg,bh?"margin":"border")):null};b.fn[bg]=function(bi){var bj=this[0];if(!bj){return bi==null?null:this}if(b.isFunction(bi)){return this.each(function(bn){var bm=b(this);bm[bg](bi.call(this,bn,bm[bg]()))})}if(b.isWindow(bj)){var bk=bj.document.documentElement["client"+e];return bj.document.compatMode==="CSS1Compat"&&bk||bj.document.body["client"+e]||bk}else{if(bj.nodeType===9){return Math.max(bj.documentElement["client"+e],bj.body["scroll"+e],bj.documentElement["scroll"+e],bj.body["offset"+e],bj.documentElement["offset"+e])}else{if(bi===I){var bl=b.css(bj,bg),bh=parseFloat(bl);return b.isNaN(bh)?bl:bh}else{return this.css(bg,typeof bi==="string"?bi:bi+"px")}}}}});a0.jQuery=a0.$=b})(window);
\ No newline at end of file
--- a/static/scripts/packed/trackster.js Tue Apr 12 09:35:36 2011 -0400
+++ b/static/scripts/packed/trackster.js Tue Apr 12 12:10:48 2011 -0400
@@ -1,1 +1,1 @@
-var extend=function(){var c=arguments[0];for(var b=1;b<arguments.length;b++){var a=arguments[b];for(key in a){c[key]=a[key]}}return c};var trackster_module=function(f,Q){var o=f("slotting"),G=f("painters");var V=function(W,X){this.document=W;this.default_font=X!==undefined?X:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};extend(V.prototype,{load_pattern:function(W,aa){var X=this.patterns,Y=this.dummy_context,Z=new Image();Z.src=image_path+aa;Z.onload=function(){X[W]=Y.createPattern(Z,"repeat")}},get_pattern:function(W){return this.patterns[W]},new_canvas:function(){var W=this.document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(W)}W.manager=this;return W}});var B=function(W,X){W.bind("drag",{handle:X,relative:true},function(ab,ac){var aa=$(this).parent();var Z=aa.children();var Y;for(Y=0;Y<Z.length;Y++){if(ac.offsetY<$(Z.get(Y)).position().top){break}}if(Y===Z.length){if(this!==Z.get(Y-1)){aa.append(this)}}else{if(this!==Z.get(Y)){$(this).insertBefore(Z.get(Y))}}})};var h=function(Y,W){var X=W-Y;return(X<=2?0.01:(X<=100?1:(X<=1000?5:10)))};var C=9,z=10,L=C+2,w=100,D=12000,J=200,r=10,F=5000,s=100,m="There was an error in indexing this dataset. ",E="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",A="No data for this chrom/contig.",p="Currently indexing... please wait",u="Tool cannot be rerun: ",a="Loading data...",R="Ready for display",d=10,q=5,y=5;function t(W){return Math.round(W*1000)/1000}var c=function(W){this.num_elements=W;this.clear()};extend(c.prototype,{get:function(X){var W=this.key_ary.indexOf(X);if(W!==-1){this.move_key_to_end(X,W)}return this.obj_cache[X]},set:function(X,Y){if(!this.obj_cache[X]){if(this.key_ary.length>=this.num_elements){var W=this.key_ary.shift();delete this.obj_cache[W]}this.key_ary.push(X)}this.obj_cache[X]=Y;return Y},move_key_to_end:function(X,W){this.key_ary.splice(W,1);this.key_ary.push(X)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var K=function(X,W,Y){c.call(this,X);this.track=W;this.subset=(Y!==undefined?Y:true)};extend(K.prototype,c.prototype,{load_data:function(ad,ae,Z,ac,W,ab){var Y={chrom:ad,low:ae,high:Z,mode:ac,resolution:W,dataset_id:this.track.dataset_id,hda_ldda:this.track.hda_ldda};$.extend(Y,ab);var af=[];for(var aa=0;aa<this.track.filters.length;aa++){af[af.length]=this.track.filters[aa].name}Y.filter_cols=JSON.stringify(af);var X=this;return $.getJSON(this.track.data_url,Y,function(ag){X.set_data(ae,Z,ac,ag)})},get_data:function(Y,W,ab,ac,X,aa){var Z=this.get(this.gen_key(W,ab,ac));if(Z){return Z}Z=this.load_data(Y,W,ab,ac,X,aa);this.set_data(W,ab,ac,Z);return Z},set_data:function(X,Y,Z,W){return this.set(this.gen_key(X,Y,Z),W)},gen_key:function(W,Y,Z){var X=W+"_"+Y+"_"+Z;return X},split_key:function(W){return W.split("_")}});var U=function(W,Z,Y,X,aa){this.container=W;this.chrom=null;this.vis_id=Y;this.dbkey=X;this.title=Z;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(aa);this.canvas_manager=new V(W.get(0).ownerDocument);this.reset()};extend(U.prototype,{init:function(Z){var Y=this.container,W=this;this.top_container=$("<div/>").addClass("top-container").appendTo(Y);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(Y);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(Y);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_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var X=function(aa){if(aa.type==="focusout"||(aa.keyCode||aa.which)===13||(aa.keyCode||aa.which)===27){if((aa.keyCode||aa.which)!==27){W.go_to($(this).val())}$(this).hide();$(this).val("");W.location_span.show();W.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",X).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){W.location_span.hide();W.chrom_select.hide();W.nav_input.val(W.chrom+":"+W.low+"-"+W.high);W.nav_input.css("display","inline-block");W.nav_input.select();W.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){W.zoom_out();W.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){W.zoom_in();W.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},Z);this.chrom_select.bind("change",function(){W.change_chrom(W.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(aa){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(aa){W.zoom_in(aa.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(aa,ab){this.current_x=ab.offsetX}).bind("drag",function(aa,ac){var ad=ac.offsetX-this.current_x;this.current_x=ac.offsetX;var ab=Math.round(ad/W.viewport_container.width()*(W.max_high-W.max_low));W.move_delta(-ab)});this.overview_close.bind("click",function(){for(var ab=0,aa=W.tracks.length;ab<aa;ab++){W.tracks[ab].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",W.overview_box.height());W.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(aa,ab){if(aa.clientX>W.viewport_container.width()-16){return false}}).bind("dragstart",function(aa,ab){ab.original_low=W.low;ab.current_height=aa.clientY;ab.current_x=ab.offsetX}).bind("drag",function(ac,ae){var aa=$(this);var af=ae.offsetX-ae.current_x;var ab=aa.scrollTop()-(ac.clientY-ae.current_height);aa.scrollTop(ab);ae.current_height=ac.clientY;ae.current_x=ae.offsetX;var ad=Math.round(af/W.viewport_container.width()*(W.high-W.low));W.move_delta(ad)}).bind("mousewheel",function(ac,ae,ab,aa){if(ab){var ad=Math.round(-ab/W.viewport_container.width()*(W.high-W.low));W.move_delta(ad)}});this.top_labeltrack.bind("dragstart",function(aa,ab){return $("<div />").css({height:W.content_div.height()+W.top_labeltrack.height()+W.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ae,af){$(af.proxy).css({left:Math.min(ae.pageX,af.startX),width:Math.abs(ae.pageX-af.startX)});var ab=Math.min(ae.pageX,af.startX)-W.container.offset().left,aa=Math.max(ae.pageX,af.startX)-W.container.offset().left,ad=(W.high-W.low),ac=W.viewport_container.width();W.update_location(Math.round(ab/ac*ad)+W.low,Math.round(aa/ac*ad)+W.low)}).bind("dragend",function(af,ag){var ab=Math.min(af.pageX,ag.startX),aa=Math.max(af.pageX,ag.startX),ad=(W.high-W.low),ac=W.viewport_container.width(),ae=W.low;W.low=Math.round(ab/ac*ad)+ae;W.high=Math.round(aa/ac*ad)+ae;$(ag.proxy).remove();W.redraw()});this.add_label_track(new T(this,this.top_labeltrack));this.add_label_track(new T(this,this.nav_labeltrack));$(window).bind("resize",function(){W.resize_window()});$(document).bind("redraw",function(){W.redraw()});this.reset();$(window).trigger("resize")},update_location:function(W,X){this.location_span.text(commatize(W)+" - "+commatize(X));this.nav_input.val(this.chrom+":"+commatize(W)+"-"+commatize(X))},load_chroms:function(X,Y){X.num=s;$.extend(X,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var W=this;$.ajax({url:chrom_url,data:X,dataType:"json",success:function(aa){if(aa.chrom_info.length===0){alert("Invalid chromosome: "+X.chrom);return}if(aa.reference){W.add_label_track(new x(W))}W.chrom_data=aa.chrom_info;var ad='<option value="">Select Chrom/Contig</option>';for(var ac=0,Z=W.chrom_data.length;ac<Z;ac++){var ab=W.chrom_data[ac].chrom;ad+='<option value="'+ab+'">'+ab+"</option>"}if(aa.prev_chroms){ad+='<option value="previous">Previous '+s+"</option>"}if(aa.next_chroms){ad+='<option value="next">Next '+s+"</option>"}W.chrom_select.html(ad);if(Y){Y()}W.chrom_start_index=aa.start_index},error:function(){alert("Could not load chroms for this dbkey:",W.dbkey)}})},change_chrom:function(aa,X,ac){if(!aa||aa==="None"){return}var Z=this;if(aa==="previous"){Z.load_chroms({low:this.chrom_start_index-s});return}if(aa==="next"){Z.load_chroms({low:this.chrom_start_index+s});return}var ab=$.grep(Z.chrom_data,function(ae,af){return ae.chrom===aa})[0];if(ab===undefined){Z.load_chroms({chrom:aa},function(){Z.change_chrom(aa,X,ac)});return}else{if(aa!==Z.chrom){Z.chrom=aa;if(!Z.chrom){Z.intro_div.show()}else{Z.intro_div.hide()}Z.chrom_select.val(Z.chrom);Z.max_high=ab.len-1;Z.reset();Z.redraw(true);for(var ad=0,W=Z.tracks.length;ad<W;ad++){var Y=Z.tracks[ad];if(Y.init){Y.init()}}}if(X!==undefined&&ac!==undefined){Z.low=Math.max(X,0);Z.high=Math.min(ac,Z.max_high)}Z.reset_overview();Z.redraw()}},go_to:function(aa){var ae=this,W,Z,X=aa.split(":"),ac=X[0],ad=X[1];if(ad!==undefined){try{var ab=ad.split("-");W=parseInt(ab[0].replace(/,/g,""),10);Z=parseInt(ab[1].replace(/,/g,""),10)}catch(Y){return false}}ae.change_chrom(ac,W,Z)},move_fraction:function(Y){var W=this;var X=W.high-W.low;this.move_delta(Y*X)},move_delta:function(Y){var W=this;var X=W.high-W.low;if(W.low-Y<W.max_low){W.low=W.max_low;W.high=W.max_low+X}else{if(W.high-Y>W.max_high){W.high=W.max_high;W.low=W.max_high-X}else{W.high-=Y;W.low-=Y}}W.redraw()},add_track:function(W){W.view=this;W.track_id=this.track_id_counter;this.tracks.push(W);if(W.init){W.init()}W.container_div.attr("id","track_"+W.track_id);B(W.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(W){W.view=this;this.label_tracks.push(W)},remove_track:function(W){this.has_changes=true;W.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(W)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(ad){var ac=this.high-this.low,ab=this.low,X=this.high;if(ab<this.max_low){ab=this.max_low}if(X>this.max_high){X=this.max_high}if(this.high!==0&&ac<this.min_separation){X=ab+this.min_separation}this.low=Math.floor(ab);this.high=Math.ceil(X);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/200)/Math.LN10));this.zoom_res=Math.pow(r,Math.max(0,Math.ceil(Math.log(this.resolution,r)/Math.log(r))));var W=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var aa=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:W,width:Math.max(ae,aa)}).show();if(aa<ae){this.overview_box.css("left",W-(ae-aa)/2)}if(this.overview_highlight){this.overview_highlight.css({left:W,width:aa})}this.update_location(this.low,this.high);if(!ad){for(var Y=0,Z=this.tracks.length;Y<Z;Y++){if(this.tracks[Y]&&this.tracks[Y].enabled){this.tracks[Y].draw()}}for(Y=0,Z=this.label_tracks.length;Y<Z;Y++){this.label_tracks[Y].draw()}}},zoom_in:function(X,Y){if(this.max_high===0||this.high-this.low<this.min_separation){return}var Z=this.high-this.low,aa=Z/2+this.low,W=(Z/this.zoom_factor)/2;if(X){aa=X/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(aa-W);this.high=Math.round(aa+W);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var X=this.high-this.low,Y=X/2+this.low,W=(X*this.zoom_factor)/2;this.low=Math.round(Y-W);this.high=Math.round(Y+W);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 n=function(X,aa){this.track=X;this.name=aa.name;this.params=[];var ai=aa.params;for(var Y=0;Y<ai.length;Y++){var ad=ai[Y],W=ad.name,ah=ad.label,Z=unescape(ad.html),af=ad.type;if(af==="number"){this.params[this.params.length]=new g(W,ah,Z,ad.min,ad.max)}else{if(af=="select"){this.params[this.params.length]=new I(W,ah,Z)}else{console.log("WARNING: unrecognized tool parameter type:",W,af)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(ak){ak.stopPropagation()}).bind("click",function(ak){ak.stopPropagation()}).bind("dblclick",function(ak){ak.stopPropagation()});var ag=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var ae=this.params;var ab=this;$.each(this.params,function(al,ao){var an=$("<div>").addClass("param-row").appendTo(ab.parent_div);var ak=$("<div>").addClass("param-label").text(ao.label).appendTo(an);var am=$("<div/>").addClass("slider").html(ao.html).appendTo(an);$("<div style='clear: both;'/>").appendTo(an)});this.parent_div.find("input").click(function(){$(this).select()});var aj=$("<div>").addClass("slider-row").appendTo(this.parent_div);var ac=$("<input type='submit'>").attr("value","Run").appendTo(aj);var ab=this;ac.click(function(){ab.run()})};extend(n.prototype,{get_param_values_dict:function(){var W={};this.parent_div.find(":input").each(function(){var X=$(this).attr("name"),Y=$(this).val();W[X]=JSON.stringify(Y)});return W},get_param_values:function(){var X=[];var W={};this.parent_div.find(":input").each(function(){var Y=$(this).attr("name"),Z=$(this).val();if(Y){X[X.length]=Z}});return X},run:function(){var X={dataset_id:this.track.original_dataset_id,chrom:this.track.view.chrom,low:this.track.view.low,high:this.track.view.high,tool_id:this.name};$.extend(X,this.get_param_values_dict());var Z=this.track,Y=X.tool_id+Z.tool_region_and_parameters_str(X.chrom,X.low,X.high),aa;if(Z.track_type==="FeatureTrack"){aa=new N(Y,view,Z.hda_ldda,undefined,{},{},Z)}this.track.add_track(aa);aa.content_div.text("Starting job.");var W=function(){$.getJSON(run_tool_url,X,function(ab){if(ab==="no converter"){aa.container_div.addClass("error");aa.content_div.text(E)}else{if(ab.error){aa.container_div.addClass("error");aa.content_div.text(u+ab.message)}else{if(ab==="pending"){aa.container_div.addClass("pending");aa.content_div.text("Converting input data so that it can be easily reused.");setTimeout(W,2000)}else{aa.dataset_id=ab.dataset_id;aa.content_div.text("Running job.");aa.init()}}}})};W()}});var I=function(X,W,Y){this.name=X;this.label=W;this.html=Y};var g=function(Y,X,aa,Z,W){I.call(this,Y,X,aa);this.min=Z;this.max=W};var j=function(X,W,Y){this.name=X;this.index=W;this.value=Y};var O=function(X,W){this.name=X;this.index=W;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.min=Number.MAX_VALUE;this.max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};extend(O.prototype,{applies_to:function(W){if(W.length>this.index){return true}return false},keep:function(W){if(!this.applies_to(W)){return true}return(W[this.index]>=this.low&&W[this.index]<=this.high)},update_attrs:function(X){var W=false;if(!this.applies_to(X)){return W}if(X[this.index]<this.min){this.min=Math.floor(X[this.index]);W=true}if(X[this.index]>this.max){this.max=Math.ceil(X[this.index]);W=true}return W},update_ui_elt:function(){var X=this.slider.slider("option","min"),W=this.slider.slider("option","max");if(this.min<X||this.max>W){this.slider.slider("option","min",this.min);this.slider.slider("option","max",this.max);this.slider.slider("option","step",h(this.min,this.max));this.slider.slider("option","values",[this.min,this.max])}}});var v=function(W){var ac=[];for(var Z=0;Z<W.length;Z++){var ab=W[Z];var Y=ab.name,aa=ab.type,X=ab.index;if(aa==="int"||aa==="float"){ac[Z]=new O(Y,X)}else{ac[Z]=new j(Y,X,aa)}}return ac};var S=function(W){this.track=W.track;this.params=W.params;this.values={};if(W.saved_values){this.restore_values(W.saved_values)}this.onchange=W.onchange};extend(S.prototype,{restore_values:function(W){var X=this;$.each(this.params,function(Y,Z){if(W[Z.key]!==undefined){X.values[Z.key]=W[Z.key]}else{X.values[Z.key]=Z.default_value}})},build_form:function(){var X=this;var W=$("<div />");$.each(this.params,function(ab,Z){if(!Z.hidden){var Y="param_"+ab;var ag=$("<div class='form-row' />").appendTo(W);ag.append($("<label />").attr("for",Y).text(Z.label+":"));if(Z.type==="bool"){ag.append($('<input type="checkbox" />').attr("id",Y).attr("name",Y).attr("checked",X.values[Z.key]))}else{if(Z.type==="color"){var ad=X.values[Z.key];var ac=$("<input />").attr("id",Y).attr("name",Y).val(ad);var ae=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var aa=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(ae);var af=$("<div/>").appendTo(aa).farbtastic({width:100,height:100,callback:ac,color:ad});$("<div />").append(ac).append(ae).appendTo(ag).bind("click",function(ah){ae.css({left:$(this).position().left+($(ac).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){ae.hide();$(document).unbind("click.color-picker")});ah.stopPropagation()})}else{ag.append($("<input />").attr("id",Y).attr("name",Y).val(X.values[Z.key]))}}}});return W},update_from_form:function(W){var Y=this;var X=false;$.each(this.params,function(Z,ab){if(!ab.hidden){var ac="param_"+Z;var aa=W.find("#"+ac).val();if(ab.type==="float"){aa=parseFloat(aa)}else{if(ab.type==="int"){aa=parseInt(aa)}else{if(ab.type==="bool"){aa=W.find("#"+ac).is(":checked")}}}if(aa!==Y.values[ab.key]){Y.values[ab.key]=aa;X=true}}});if(X){this.onchange()}}});var b=function(W,X){this.track=W;this.canvas=X};var k=function(X,W,aa,Y,Z){this.name=X;this.view=W;this.parent_element=aa;this.data_url=(Y?Y:default_data_url);this.data_url_extra_params={};this.data_query_wait=(Z?Z:F);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(k.prototype,{init:function(){var W=this;W.enabled=false;W.tile_cache.clear();W.data_cache.clear();W.initial_canvas=undefined;W.content_div.css("height","auto");W.container_div.removeClass("nodata error pending");if(!W.dataset_id){return}$.getJSON(converted_datasets_state_url,{hda_ldda:W.hda_ldda,dataset_id:W.dataset_id,chrom:W.view.chrom},function(X){if(!X||X==="error"||X.kind==="error"){W.container_div.addClass("error");W.content_div.text(m);if(X.message){var Z=W.view.tracks.indexOf(W);var Y=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+X.message+"</pre>",{Close:hide_modal})});W.content_div.append(Y)}}else{if(X==="no converter"){W.container_div.addClass("error");W.content_div.text(E)}else{if(X==="no data"||(X.data!==undefined&&(X.data===null||X.data.length===0))){W.container_div.addClass("nodata");W.content_div.text(A)}else{if(X==="pending"){W.container_div.addClass("pending");W.content_div.text(p);setTimeout(function(){W.init()},W.data_query_wait)}else{if(X.status==="data"){if(X.valid_chroms){W.valid_chroms=X.valid_chroms;W.make_name_popup_menu()}W.content_div.text(R);if(W.view.chrom){W.content_div.text("");W.content_div.css("height",W.height_px+"px");W.enabled=true;$.when(W.predraw_init()).done(function(){W.container_div.removeClass("nodata error pending");W.draw()})}}}}}}})},predraw_init:function(){},update_name:function(W){this.old_name=this.name;this.name=W;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var H=function(X,ad,ag){var Y=this,ah=Y.view;this.filters=(X!==undefined?v(X):[]);this.filters_available=false;this.filters_visible=false;this.tool=(ad!==undefined&&obj_length(ad)>0?new n(this,ad):undefined);this.parent_track=ag;this.child_tracks=[];if(Y.hidden){return}var af=function(ai,aj,ak){ai.click(function(){var al=aj.text();max=parseFloat(ak.slider("option","max")),input_size=(max<=1?4:max<=1000000?max.toString().length:6),multi_value=false;if(ak.slider("option","values")){input_size=2*input_size+1;multi_value=true}aj.text("");$("<input type='text'/>").attr("size",input_size).attr("maxlength",input_size).attr("value",al).appendTo(aj).focus().select().click(function(am){am.stopPropagation()}).blur(function(){$(this).remove();aj.text(al)}).keyup(function(aq){if(aq.keyCode===27){$(this).trigger("blur")}else{if(aq.keyCode===13){var ao=ak.slider("option","min"),am=ak.slider("option","max"),ap=function(ar){return(isNaN(ar)||ar>am||ar<ao)},an=$(this).val();if(!multi_value){an=parseFloat(an);if(ap(an)){alert("Parameter value must be in the range ["+ao+"-"+am+"]");return $(this)}}else{an=an.split("-");an=[parseFloat(an[0]),parseFloat(an[1])];if(ap(an[0])||ap(an[1])){alert("Parameter value must be in the range ["+ao+"-"+am+"]");return $(this)}}ak.slider((multi_value?"values":"value"),an)}}})})};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.filters_div=$("<div/>").addClass("filters").hide();this.header_div.after(this.filters_div);this.filters_div.bind("drag",function(ai){ai.stopPropagation()}).bind("click",function(ai){ai.stopPropagation()}).bind("dblclick",function(ai){ai.stopPropagation()});$.each(this.filters,function(ao,aj){var al=$("<div/>").addClass("slider-row").appendTo(Y.filters_div);var ai=$("<div/>").addClass("slider-label").appendTo(al);var aq=$("<span/>").addClass("slider-name").text(aj.name+" ").appendTo(ai);var ak=$("<span/>");var am=$("<span/>").addClass("slider-value").appendTo(ai).append("[").append(ak).append("]");var ap=$("<div/>").addClass("slider").appendTo(al);aj.control_element=$("<div/>").attr("id",aj.name+"-filter-control").appendTo(ap);var an=[0,0];aj.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(ar,at){an=at.values;ak.text(at.values[0]+"-"+at.values[1]);setTimeout(function(){if(at.values[0]==an[0]&&at.values[1]==an[1]){var au=at.values;ak.text(au[0]+"-"+au[1]);aj.low=au[0];aj.high=au[1];Y.draw(true,true)}},50)},change:function(ar,at){aj.control_element.slider("option","slide").call(aj.control_element,ar,at)}});aj.slider=aj.control_element;aj.slider_label=ak;af(am,ak,aj.control_element);$("<div style='clear: both;'/>").appendTo(al)});if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}Y.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();Y.container_div.append(Y.child_tracks_container);if(Y.display_modes!==undefined){if(Y.mode_div===undefined){Y.mode_div=$("<div class='right-float menubutton popup' />").appendTo(Y.header_div);var aa=(Y.track_config&&Y.track_config.values.mode?Y.track_config.values.mode:Y.display_modes[0]);Y.mode=aa;Y.mode_div.text(aa);var Z=function(ai){Y.mode_div.text(ai);Y.mode=ai;Y.track_config.values.mode=ai;Y.tile_cache.clear();Y.draw()};var W={};for(var ab=0,ae=Y.display_modes.length;ab<ae;ab++){var ac=Y.display_modes[ab];W[ac]=function(ai){return function(){Z(ai)}}(ac)}make_popupmenu(Y.mode_div,W)}else{Y.mode_div.hide()}}this.make_name_popup_menu()};extend(H.prototype,k.prototype,{make_name_popup_menu:function(){var X=this;var W={};W["Edit configuration"]=function(){var ad=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ab=function(){X.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ac=function(ae){if((ae.keyCode||ae.which)===27){ad()}else{if((ae.keyCode||ae.which)===13){ab()}}};$(window).bind("keypress.check_enter_esc",ac);show_modal("Configure Track",X.track_config.build_form(),{Cancel:ad,OK:ab})};if(X.filters_available>0){var aa=(X.filters_div.is(":visible")?"Hide filters":"Show filters");W[aa]=function(){X.filters_visible=(X.filters_div.is(":visible"));X.filters_div.toggle();X.make_name_popup_menu()}}if(X.tool){var aa=(X.dynamic_tool_div.is(":visible")?"Hide tool":"Show tool");W[aa]=function(){if(!X.dynamic_tool_div.is(":visible")){X.update_name(X.name+X.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";X.revert_name()}X.dynamic_tool_div.toggle();X.make_name_popup_menu()}}if(X.valid_chroms){W["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+X.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var Y=view;var Z=function(){$("#no-tracks").show()};if(this.parent_track){Y=this.parent_track;Z=function(){}}W.Remove=function(){Y.remove_track(X);if(Y.num_tracks===0){Z()}};make_popupmenu(X.name_div,W)},draw:function(W,Z){var an=this.view.low,ac=this.view.high,ae=ac-an,ag=this.view.container.width(),ab=ag/ae,ah=this.view.resolution,aa=$("<div style='position: relative;'></div>");if(!Z){this.content_div.children().remove()}this.content_div.append(aa);this.max_height=0;var aj=Math.floor(an/ah/J);var Y={};while((aj*J*ah)<ac){var am=ag+"_"+ab+"_"+aj;var ad=this.tile_cache.get(am);var ak=aj*J*this.view.resolution;var X=ak+J*this.view.resolution;if(!W&&ad){this.show_tile(ad,aa,ak,ab)}else{this.delayed_draw(W,am,ak,X,aj,ah,aa,ab,Y)}aj+=1}var af=this;var al=setInterval(function(){if(obj_length(Y)===0){clearInterval(al);if(Z){var aq=af.content_div.children();var ap=false;for(var ar=aq.length-1,ao=0;ar>=ao;ar--){var av=$(aq[ar]);if(ap){av.remove()}else{if(av.children().length!==0){ap=true}}}}for(var au=0;au<af.filters.length;au++){af.filters[au].update_ui_elt()}var at=false;if(af.example_feature){for(var au=0;au<af.filters.length;au++){if(af.filters[au].applies_to(af.example_feature)){at=true;break}}}if(af.filters_available!==at){af.filters_available=at;if(!af.filters_available){af.filters_div.hide()}af.make_name_popup_menu()}}},50);for(var ai=0;ai<this.child_tracks.length;ai++){this.child_tracks[ai].draw(W,Z)}},delayed_draw:function(X,ae,ac,ag,Y,aa,af,ah,ab){var Z=this;var ad=function(ap,ai,ak,aj,an,ao,al){returned_tile=Z.draw_tile(ai,ak,aj,an,ao,al);var am=$("<div class='track-tile'>").prepend(returned_tile);tile_element=am;Z.tile_cache.set(ae,tile_element);Z.show_tile(tile_element,an,ac,ao);delete ab[ap]};var W=setTimeout(function(){if(ac<=Z.view.high&&ag>=Z.view.low){var ai=(X?undefined:Z.tile_cache.get(ae));if(ai){Z.show_tile(ai,af,ac,ah);delete ab[W]}else{$.when(Z.data_cache.get_data(view.chrom,ac,ag,Z.mode,aa,Z.data_url_extra_params)).then(function(aj){if(view.reference_track&&ah>view.canvas_manager.char_width_px){$.when(view.reference_track.data_cache.get_data(view.chrom,ac,ag,Z.mode,aa,view.reference_track.data_url_extra_params)).then(function(ak){ad(W,aj,aa,Y,af,ah,ak)})}else{ad(W,aj,aa,Y,af,ah)}})}}},50);ab[W]=true},show_tile:function(W,ab,Z,ac){var X=this;var Y=this.view.high-this.view.low,aa=(Z-this.view.low)*ac;if(this.left_offset){aa-=this.left_offset}W.css({position:"absolute",top:0,left:aa,height:""});ab.append(W);X.max_height=Math.max(X.max_height,W.height());X.content_div.css("height",X.max_height+"px");ab.children().css("height",X.max_height+"px")},set_overview:function(){var W=this.view;if(this.initial_canvas&&this.is_overview){W.overview_close.show();W.overview_viewport.append(this.initial_canvas);W.overview_highlight.show().height(this.initial_canvas.height());W.overview_viewport.height(this.initial_canvas.height()+W.overview_box.height())}$(window).trigger("resize")},tool_region_and_parameters_str:function(Y,W,Z){var X=this,aa=(Y!==undefined&&W!==undefined&&Z!==undefined?Y+":"+W+"-"+Z:"all");return" - region=["+aa+"], parameters=["+X.tool.get_param_values().join(", ")+"]"},add_track:function(W){W.track_id=this.track_id+"_"+this.child_tracks.length;W.container_div.attr("id","track_"+W.track_id);this.child_tracks_container.append(W.container_div);B(W.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(W);this.view.has_changes=true},remove_track:function(W){W.container_div.fadeOut("slow",function(){$(this).remove()})}});var T=function(W,X){this.track_type="LabelTrack";this.hidden=true;k.call(this,null,W,X);this.container_div.addClass("label-track")};extend(T.prototype,k.prototype,{draw:function(){var Y=this.view,Z=Y.high-Y.low,ac=Math.floor(Math.pow(10,Math.floor(Math.log(Z)/Math.log(10)))),W=Math.floor(Y.low/ac)*ac,aa=this.view.container.width(),X=$("<div style='position: relative; height: 1.3em;'></div>");while(W<Y.high){var ab=(W-Y.low)/Z*aa;X.append($("<div class='label'>"+commatize(W)+"</div>").css({position:"absolute",left:ab-1}));W+=ac}this.content_div.children(":first").remove();this.content_div.append(X)}});var x=function(W){this.track_type="ReferenceTrack";this.hidden=true;k.call(this,null,W,W.top_labeltrack);H.call(this);W.reference_track=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_url=reference_url;this.data_url_extra_params={dbkey:W.dbkey};this.data_cache=new K(y,this,false);this.tile_cache=new c(q)};extend(x.prototype,H.prototype,{draw_tile:function(ag,ab,X,ad,ah){var aa=this,Y=J*ab;if(ah>this.view.canvas_manager.char_width_px){if(ag===null){aa.content_div.css("height","0px");return}var Z=this.view.canvas_manager.new_canvas();var af=Z.getContext("2d");Z.width=Math.ceil(Y*ah+aa.left_offset);Z.height=aa.height_px;af.font=af.canvas.manager.default_font;af.textAlign="center";for(var ac=0,ae=ag.length;ac<ae;ac++){var W=Math.round(ac*ah);af.fillText(ag[ac],W+aa.left_offset,10)}return Z}this.content_div.css("height","0px")}});var l=function(aa,Y,ab,W,Z){var X=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";k.call(this,aa,Y,Y.viewport_container);H.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=ab;this.dataset_id=W;this.original_dataset_id=W;this.data_cache=new K(y,this);this.tile_cache=new c(q);this.track_config=new S({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:Z,onchange:function(){X.vertical_range=X.prefs.max_value-X.prefs.min_value;$("#linetrack_"+X.track_id+"_minval").text(X.prefs.min_value);$("#linetrack_"+X.track_id+"_maxval").text(X.prefs.max_value);X.tile_cache.clear();X.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;this.add_resize_handle()};extend(l.prototype,H.prototype,{add_resize_handle:function(){var W=this;var Z=false;var Y=false;var X=$("<div class='track-resize'>");$(W.container_div).hover(function(){Z=true;X.show()},function(){Z=false;if(!Y){X.hide()}});X.hide().bind("dragstart",function(aa,ab){Y=true;ab.original_height=$(W.content_div).height()}).bind("drag",function(ab,ac){var aa=Math.min(Math.max(ac.original_height+ac.deltaY,W.min_height_px),W.max_height_px);$(W.content_div).css("height",aa);W.height_px=aa;W.draw(true)}).bind("dragend",function(aa,ab){W.tile_cache.clear();Y=false;if(!Z){X.hide()}W.track_config.values.height=W.height_px}).appendTo(W.container_div)},predraw_init:function(){var W=this,X=W.view.tracks.indexOf(W);W.vertical_range=undefined;return $.getJSON(W.data_url,{stats:true,chrom:W.view.chrom,low:null,high:null,hda_ldda:W.hda_ldda,dataset_id:W.dataset_id},function(Y){W.container_div.addClass("line-track");var aa=Y.data;if(isNaN(parseFloat(W.prefs.min_value))||isNaN(parseFloat(W.prefs.max_value))){W.prefs.min_value=aa.min;W.prefs.max_value=aa.max;$("#track_"+X+"_minval").val(W.prefs.min_value);$("#track_"+X+"_maxval").val(W.prefs.max_value)}W.vertical_range=W.prefs.max_value-W.prefs.min_value;W.total_frequency=aa.total_frequency;W.container_div.find(".yaxislabel").remove();var ab=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+X+"_minval").text(t(W.prefs.min_value));var Z=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+X+"_maxval").text(t(W.prefs.max_value));Z.css({position:"absolute",top:"24px",left:"10px"});Z.prependTo(W.container_div);ab.css({position:"absolute",bottom:"2px",left:"10px"});ab.prependTo(W.container_div)})},draw_tile:function(ah,aa,X,ae,ag){if(this.vertical_range===undefined){return}var ab=X*J*aa,Z=J*aa,W=Math.ceil(Z*ag),ad=this.height_px;var Y=this.view.canvas_manager.new_canvas();Y.width=W,Y.height=ad;var af=Y.getContext("2d");var ac=new G.LinePainter(ah.data,ab,ab+Z,this.prefs,this.mode);ac.draw(af,W,ad);return Y}});var e=function(W,ab,aa,ae,ad,Y,Z,ac){var X=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];this.track_config=new S({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:ad,onchange:function(){X.tile_cache.clear();X.draw()}});this.prefs=this.track_config.values;k.call(this,W,ab,ab.viewport_container);H.call(this,Y,Z,ac);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=aa;this.dataset_id=ae;this.original_dataset_id=ae;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.inc_slots={};this.start_end_dct={};this.tile_cache=new c(d);this.data_cache=new K(20,this);this.left_offset=200;this.painter=G.LinkedFeaturePainter};extend(e.prototype,H.prototype,{update_auto_mode:function(W){if(this.mode=="Auto"){if(W=="no_detail"){W="feature spans"}else{if(W=="summary_tree"){W="coverage histogram"}}this.mode_div.text("Auto ("+W+")")}},incremental_slots:function(aa,X,Z){var Y=this.view.canvas_manager.dummy_context,W=this.inc_slots[aa];if(!W||(W.mode!==Z)){W=new (o.FeatureSlotter)(aa,Z==="Pack",w,function(ab){return Y.measureText(ab)});W.mode=Z;this.inc_slots[aa]=W}return W.slot_features(X)},draw_tile:function(ai,aq,av,ae,ag,Z){var an=this,ax=av*J*aq,X=(av+1)*J*aq,ak=X-ax,ao=Math.ceil(ak*ag),am=this.mode,aB=25,aa=this.left_offset,aj,ab;if(am==="Auto"){if(ai.dataset_type==="summary_tree"){am=ai.dataset_type}else{if(ai.extra_info==="no_detail"){am="no_detail"}else{var aA=ai.data;if(this.view.high-this.view.low>D){am="Squish"}else{am="Pack"}}}this.update_auto_mode(am)}if(am==="summary_tree"){ab=this.summary_draw_height;ae.parent().css("height",Math.max(this.height_px,ab)+"px");this.container_div.find(".yaxislabel").remove();var W=$("<div />").addClass("yaxislabel");W.text(ai.max);W.css({position:"absolute",top:"22px",left:"10px"});W.prependTo(this.container_div);var Y=this.view.canvas_manager.new_canvas();Y.width=ao+aa;Y.height=ab+L;var ay=new G.SummaryTreePainter(ai,ax,X,this.prefs);var ap=Y.getContext("2d");ap.translate(aa,L);ay.draw(ap,ao,ab);return Y}var aj,ad=1;if(am==="no_detail"||am==="Squish"||am==="Pack"){ad=this.incremental_slots(ag,ai.data,am);aj=this.inc_slots[ag].slots}var af=[];if(ai.data){for(var ar=0,au=ai.data.length;ar<au;ar++){var ac=ai.data[ar];var at=false;var ah;for(var aw=0,az=this.filters.length;aw<az;aw++){ah=this.filters[aw];ah.update_attrs(ac);if(!ah.keep(ac)){at=true;break}}if(!at){af.push(ac)}}}var ay=new (this.painter)(af,ax,X,this.prefs,am,Z);var ab=ay.get_required_height(ad)+z;var Y=this.view.canvas_manager.new_canvas();Y.width=ao+aa;Y.height=ab;ae.parent().css("height",Math.max(this.height_px,ab)+"px");var ap=Y.getContext("2d");ap.fillStyle=this.prefs.block_color;ap.font=ap.canvas.manager.default_font;ap.textAlign="right";this.container_div.find(".yaxislabel").remove();if(ai.message){$(Y).css({"border-top":"1px solid red"});ap.fillStyle="red";ap.textAlign="left";var al=ap.textBaseline;ap.textBaseline="top";ap.fillText(ai.message,aa,0);ap.textBaseline=al;if(!ai.data){return Y}}this.example_feature=(ai.data.length?ai.data[0]:undefined);ap.translate(aa,z);ay.draw(ap,ao,ab,aj);return Y}});var M=function(Z,X,ab,W,Y,aa){e.call(this,Z,X,ab,W,Y,aa);this.track_type="VcfTrack";this.painter=G.VariantPainter};extend(M.prototype,H.prototype,e.prototype);var P=function(Z,X,ab,W,Y,aa){e.call(this,Z,X,ab,W,Y,aa);this.track_config=new S({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_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:Y,onchange:function(){this.track.tile_cache.clear();this.track.draw()}});this.prefs=this.track_config.values;this.track_type="ReadTrack";this.painter=G.ReadPainter;this.make_name_popup_menu()};extend(P.prototype,H.prototype,e.prototype);var N=function(aa,Y,ac,W,Z,ab,X){e.call(this,aa,Y,ac,W,Z,ab,{},X);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};extend(N.prototype,H.prototype,e.prototype,{predraw_init:function(){var X=this;var W=function(){if(X.data_cache.size()===0){setTimeout(W,300)}else{X.data_url=default_data_url;X.data_query_wait=F;X.dataset_state_url=converted_datasets_state_url;$.getJSON(X.dataset_state_url,{dataset_id:X.dataset_id,hda_ldda:X.hda_ldda},function(Y){})}};W()}});Q.View=U;Q.LineTrack=l;Q.FeatureTrack=e;Q.ReadTrack=P};var slotting_module=function(c,b){var d=2,a=5;b.FeatureSlotter=function(h,g,e,f){this.slots={};this.start_end_dct={};this.w_scale=h;this.include_label=g;this.max_rows=e;this.measureText=f};extend(b.FeatureSlotter.prototype,{slot_features:function(l){var o=this.w_scale,r=this.slots,g=this.start_end_dct,x=[],z=[],m=0,y=this.max_rows;for(var v=0,w=l.length;v<w;v++){var k=l[v],n=k[0];if(r[n]!==undefined){m=Math.max(m,r[n]);z.push(r[n])}else{x.push(v)}}var p=function(F,G){for(var E=0;E<=y;E++){var C=false,H=g[E];if(H!==undefined){for(var B=0,D=H.length;B<D;B++){var A=H[B];if(G>A[0]&&F<A[1]){C=true;break}}}if(!C){return E}}return -1};for(var v=0,w=x.length;v<w;v++){var k=l[x[v]],n=k[0],t=k[1],e=k[2],q=k[3],f=Math.floor(t*o),j=Math.ceil(e*o),u=this.measureText(q).width,h;if(q!==undefined&&this.include_label){u+=(d+a);if(f-u>=0){f-=u;h="left"}else{j+=u;h="right"}}var s=p(f,j);if(s>=0){if(g[s]===undefined){g[s]=[]}g[s].push([f,j]);r[n]=s;m=Math.max(m,s)}else{}}return m+1}})};var painters_module=function(k,B){var r=function(M,E,K,D,J,H){if(H===undefined){H=4}var G=D-E;var F=J-K;var I=Math.floor(Math.sqrt(G*G+F*F)/H);var N=G/I;var L=F/I;var C;for(C=0;C<I;C++,E+=N,K+=L){if(C%2!==0){continue}M.fillRect(E,K,H,1)}};var s=function(E,D,C,H){var G=D-H/2,F=D+H/2,I=C-Math.sqrt(H*3/2);E.beginPath();E.moveTo(G,I);E.lineTo(F,I);E.lineTo(D,C);E.lineTo(G,I);E.strokeStyle=this.fillStyle;E.fill();E.stroke();E.closePath()};var o=function(E,G,C,D,F){this.data=E;this.view_start=G;this.view_end=C;this.prefs=extend({},this.default_prefs,D);this.mode=F};o.prototype.default_prefs={};var w=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};w.prototype.default_prefis={show_counts:false};w.prototype.draw=function(P,C,O){var H=this.view_start,R=this.view_end-this.view_start,Q=C/R;var M=this.data.data,L=this.data.delta,J=this.data.max,E=O;delta_x_px=Math.ceil(L*Q);P.save();for(var F=0,G=M.length;F<G;F++){var K=Math.floor((M[F][0]-H)*Q);var I=M[F][1];if(!I){continue}var N=I/J*O;P.fillStyle="black";P.fillRect(K,E-N,delta_x_px,N);var D=4;if(this.prefs.show_counts&&(P.measureText(I).width+D)<delta_x_px){P.fillStyle="#666";P.textAlign="center";P.fillText(I,K+(delta_x_px/2),10)}}P.restore()};var c=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};c.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};c.prototype.draw=function(R,Q,O){var J=false,K=this.prefs.min_value,H=this.prefs.max_value,N=H-K,D=O,E=this.view_start,P=this.view_end-this.view_start,F=Q/P,L=this.mode,V=this.data;R.save();var W=Math.round(O+K/N*O);if(L!=="Intensity"){R.fillStyle="#aaa";R.fillRect(0,W,Q,1)}R.beginPath();R.fillStyle=this.prefs.color;var U,I,G;if(V.length>1){G=Math.ceil((V[1][0]-V[0][0])*F)}else{G=10}for(var S=0,T=V.length;S<T;S++){U=Math.round((V[S][0]-E)*F);I=V[S][1];if(I===null){if(J&&L==="Filled"){R.lineTo(U,D)}J=false;continue}if(I<K){I=K}else{if(I>H){I=H}}if(L==="Histogram"){I=Math.round(I/N*D);R.fillRect(U,W,G,-I)}else{if(L==="Intensity"){I=255-Math.floor((I-K)/N*255);R.fillStyle="rgb("+I+","+I+","+I+")";R.fillRect(U,0,G,D)}else{I=Math.round(D-(I-K)/N*D);if(J){R.lineTo(U,I)}else{J=true;if(L==="Filled"){R.moveTo(U,D);R.lineTo(U,I)}else{R.moveTo(U,I)}}}}}if(L==="Filled"){if(J){R.lineTo(U,W);R.lineTo(0,W)}R.fill()}else{R.stroke()}var C=-1,M=-1;R.fillStyle=this.prefs.overflow_color;for(var S=0,T=V.length;S<T;S++){I=V[S][1];U=Math.round((V[S][0]-E)*F);x_minus_scaled=Math.round((V[S][0]-1-E)*F);if(M>=0&&(I===null||I<H)){R.fillRect(M,0,x_minus_scaled-M+1,2);M=-1}else{if(C>=0&&(I===null||I>K)){R.fillRect(C,O-2,x_minus_scaled-C+1,2);C=-1}}if(I!==null&&I>H&&M<0){M=U}else{if(I!==null&&I<K&&C<0){C=U}}}R.restore()};var q=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};q.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};extend(q.prototype,{get_required_height:function(D){var C=y_scale=this.get_row_height(),E=this.mode;if(E==="no_detail"||E==="Squish"||E==="Pack"){C=D*y_scale}return C+Math.max(Math.round(y_scale/2),5)},draw:function(O,F,N,K){var I=this.data,L=this.view_start,P=this.view_end;O.save();O.fillStyle=this.prefs.block_color;O.textAlign="right";var S=this.view_end-this.view_start,R=F/S,E=this.get_row_height();for(var H=0,J=I.length;H<J;H++){var Q=I[H],G=Q[0],C=Q[1],D=Q[2],M=(K&&K[G]!==undefined?K[G]:null);if((C<P&&D>L)&&(this.mode=="Dense"||M!==null)){this.draw_element(O,this.mode,Q,M,L,P,R,E,F)}}O.restore()}});var d=10,j=3,n=5,A=10,g=1,u=3,f=3,a=9,p=2,h="#ccc";var t=function(E,G,C,D,F){q.call(this,E,G,C,D,F)};extend(t.prototype,q.prototype,{get_row_height:function(){var D=this.mode,C;if(D==="Dense"){C=d}else{if(D==="no_detail"){C=j}else{if(D==="Squish"){C=n}else{C=A}}}return C},draw_element:function(O,H,W,J,Q,ag,ak,al,C){var T=W[0],ai=W[1],aa=W[2]-1,R=W[3],ab=Math.floor(Math.max(0,(ai-Q)*ak)),P=Math.ceil(Math.min(C,Math.max(0,(aa-Q)*ak))),Z=(H==="Dense"?0:(0+J))*al,N,ae,S=null,am=null,F=this.prefs.block_color,ad=this.prefs.label_color;if(H=="Dense"){J=1}if(H==="no_detail"){O.fillStyle=F;O.fillRect(ab,Z+5,P-ab,g)}else{var M=W[4],Y=W[5],ac=W[6],G=W[7];if(Y&&ac){S=Math.floor(Math.max(0,(Y-Q)*ak));am=Math.ceil(Math.min(C,Math.max(0,(ac-Q)*ak)))}var aj,U;if(H==="Squish"||H==="Dense"){aj=1;U=f}else{aj=5;U=a}if(!G){if(W.strand){if(W.strand==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand_inv")}else{if(W.strand==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand_inv")}}}else{O.fillStyle=F}O.fillRect(ab,Z,P-ab,U)}else{var L,V;if(H==="Squish"||H==="Dense"){O.fillStyle=h;L=Z+Math.floor(f/2)+1;V=1}else{if(M){var L=Z;var V=U;if(M==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand")}else{if(M==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand")}}}else{O.fillStyle=h;L+=(f/2)+1;V=1}}O.fillRect(ab,L,P-ab,V);for(var ah=0,E=G.length;ah<E;ah++){var I=G[ah],D=Math.floor(Math.max(0,(I[0]-Q)*ak)),X=Math.ceil(Math.min(C,Math.max((I[1]-1-Q)*ak)));if(D>X){continue}O.fillStyle=F;O.fillRect(D,Z+(U-aj)/2+1,X-D,aj);if(S!==undefined&&ac>Y&&!(D>am||X<S)){var af=Math.max(D,S),K=Math.min(X,am);O.fillRect(af,Z+1,K-af,U);if(G.length==1&&H=="Pack"){if(M==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand_inv")}else{if(M==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand_inv")}}if(af+14<K){af+=2;K-=2}O.fillRect(af,Z+1,K-af,U)}}}}if(H==="Pack"&&ai>Q){O.fillStyle=ad;if(Q===0&&ab-O.measureText(R).width<0){O.textAlign="left";O.fillText(R,P+p,Z+8)}else{O.textAlign="right";O.fillText(R,ab-p,Z+8)}O.fillStyle=F}}}});var b=function(E,G,C,D,F){q.call(this,E,G,C,D,F)};extend(b.prototype,q.prototype,{draw_element:function(V,Q,K,G,Y,E,N,W,T){var K=data[i],M=K[0],U=K[1],F=K[2]-1,P=K[3],I=Math.floor(Math.max(0,(U-Y)*N)),L=Math.ceil(Math.min(T,Math.max(0,(F-Y)*N))),H=(Q==="Dense"?0:(0+G))*W,C,Z,D=null,O=null;if(no_label){V.fillStyle=block_color;V.fillRect(I+left_offset,H+5,L-I,1)}else{var X=K[4],S=K[5],J=K[6];C=9;Z=1;V.fillRect(I+left_offset,H,L-I,C);if(Q!=="Dense"&&P!==undefined&&U>Y){V.fillStyle=label_color;if(Y===0&&I-V.measureText(P).width<0){V.textAlign="left";V.fillText(P,L+2+left_offset,H+8)}else{V.textAlign="right";V.fillText(P,I-2+left_offset,H+8)}V.fillStyle=block_color}var R=X+" / "+S;if(U>Y&&V.measureText(R).width<(L-I)){V.fillStyle="white";V.textAlign="center";V.fillText(R,left_offset+I+(L-I)/2,H+8);V.fillStyle=block_color}}}});var z=1001,m=1002,e=1003,y=1004,l=1005;var x=function(G,D){var I=G[0],H=G[1],F=D[0],E=D[1],C;if(I<F){if(H<F){C=z}else{if(H<=E){C=e}else{C=m}}}else{if(I>E){C=z}else{if(H<=E){C=l}else{C=y}}}return C};var v=function(F,H,C,E,G,D){q.call(this,F,H,C,E,G);this.ref_seq=D};v.prototype.default_prefs=extend({},q.prototype.default_prefs,{show_insertions:false});extend(v.prototype,q.prototype,{get_row_height:function(){var C,D=this.mode;if(D==="Dense"){C=d}else{if(D==="Squish"){C=n}else{C=A;if(this.prefs.show_insertions){C*=2}}}return C},draw_read:function(Z,U,P,ae,E,Y,M,J,I){Z.textAlign="center";var X=this,D=[ae,E],S=0,aa=0,W=0;ref_seq=this.ref_seq,char_width_px=Z.canvas.manager.char_width_px;var aj=[];if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){W=Math.round(P/2)}if(!M){M=[[0,J.length]]}for(var Q=0,ac=M.length;Q<ac;Q++){var N=M[Q],F="MIDNSHP=X"[N[0]],R=N[1];if(F==="H"||F==="S"){S-=R}var K=Y+S,ai=Math.floor(Math.max(0,(K-ae)*P)),L=Math.floor(Math.max(0,(K+R-ae)*P));if(ai===L){L+=1}switch(F){case"H":break;case"S":case"M":case"=":var T=x([K,K+R],D);if(T!==z){var V=J.slice(aa,aa+R);if(W>0){Z.fillStyle=this.prefs.block_color;Z.fillRect(ai-W,I+1,L-ai,9);Z.fillStyle=h;for(var ag=0,C=V.length;ag<C;ag++){if(this.prefs.show_differences&&ref_seq){var O=ref_seq[K-ae+ag];if(!O||O.toLowerCase()===V[ag].toLowerCase()){continue}}if(K+ag>=ae&&K+ag<=E){var ah=Math.floor(Math.max(0,(K+ag-ae)*P));Z.fillText(V[ag],ah,I+9)}}}else{Z.fillStyle=this.prefs.block_color;Z.fillRect(ai,I+4,L-ai,f)}}aa+=R;S+=R;break;case"N":Z.fillStyle=h;Z.fillRect(ai-W,I+5,L-ai,1);S+=R;break;case"D":Z.fillStyle="red";Z.fillRect(ai-W,I+4,L-ai,3);S+=R;break;case"P":break;case"I":var T=x([K,K+R],D),ad=ai-W;if(T!==z){var V=J.slice(aa,aa+R);if(this.prefs.show_insertions){var H=ai-(L-ai)/2;if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){Z.fillStyle="yellow";Z.fillRect(H-W,I-9,L-ai,9);aj[aj.length]={type:"triangle",data:[ad,I+4,5]};Z.fillStyle=h;switch(T){case (e):V=V.slice(ae-K);break;case (y):V=V.slice(0,K-E);break;case (l):break;case (m):V=V.slice(ae-K,K-E);break}for(var ag=0,C=V.length;ag<C;ag++){var ah=Math.floor(Math.max(0,(K+ag-ae)*P));Z.fillText(V[ag],ah-(L-ai)/2,I)}}else{Z.fillStyle="yellow";Z.fillRect(H,I+(this.mode!=="Dense"?2:5),L-ai,(U!=="Dense"?f:u))}}else{if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){aj[aj.length]={type:"text",data:[V.length,ad,I+9]}}else{}}}aa+=R;break;case"X":aa+=R;break}}Z.fillStyle="yellow";var af,G,ak;for(var ab=0;ab<aj.length;ab++){af=aj[ab];G=af.type;ak=af.data;if(G==="text"){Z.save();Z.font="bold "+Z.font;Z.fillText(ak[0],ak[1],ak[2]);Z.restore()}else{if(G=="triangle"){s(Z,ak[0],ak[1],ak[2])}}}},draw_element:function(V,Q,I,F,Y,D,M,W,T){var L=I[0],U=I[1],E=I[2],N=I[3],H=Math.floor(Math.max(0,(U-Y)*M)),J=Math.ceil(Math.min(T,Math.max(0,(E-Y)*M))),G=(Q==="Dense"?0:(0+F))*W,Z=this.prefs.block_color,K=this.prefs.label_color,S=0;if((Q==="Pack"||this.mode==="Auto")&&M>V.canvas.manager.char_width_px){var S=Math.round(M/2)}V.fillStyle=Z;if(I[5] instanceof Array){var R=Math.floor(Math.max(0,(I[4][0]-Y)*M)),P=Math.ceil(Math.min(T,Math.max(0,(I[4][1]-Y)*M))),O=Math.floor(Math.max(0,(I[5][0]-Y)*M)),C=Math.ceil(Math.min(T,Math.max(0,(I[5][1]-Y)*M)));if(I[4][1]>=Y&&I[4][0]<=D&&I[4][2]){this.draw_read(V,Q,M,Y,D,I[4][0],I[4][2],I[4][3],G)}if(I[5][1]>=Y&&I[5][0]<=D&&I[5][2]){this.draw_read(V,Q,M,Y,D,I[5][0],I[5][2],I[5][3],G)}if(O>P){V.fillStyle=h;r(V,P-S,G+5,O-S,G+5)}}else{V.fillStyle=Z;this.draw_read(V,Q,M,Y,D,U,I[4],I[5],G)}if(Q==="Pack"&&U>Y){V.fillStyle=this.prefs.label_color;var X=1;if(X===0&&H-V.measureText(N).width<0){V.textAlign="left";V.fillText(N,J+p-S,G+8)}else{V.textAlign="right";V.fillText(N,H-p-S,G+8)}V.fillStyle=Z}}});B.SummaryTreePainter=w;B.LinePainter=c;B.LinkedFeaturePainter=t;B.ReadPainter=v;B.VariantPainter=b};(function(d){var c={};var b=function(e){return c[e]};var a=function(f,g){var e={};g(b,e);c[f]=e};a("slotting",slotting_module);a("painters",painters_module);a("trackster",trackster_module);for(key in c.trackster){d[key]=c.trackster[key]}})(window);
\ No newline at end of file
+var extend=function(){var c=arguments[0];for(var b=1;b<arguments.length;b++){var a=arguments[b];for(key in a){c[key]=a[key]}}return c};var trackster_module=function(f,P){var o=f("slotting"),F=f("painters");var V=function(W,X){this.document=W;this.default_font=X!==undefined?X:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};extend(V.prototype,{load_pattern:function(W,aa){var X=this.patterns,Y=this.dummy_context,Z=new Image();Z.src=image_path+aa;Z.onload=function(){X[W]=Y.createPattern(Z,"repeat")}},get_pattern:function(W){return this.patterns[W]},new_canvas:function(){var W=this.document.createElement("canvas");if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(W)}W.manager=this;return W}});var A=function(W,X){W.bind("drag",{handle:X,relative:true},function(ab,ac){var aa=$(this).parent();var Z=aa.children();var Y;for(Y=0;Y<Z.length;Y++){if(ac.offsetY<$(Z.get(Y)).position().top){break}}if(Y===Z.length){if(this!==Z.get(Y-1)){aa.append(this)}}else{if(this!==Z.get(Y)){$(this).insertBefore(Z.get(Y))}}})};var h=function(Y,W){var X=W-Y;return(X<=2?0.01:(X<=100?1:(X<=1000?5:10)))};var B=9,y=10,K=B+2,v=100,C=12000,I=200,r=10,E=5000,s=100,m="There was an error in indexing this dataset. ",D="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",z="No data for this chrom/contig.",p="Currently indexing... please wait",u="Tool cannot be rerun: ",a="Loading data...",Q="Ready for display",d=10,q=5,x=5;function t(W){return Math.round(W*1000)/1000}var c=function(W){this.num_elements=W;this.clear()};extend(c.prototype,{get:function(X){var W=this.key_ary.indexOf(X);if(W!==-1){this.move_key_to_end(X,W)}return this.obj_cache[X]},set:function(X,Y){if(!this.obj_cache[X]){if(this.key_ary.length>=this.num_elements){var W=this.key_ary.shift();delete this.obj_cache[W]}this.key_ary.push(X)}this.obj_cache[X]=Y;return Y},move_key_to_end:function(X,W){this.key_ary.splice(W,1);this.key_ary.push(X)},clear:function(){this.obj_cache={};this.key_ary=[]},size:function(){return this.key_ary.length}});var J=function(X,W,Y){c.call(this,X);this.track=W;this.subset=(Y!==undefined?Y:true)};extend(J.prototype,c.prototype,{load_data:function(ae,af,aa,ad,X,ac){var Z={chrom:ae,low:af,high:aa,mode:ad,resolution:X,dataset_id:this.track.dataset_id,hda_ldda:this.track.hda_ldda};$.extend(Z,ac);if(this.track.filters_manager){var ag=[];var W=this.track.filters_manager.filters;for(var ab=0;ab<W.length;ab++){ag[ag.length]=W[ab].name}Z.filter_cols=JSON.stringify(ag)}var Y=this;return $.getJSON(this.track.data_url,Z,function(ah){Y.set_data(af,aa,ad,ah)})},get_data:function(Y,W,ab,ac,X,aa){var Z=this.get(this.gen_key(W,ab,ac));if(Z){return Z}Z=this.load_data(Y,W,ab,ac,X,aa);this.set_data(W,ab,ac,Z);return Z},set_data:function(X,Y,Z,W){return this.set(this.gen_key(X,Y,Z),W)},gen_key:function(W,Y,Z){var X=W+"_"+Y+"_"+Z;return X},split_key:function(W){return W.split("_")}});var U=function(W,Z,Y,X,aa){this.container=W;this.chrom=null;this.vis_id=Y;this.dbkey=X;this.title=Z;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(aa);this.canvas_manager=new V(W.get(0).ownerDocument);this.reset()};extend(U.prototype,{init:function(Z){var Y=this.container,W=this;this.top_container=$("<div/>").addClass("top-container").appendTo(Y);this.content_div=$("<div/>").addClass("content").css("position","relative").appendTo(Y);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(Y);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_select=$("<select/>").attr({name:"chrom"}).css("width","15em").addClass("no-autocomplete").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var X=function(aa){if(aa.type==="focusout"||(aa.keyCode||aa.which)===13||(aa.keyCode||aa.which)===27){if((aa.keyCode||aa.which)!==27){W.go_to($(this).val())}$(this).hide();$(this).val("");W.location_span.show();W.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",X).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").appendTo(this.nav_controls);this.location_span.bind("click",function(){W.location_span.hide();W.chrom_select.hide();W.nav_input.val(W.chrom+":"+W.low+"-"+W.high);W.nav_input.css("display","inline-block");W.nav_input.select();W.nav_input.focus()});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a id='zoom-out' />").click(function(){W.zoom_out();W.redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a id='zoom-in' />").click(function(){W.zoom_in();W.redraw()}).appendTo(this.nav_controls);this.load_chroms({low:0},Z);this.chrom_select.bind("change",function(){W.change_chrom(W.chrom_select.val())});this.intro_div.show();this.content_div.bind("click",function(aa){$(this).find("input").trigger("blur")});this.content_div.bind("dblclick",function(aa){W.zoom_in(aa.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(aa,ab){this.current_x=ab.offsetX}).bind("drag",function(aa,ac){var ad=ac.offsetX-this.current_x;this.current_x=ac.offsetX;var ab=Math.round(ad/W.viewport_container.width()*(W.max_high-W.max_low));W.move_delta(-ab)});this.overview_close.bind("click",function(){for(var ab=0,aa=W.tracks.length;ab<aa;ab++){W.tracks[ab].is_overview=false}$(this).siblings().filter("canvas").remove();$(this).parent().css("height",W.overview_box.height());W.overview_highlight.hide();$(this).hide()});this.viewport_container.bind("draginit",function(aa,ab){if(aa.clientX>W.viewport_container.width()-16){return false}}).bind("dragstart",function(aa,ab){ab.original_low=W.low;ab.current_height=aa.clientY;ab.current_x=ab.offsetX}).bind("drag",function(ac,ae){var aa=$(this);var af=ae.offsetX-ae.current_x;var ab=aa.scrollTop()-(ac.clientY-ae.current_height);aa.scrollTop(ab);ae.current_height=ac.clientY;ae.current_x=ae.offsetX;var ad=Math.round(af/W.viewport_container.width()*(W.high-W.low));W.move_delta(ad)}).bind("mousewheel",function(ac,ae,ab,aa){if(ab){var ad=Math.round(-ab/W.viewport_container.width()*(W.high-W.low));W.move_delta(ad)}});this.top_labeltrack.bind("dragstart",function(aa,ab){return $("<div />").css({height:W.content_div.height()+W.top_labeltrack.height()+W.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ae,af){$(af.proxy).css({left:Math.min(ae.pageX,af.startX),width:Math.abs(ae.pageX-af.startX)});var ab=Math.min(ae.pageX,af.startX)-W.container.offset().left,aa=Math.max(ae.pageX,af.startX)-W.container.offset().left,ad=(W.high-W.low),ac=W.viewport_container.width();W.update_location(Math.round(ab/ac*ad)+W.low,Math.round(aa/ac*ad)+W.low)}).bind("dragend",function(af,ag){var ab=Math.min(af.pageX,ag.startX),aa=Math.max(af.pageX,ag.startX),ad=(W.high-W.low),ac=W.viewport_container.width(),ae=W.low;W.low=Math.round(ab/ac*ad)+ae;W.high=Math.round(aa/ac*ad)+ae;$(ag.proxy).remove();W.redraw()});this.add_label_track(new T(this,this.top_labeltrack));this.add_label_track(new T(this,this.nav_labeltrack));$(window).bind("resize",function(){W.resize_window()});$(document).bind("redraw",function(){W.redraw()});this.reset();$(window).trigger("resize")},update_location:function(W,X){this.location_span.text(commatize(W)+" - "+commatize(X));this.nav_input.val(this.chrom+":"+commatize(W)+"-"+commatize(X))},load_chroms:function(X,Y){X.num=s;$.extend(X,(this.vis_id!==undefined?{vis_id:this.vis_id}:{dbkey:this.dbkey}));var W=this;$.ajax({url:chrom_url,data:X,dataType:"json",success:function(aa){if(aa.chrom_info.length===0){alert("Invalid chromosome: "+X.chrom);return}if(aa.reference){W.add_label_track(new w(W))}W.chrom_data=aa.chrom_info;var ad='<option value="">Select Chrom/Contig</option>';for(var ac=0,Z=W.chrom_data.length;ac<Z;ac++){var ab=W.chrom_data[ac].chrom;ad+='<option value="'+ab+'">'+ab+"</option>"}if(aa.prev_chroms){ad+='<option value="previous">Previous '+s+"</option>"}if(aa.next_chroms){ad+='<option value="next">Next '+s+"</option>"}W.chrom_select.html(ad);if(Y){Y()}W.chrom_start_index=aa.start_index},error:function(){alert("Could not load chroms for this dbkey:",W.dbkey)}})},change_chrom:function(aa,X,ac){if(!aa||aa==="None"){return}var Z=this;if(aa==="previous"){Z.load_chroms({low:this.chrom_start_index-s});return}if(aa==="next"){Z.load_chroms({low:this.chrom_start_index+s});return}var ab=$.grep(Z.chrom_data,function(ae,af){return ae.chrom===aa})[0];if(ab===undefined){Z.load_chroms({chrom:aa},function(){Z.change_chrom(aa,X,ac)});return}else{if(aa!==Z.chrom){Z.chrom=aa;if(!Z.chrom){Z.intro_div.show()}else{Z.intro_div.hide()}Z.chrom_select.val(Z.chrom);Z.max_high=ab.len-1;Z.reset();Z.redraw(true);for(var ad=0,W=Z.tracks.length;ad<W;ad++){var Y=Z.tracks[ad];if(Y.init){Y.init()}}}if(X!==undefined&&ac!==undefined){Z.low=Math.max(X,0);Z.high=Math.min(ac,Z.max_high)}Z.reset_overview();Z.redraw()}},go_to:function(aa){var ae=this,W,Z,X=aa.split(":"),ac=X[0],ad=X[1];if(ad!==undefined){try{var ab=ad.split("-");W=parseInt(ab[0].replace(/,/g,""),10);Z=parseInt(ab[1].replace(/,/g,""),10)}catch(Y){return false}}ae.change_chrom(ac,W,Z)},move_fraction:function(Y){var W=this;var X=W.high-W.low;this.move_delta(Y*X)},move_delta:function(Y){var W=this;var X=W.high-W.low;if(W.low-Y<W.max_low){W.low=W.max_low;W.high=W.max_low+X}else{if(W.high-Y>W.max_high){W.high=W.max_high;W.low=W.max_high-X}else{W.high-=Y;W.low-=Y}}W.redraw()},add_track:function(W){W.view=this;W.track_id=this.track_id_counter;this.tracks.push(W);if(W.init){W.init()}W.container_div.attr("id","track_"+W.track_id);A(W.container_div,".draghandle");this.track_id_counter+=1;this.num_tracks+=1},add_label_track:function(W){W.view=this;this.label_tracks.push(W)},remove_track:function(W){this.has_changes=true;W.container_div.fadeOut("slow",function(){$(this).remove()});delete this.tracks[this.tracks.indexOf(W)];this.num_tracks-=1},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},redraw:function(ad){var ac=this.high-this.low,ab=this.low,X=this.high;if(ab<this.max_low){ab=this.max_low}if(X>this.max_high){X=this.max_high}if(this.high!==0&&ac<this.min_separation){X=ab+this.min_separation}this.low=Math.floor(ab);this.high=Math.ceil(X);this.resolution=Math.pow(10,Math.ceil(Math.log((this.high-this.low)/200)/Math.LN10));this.zoom_res=Math.pow(r,Math.max(0,Math.ceil(Math.log(this.resolution,r)/Math.log(r))));var W=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var aa=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ae=13;this.overview_box.css({left:W,width:Math.max(ae,aa)}).show();if(aa<ae){this.overview_box.css("left",W-(ae-aa)/2)}if(this.overview_highlight){this.overview_highlight.css({left:W,width:aa})}this.update_location(this.low,this.high);if(!ad){for(var Y=0,Z=this.tracks.length;Y<Z;Y++){if(this.tracks[Y]&&this.tracks[Y].enabled){this.tracks[Y].draw()}}for(Y=0,Z=this.label_tracks.length;Y<Z;Y++){this.label_tracks[Y].draw()}}},zoom_in:function(X,Y){if(this.max_high===0||this.high-this.low<this.min_separation){return}var Z=this.high-this.low,aa=Z/2+this.low,W=(Z/this.zoom_factor)/2;if(X){aa=X/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(aa-W);this.high=Math.round(aa+W);this.redraw()},zoom_out:function(){if(this.max_high===0){return}var X=this.high-this.low,Y=X/2+this.low,W=(X*this.zoom_factor)/2;this.low=Math.round(Y-W);this.high=Math.round(Y+W);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 n=function(X,aa){this.track=X;this.name=aa.name;this.params=[];var ai=aa.params;for(var Y=0;Y<ai.length;Y++){var ad=ai[Y],W=ad.name,ah=ad.label,Z=unescape(ad.html),af=ad.type;if(af==="number"){this.params[this.params.length]=new g(W,ah,Z,ad.min,ad.max)}else{if(af=="select"){this.params[this.params.length]=new H(W,ah,Z)}else{console.log("WARNING: unrecognized tool parameter type:",W,af)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(ak){ak.stopPropagation()}).bind("click",function(ak){ak.stopPropagation()}).bind("dblclick",function(ak){ak.stopPropagation()});var ag=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var ae=this.params;var ab=this;$.each(this.params,function(al,ao){var an=$("<div>").addClass("param-row").appendTo(ab.parent_div);var ak=$("<div>").addClass("param-label").text(ao.label).appendTo(an);var am=$("<div/>").addClass("slider").html(ao.html).appendTo(an);$("<div style='clear: both;'/>").appendTo(an)});this.parent_div.find("input").click(function(){$(this).select()});var aj=$("<div>").addClass("slider-row").appendTo(this.parent_div);var ac=$("<input type='submit'>").attr("value","Run").appendTo(aj);var ab=this;ac.click(function(){ab.run()})};extend(n.prototype,{get_param_values_dict:function(){var W={};this.parent_div.find(":input").each(function(){var X=$(this).attr("name"),Y=$(this).val();W[X]=JSON.stringify(Y)});return W},get_param_values:function(){var X=[];var W={};this.parent_div.find(":input").each(function(){var Y=$(this).attr("name"),Z=$(this).val();if(Y){X[X.length]=Z}});return X},run:function(){var X={dataset_id:this.track.original_dataset_id,chrom:this.track.view.chrom,low:this.track.view.low,high:this.track.view.high,tool_id:this.name};$.extend(X,this.get_param_values_dict());var Z=this.track,Y=X.tool_id+Z.tool_region_and_parameters_str(X.chrom,X.low,X.high),aa;if(Z.track_type==="FeatureTrack"){aa=new M(Y,view,Z.hda_ldda,undefined,{},{},Z)}this.track.add_track(aa);aa.content_div.text("Starting job.");var W=function(){$.getJSON(run_tool_url,X,function(ab){if(ab==="no converter"){aa.container_div.addClass("error");aa.content_div.text(D)}else{if(ab.error){aa.container_div.addClass("error");aa.content_div.text(u+ab.message)}else{if(ab==="pending"){aa.container_div.addClass("pending");aa.content_div.text("Converting input data so that it can be easily reused.");setTimeout(W,2000)}else{aa.dataset_id=ab.dataset_id;aa.content_div.text("Running job.");aa.init()}}}})};W()}});var H=function(X,W,Y){this.name=X;this.label=W;this.html=Y};var g=function(Y,X,aa,Z,W){H.call(this,Y,X,aa);this.min=Z;this.max=W};var j=function(X,W,Y){this.name=X;this.index=W;this.value=Y};var N=function(X,W){this.name=X;this.index=W;this.low=-Number.MAX_VALUE;this.high=Number.MAX_VALUE;this.min=Number.MAX_VALUE;this.max=-Number.MAX_VALUE;this.slider=null;this.slider_label=null};extend(N.prototype,{applies_to:function(W){if(W.length>this.index){return true}return false},keep:function(W){if(!this.applies_to(W)){return true}return(W[this.index]>=this.low&&W[this.index]<=this.high)},update_attrs:function(X){var W=false;if(!this.applies_to(X)){return W}if(X[this.index]<this.min){this.min=Math.floor(X[this.index]);W=true}if(X[this.index]>this.max){this.max=Math.ceil(X[this.index]);W=true}return W},update_ui_elt:function(){var X=this.slider.slider("option","min"),W=this.slider.slider("option","max");if(this.min<X||this.max>W){this.slider.slider("option","min",this.min);this.slider.slider("option","max",this.max);this.slider.slider("option","step",h(this.min,this.max));this.slider.slider("option","values",[this.min,this.max])}}});var S=function(Y,ae){this.track=Y;this.filters=[];for(var aa=0;aa<ae.length;aa++){var W=ae[aa];var X=W.name,ad=W.type,ab=W.index;if(ad==="int"||ad==="float"){this.filters[aa]=new N(X,ab)}else{this.filters[aa]=new j(X,ab,ad)}}var ac=function(af,ag,ah){af.click(function(){var ai=ag.text();max=parseFloat(ah.slider("option","max")),input_size=(max<=1?4:max<=1000000?max.toString().length:6),multi_value=false;if(ah.slider("option","values")){input_size=2*input_size+1;multi_value=true}ag.text("");$("<input type='text'/>").attr("size",input_size).attr("maxlength",input_size).attr("value",ai).appendTo(ag).focus().select().click(function(aj){aj.stopPropagation()}).blur(function(){$(this).remove();ag.text(ai)}).keyup(function(an){if(an.keyCode===27){$(this).trigger("blur")}else{if(an.keyCode===13){var al=ah.slider("option","min"),aj=ah.slider("option","max"),am=function(ao){return(isNaN(ao)||ao>aj||ao<al)},ak=$(this).val();if(!multi_value){ak=parseFloat(ak);if(am(ak)){alert("Parameter value must be in the range ["+al+"-"+aj+"]");return $(this)}}else{ak=ak.split("-");ak=[parseFloat(ak[0]),parseFloat(ak[1])];if(am(ak[0])||am(ak[1])){alert("Parameter value must be in the range ["+al+"-"+aj+"]");return $(this)}}ah.slider((multi_value?"values":"value"),ak)}}})})};this.parent_div=$("<div/>").addClass("filters").hide();this.parent_div.bind("drag",function(af){af.stopPropagation()}).bind("click",function(af){af.stopPropagation()}).bind("dblclick",function(af){af.stopPropagation()});var Z=this;$.each(this.filters,function(al,ag){var ai=$("<div/>").addClass("slider-row").appendTo(Z.parent_div);var af=$("<div/>").addClass("slider-label").appendTo(ai);var an=$("<span/>").addClass("slider-name").text(ag.name+" ").appendTo(af);var ah=$("<span/>");var aj=$("<span/>").addClass("slider-value").appendTo(af).append("[").append(ah).append("]");var am=$("<div/>").addClass("slider").appendTo(ai);ag.control_element=$("<div/>").attr("id",ag.name+"-filter-control").appendTo(am);var ak=[0,0];ag.control_element.slider({range:true,min:Number.MAX_VALUE,max:-Number.MIN_VALUE,values:[0,0],slide:function(ao,ap){ak=ap.values;ah.text(ap.values[0]+"-"+ap.values[1]);setTimeout(function(){if(ap.values[0]==ak[0]&&ap.values[1]==ak[1]){var aq=ap.values;ah.text(aq[0]+"-"+aq[1]);ag.low=aq[0];ag.high=aq[1];Z.track.draw(true,true)}},50)},change:function(ao,ap){ag.control_element.slider("option","slide").call(ag.control_element,ao,ap)}});ag.slider=ag.control_element;ag.slider_label=ah;ac(aj,ah,ag.control_element);$("<div style='clear: both;'/>").appendTo(ai)})};var R=function(W){this.track=W.track;this.params=W.params;this.values={};if(W.saved_values){this.restore_values(W.saved_values)}this.onchange=W.onchange};extend(R.prototype,{restore_values:function(W){var X=this;$.each(this.params,function(Y,Z){if(W[Z.key]!==undefined){X.values[Z.key]=W[Z.key]}else{X.values[Z.key]=Z.default_value}})},build_form:function(){var X=this;var W=$("<div />");$.each(this.params,function(ab,Z){if(!Z.hidden){var Y="param_"+ab;var ag=$("<div class='form-row' />").appendTo(W);ag.append($("<label />").attr("for",Y).text(Z.label+":"));if(Z.type==="bool"){ag.append($('<input type="checkbox" />').attr("id",Y).attr("name",Y).attr("checked",X.values[Z.key]))}else{if(Z.type==="color"){var ad=X.values[Z.key];var ac=$("<input />").attr("id",Y).attr("name",Y).val(ad);var ae=$("<div class='tipsy tipsy-north' style='position: absolute;' />").hide();var aa=$("<div style='background-color: black; padding: 10px;'></div>").appendTo(ae);var af=$("<div/>").appendTo(aa).farbtastic({width:100,height:100,callback:ac,color:ad});$("<div />").append(ac).append(ae).appendTo(ag).bind("click",function(ah){ae.css({left:$(this).position().left+($(ac).width()/2)-60,top:$(this).position().top+$(this.height)}).show();$(document).bind("click.color-picker",function(){ae.hide();$(document).unbind("click.color-picker")});ah.stopPropagation()})}else{ag.append($("<input />").attr("id",Y).attr("name",Y).val(X.values[Z.key]))}}}});return W},update_from_form:function(W){var Y=this;var X=false;$.each(this.params,function(Z,ab){if(!ab.hidden){var ac="param_"+Z;var aa=W.find("#"+ac).val();if(ab.type==="float"){aa=parseFloat(aa)}else{if(ab.type==="int"){aa=parseInt(aa)}else{if(ab.type==="bool"){aa=W.find("#"+ac).is(":checked")}}}if(aa!==Y.values[ab.key]){Y.values[ab.key]=aa;X=true}}});if(X){this.onchange()}}});var b=function(W,X){this.track=W;this.canvas=X};var k=function(X,W,aa,Y,Z){this.name=X;this.view=W;this.parent_element=aa;this.data_url=(Y?Y:default_data_url);this.data_url_extra_params={};this.data_query_wait=(Z?Z:E);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(k.prototype,{init:function(){var W=this;W.enabled=false;W.tile_cache.clear();W.data_cache.clear();W.initial_canvas=undefined;W.content_div.css("height","auto");W.container_div.removeClass("nodata error pending");if(!W.dataset_id){return}$.getJSON(converted_datasets_state_url,{hda_ldda:W.hda_ldda,dataset_id:W.dataset_id,chrom:W.view.chrom},function(X){if(!X||X==="error"||X.kind==="error"){W.container_div.addClass("error");W.content_div.text(m);if(X.message){var Z=W.view.tracks.indexOf(W);var Y=$(" <a href='javascript:void(0);'></a>").text("View error").bind("click",function(){show_modal("Trackster Error","<pre>"+X.message+"</pre>",{Close:hide_modal})});W.content_div.append(Y)}}else{if(X==="no converter"){W.container_div.addClass("error");W.content_div.text(D)}else{if(X==="no data"||(X.data!==undefined&&(X.data===null||X.data.length===0))){W.container_div.addClass("nodata");W.content_div.text(z)}else{if(X==="pending"){W.container_div.addClass("pending");W.content_div.text(p);setTimeout(function(){W.init()},W.data_query_wait)}else{if(X.status==="data"){if(X.valid_chroms){W.valid_chroms=X.valid_chroms;W.make_name_popup_menu()}W.content_div.text(Q);if(W.view.chrom){W.content_div.text("");W.content_div.css("height",W.height_px+"px");W.enabled=true;$.when(W.predraw_init()).done(function(){W.container_div.removeClass("nodata error pending");W.draw()})}}}}}}})},predraw_init:function(){},update_name:function(W){this.old_name=this.name;this.name=W;this.name_div.text(this.name)},revert_name:function(){this.name=this.old_name;this.name_div.text(this.name)}});var G=function(ae,ac,af){var X=this,ag=X.view;this.filters_manager=(ae!==undefined?new S(this,ae):undefined);this.filters_available=false;this.filters_visible=false;this.tool=(ac!==undefined&&obj_length(ac)>0?new n(this,ac):undefined);this.parent_track=af;this.child_tracks=[];if(X.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}X.child_tracks_container=$("<div/>").addClass("child-tracks-container").hide();X.container_div.append(X.child_tracks_container);if(this.filters_manager){this.filters_div=this.filters_manager.parent_div;this.header_div.after(this.filters_div)}if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}if(X.display_modes!==undefined){if(X.mode_div===undefined){X.mode_div=$("<div class='right-float menubutton popup' />").appendTo(X.header_div);var Z=(X.track_config&&X.track_config.values.mode?X.track_config.values.mode:X.display_modes[0]);X.mode=Z;X.mode_div.text(Z);var Y=function(ah){X.mode_div.text(ah);X.mode=ah;X.track_config.values.mode=ah;X.tile_cache.clear();X.draw()};var W={};for(var aa=0,ad=X.display_modes.length;aa<ad;aa++){var ab=X.display_modes[aa];W[ab]=function(ah){return function(){Y(ah)}}(ab)}make_popupmenu(X.mode_div,W)}else{X.mode_div.hide()}}this.make_name_popup_menu()};extend(G.prototype,k.prototype,{make_name_popup_menu:function(){var X=this;var W={};W["Edit configuration"]=function(){var ad=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ab=function(){X.track_config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ac=function(ae){if((ae.keyCode||ae.which)===27){ad()}else{if((ae.keyCode||ae.which)===13){ab()}}};$(window).bind("keypress.check_enter_esc",ac);show_modal("Configure Track",X.track_config.build_form(),{Cancel:ad,OK:ab})};if(X.filters_available>0){var aa=(X.filters_div.is(":visible")?"Hide filters":"Show filters");W[aa]=function(){X.filters_visible=(X.filters_div.is(":visible"));X.filters_div.toggle();X.make_name_popup_menu()}}if(X.tool){var aa=(X.dynamic_tool_div.is(":visible")?"Hide tool":"Show tool");W[aa]=function(){if(!X.dynamic_tool_div.is(":visible")){X.update_name(X.name+X.tool_region_and_parameters_str())}else{menu_option_text="Show dynamic tool";X.revert_name()}X.dynamic_tool_div.toggle();X.make_name_popup_menu()}}if(X.valid_chroms){W["List chrom/contigs with data"]=function(){show_modal("Chrom/contigs with data","<p>"+X.valid_chroms.join("<br/>")+"</p>",{Close:function(){hide_modal()}})}}var Y=view;var Z=function(){$("#no-tracks").show()};if(this.parent_track){Y=this.parent_track;Z=function(){}}W.Remove=function(){Y.remove_track(X);if(Y.num_tracks===0){Z()}};make_popupmenu(X.name_div,W)},draw:function(W,Z){var an=this.view.low,ac=this.view.high,ae=ac-an,ag=this.view.container.width(),ab=ag/ae,ah=this.view.resolution,aa=$("<div style='position: relative;'></div>");if(!Z){this.content_div.children().remove()}this.content_div.append(aa);this.max_height=0;var aj=Math.floor(an/ah/I);var Y={};while((aj*I*ah)<ac){var am=ag+"_"+ab+"_"+aj;var ad=this.tile_cache.get(am);var ak=aj*I*this.view.resolution;var X=ak+I*this.view.resolution;if(!W&&ad){this.show_tile(ad,aa,ak,ab)}else{this.delayed_draw(W,am,ak,X,aj,ah,aa,ab,Y)}aj+=1}var af=this;var al=setInterval(function(){if(obj_length(Y)===0){clearInterval(al);if(Z){var aq=af.content_div.children();var ap=false;for(var ar=aq.length-1,ao=0;ar>=ao;ar--){var aw=$(aq[ar]);if(ap){aw.remove()}else{if(aw.children().length!==0){ap=true}}}}if(af.filters_manager){var au=af.filters_manager.filters;for(var av=0;av<au.length;av++){au[av].update_ui_elt()}var at=false;if(af.example_feature){for(var av=0;av<au.length;av++){if(au[av].applies_to(af.example_feature)){at=true;break}}}if(af.filters_available!==at){af.filters_available=at;if(!af.filters_available){af.filters_div.hide()}af.make_name_popup_menu()}}}},50);for(var ai=0;ai<this.child_tracks.length;ai++){this.child_tracks[ai].draw(W,Z)}},delayed_draw:function(X,ae,ac,ag,Y,aa,af,ah,ab){var Z=this;var ad=function(ap,ai,ak,aj,an,ao,al){returned_tile=Z.draw_tile(ai,ak,aj,an,ao,al);var am=$("<div class='track-tile'>").prepend(returned_tile);tile_element=am;Z.tile_cache.set(ae,tile_element);Z.show_tile(tile_element,an,ac,ao);delete ab[ap]};var W=setTimeout(function(){if(ac<=Z.view.high&&ag>=Z.view.low){var ai=(X?undefined:Z.tile_cache.get(ae));if(ai){Z.show_tile(ai,af,ac,ah);delete ab[W]}else{$.when(Z.data_cache.get_data(view.chrom,ac,ag,Z.mode,aa,Z.data_url_extra_params)).then(function(aj){if(view.reference_track&&ah>view.canvas_manager.char_width_px){$.when(view.reference_track.data_cache.get_data(view.chrom,ac,ag,Z.mode,aa,view.reference_track.data_url_extra_params)).then(function(ak){ad(W,aj,aa,Y,af,ah,ak)})}else{ad(W,aj,aa,Y,af,ah)}})}}},50);ab[W]=true},show_tile:function(W,ab,Z,ac){var X=this;var Y=this.view.high-this.view.low,aa=(Z-this.view.low)*ac;if(this.left_offset){aa-=this.left_offset}W.css({position:"absolute",top:0,left:aa,height:""});ab.append(W);X.max_height=Math.max(X.max_height,W.height());X.content_div.css("height",X.max_height+"px");ab.children().css("height",X.max_height+"px")},set_overview:function(){var W=this.view;if(this.initial_canvas&&this.is_overview){W.overview_close.show();W.overview_viewport.append(this.initial_canvas);W.overview_highlight.show().height(this.initial_canvas.height());W.overview_viewport.height(this.initial_canvas.height()+W.overview_box.height())}$(window).trigger("resize")},tool_region_and_parameters_str:function(Y,W,Z){var X=this,aa=(Y!==undefined&&W!==undefined&&Z!==undefined?Y+":"+W+"-"+Z:"all");return" - region=["+aa+"], parameters=["+X.tool.get_param_values().join(", ")+"]"},add_track:function(W){W.track_id=this.track_id+"_"+this.child_tracks.length;W.container_div.attr("id","track_"+W.track_id);this.child_tracks_container.append(W.container_div);A(W.container_div,".child-track-icon");if(!$(this.child_tracks_container).is(":visible")){this.child_tracks_container.show()}this.child_tracks.push(W);this.view.has_changes=true},remove_track:function(W){W.container_div.fadeOut("slow",function(){$(this).remove()})}});var T=function(W,X){this.track_type="LabelTrack";this.hidden=true;k.call(this,null,W,X);this.container_div.addClass("label-track")};extend(T.prototype,k.prototype,{draw:function(){var Y=this.view,Z=Y.high-Y.low,ac=Math.floor(Math.pow(10,Math.floor(Math.log(Z)/Math.log(10)))),W=Math.floor(Y.low/ac)*ac,aa=this.view.container.width(),X=$("<div style='position: relative; height: 1.3em;'></div>");while(W<Y.high){var ab=(W-Y.low)/Z*aa;X.append($("<div class='label'>"+commatize(W)+"</div>").css({position:"absolute",left:ab-1}));W+=ac}this.content_div.children(":first").remove();this.content_div.append(X)}});var w=function(W){this.track_type="ReferenceTrack";this.hidden=true;k.call(this,null,W,W.top_labeltrack);G.call(this);W.reference_track=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_url=reference_url;this.data_url_extra_params={dbkey:W.dbkey};this.data_cache=new J(x,this,false);this.tile_cache=new c(q)};extend(w.prototype,G.prototype,{draw_tile:function(ag,ab,X,ad,ah){var aa=this,Y=I*ab;if(ah>this.view.canvas_manager.char_width_px){if(ag===null){aa.content_div.css("height","0px");return}var Z=this.view.canvas_manager.new_canvas();var af=Z.getContext("2d");Z.width=Math.ceil(Y*ah+aa.left_offset);Z.height=aa.height_px;af.font=af.canvas.manager.default_font;af.textAlign="center";for(var ac=0,ae=ag.length;ac<ae;ac++){var W=Math.round(ac*ah);af.fillText(ag[ac],W+aa.left_offset,10)}return Z}this.content_div.css("height","0px")}});var l=function(aa,Y,ab,W,Z){var X=this;this.track_type="LineTrack";this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";k.call(this,aa,Y,Y.viewport_container);G.call(this);this.min_height_px=16;this.max_height_px=400;this.height_px=80;this.hda_ldda=ab;this.dataset_id=W;this.original_dataset_id=W;this.data_cache=new J(x,this);this.tile_cache=new c(q);this.track_config=new R({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:Z,onchange:function(){X.vertical_range=X.prefs.max_value-X.prefs.min_value;$("#linetrack_"+X.track_id+"_minval").text(X.prefs.min_value);$("#linetrack_"+X.track_id+"_maxval").text(X.prefs.max_value);X.tile_cache.clear();X.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;this.add_resize_handle()};extend(l.prototype,G.prototype,{add_resize_handle:function(){var W=this;var Z=false;var Y=false;var X=$("<div class='track-resize'>");$(W.container_div).hover(function(){Z=true;X.show()},function(){Z=false;if(!Y){X.hide()}});X.hide().bind("dragstart",function(aa,ab){Y=true;ab.original_height=$(W.content_div).height()}).bind("drag",function(ab,ac){var aa=Math.min(Math.max(ac.original_height+ac.deltaY,W.min_height_px),W.max_height_px);$(W.content_div).css("height",aa);W.height_px=aa;W.draw(true)}).bind("dragend",function(aa,ab){W.tile_cache.clear();Y=false;if(!Z){X.hide()}W.track_config.values.height=W.height_px}).appendTo(W.container_div)},predraw_init:function(){var W=this,X=W.view.tracks.indexOf(W);W.vertical_range=undefined;return $.getJSON(W.data_url,{stats:true,chrom:W.view.chrom,low:null,high:null,hda_ldda:W.hda_ldda,dataset_id:W.dataset_id},function(Y){W.container_div.addClass("line-track");var aa=Y.data;if(isNaN(parseFloat(W.prefs.min_value))||isNaN(parseFloat(W.prefs.max_value))){W.prefs.min_value=aa.min;W.prefs.max_value=aa.max;$("#track_"+X+"_minval").val(W.prefs.min_value);$("#track_"+X+"_maxval").val(W.prefs.max_value)}W.vertical_range=W.prefs.max_value-W.prefs.min_value;W.total_frequency=aa.total_frequency;W.container_div.find(".yaxislabel").remove();var ab=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+X+"_minval").text(t(W.prefs.min_value));var Z=$("<div />").addClass("yaxislabel").attr("id","linetrack_"+X+"_maxval").text(t(W.prefs.max_value));Z.css({position:"absolute",top:"24px",left:"10px"});Z.prependTo(W.container_div);ab.css({position:"absolute",bottom:"2px",left:"10px"});ab.prependTo(W.container_div)})},draw_tile:function(ah,aa,X,ae,ag){if(this.vertical_range===undefined){return}var ab=X*I*aa,Z=I*aa,W=Math.ceil(Z*ag),ad=this.height_px;var Y=this.view.canvas_manager.new_canvas();Y.width=W,Y.height=ad;var af=Y.getContext("2d");var ac=new F.LinePainter(ah.data,ab,ab+Z,this.prefs,this.mode);ac.draw(af,W,ad);return Y}});var e=function(W,ab,aa,ae,ad,Y,Z,ac){var X=this;this.track_type="FeatureTrack";this.display_modes=["Auto","Dense","Squish","Pack"];this.track_config=new R({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:ad,onchange:function(){X.tile_cache.clear();X.draw()}});this.prefs=this.track_config.values;k.call(this,W,ab,ab.viewport_container);G.call(this,Y,Z,ac);this.height_px=0;this.container_div.addClass("feature-track");this.hda_ldda=aa;this.dataset_id=ae;this.original_dataset_id=ae;this.zo_slots={};this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.inc_slots={};this.start_end_dct={};this.tile_cache=new c(d);this.data_cache=new J(20,this);this.left_offset=200;this.painter=F.LinkedFeaturePainter};extend(e.prototype,G.prototype,{update_auto_mode:function(W){if(this.mode=="Auto"){if(W=="no_detail"){W="feature spans"}else{if(W=="summary_tree"){W="coverage histogram"}}this.mode_div.text("Auto ("+W+")")}},incremental_slots:function(aa,X,Z){var Y=this.view.canvas_manager.dummy_context,W=this.inc_slots[aa];if(!W||(W.mode!==Z)){W=new (o.FeatureSlotter)(aa,Z==="Pack",v,function(ab){return Y.measureText(ab)});W.mode=Z;this.inc_slots[aa]=W}return W.slot_features(X)},draw_tile:function(aj,ar,aw,ae,ag,Z){var ao=this,ay=aw*I*ar,X=(aw+1)*I*ar,al=X-ay,ap=Math.ceil(al*ag),an=this.mode,aC=25,aa=this.left_offset,ak,ab;if(an==="Auto"){if(aj.dataset_type==="summary_tree"){an=aj.dataset_type}else{if(aj.extra_info==="no_detail"){an="no_detail"}else{var aB=aj.data;if(this.view.high-this.view.low>C){an="Squish"}else{an="Pack"}}}this.update_auto_mode(an)}if(an==="summary_tree"){ab=this.summary_draw_height;ae.parent().css("height",Math.max(this.height_px,ab)+"px");this.container_div.find(".yaxislabel").remove();var W=$("<div />").addClass("yaxislabel");W.text(aj.max);W.css({position:"absolute",top:"22px",left:"10px"});W.prependTo(this.container_div);var Y=this.view.canvas_manager.new_canvas();Y.width=ap+aa;Y.height=ab+K;var az=new F.SummaryTreePainter(aj,ay,X,this.prefs);var aq=Y.getContext("2d");aq.translate(aa,K);az.draw(aq,ap,ab);return Y}var ak,ad=1;if(an==="no_detail"||an==="Squish"||an==="Pack"){ad=this.incremental_slots(ag,aj.data,an);ak=this.inc_slots[ag].slots}var af=[];if(aj.data){var ah=this.filters_manager.filters;for(var at=0,av=aj.data.length;at<av;at++){var ac=aj.data[at];var au=false;var ai;for(var ax=0,aA=ah.length;ax<aA;ax++){ai=ah[ax];ai.update_attrs(ac);if(!ai.keep(ac)){au=true;break}}if(!au){af.push(ac)}}}var az=new (this.painter)(af,ay,X,this.prefs,an,Z);var ab=az.get_required_height(ad)+y;var Y=this.view.canvas_manager.new_canvas();Y.width=ap+aa;Y.height=ab;ae.parent().css("height",Math.max(this.height_px,ab)+"px");var aq=Y.getContext("2d");aq.fillStyle=this.prefs.block_color;aq.font=aq.canvas.manager.default_font;aq.textAlign="right";this.container_div.find(".yaxislabel").remove();if(aj.message){$(Y).css({"border-top":"1px solid red"});aq.fillStyle="red";aq.textAlign="left";var am=aq.textBaseline;aq.textBaseline="top";aq.fillText(aj.message,aa,0);aq.textBaseline=am;if(!aj.data){return Y}}this.example_feature=(aj.data.length?aj.data[0]:undefined);aq.translate(aa,y);az.draw(aq,ap,ab,ak);return Y}});var L=function(Z,X,ab,W,Y,aa){e.call(this,Z,X,ab,W,Y,aa);this.track_type="VcfTrack";this.painter=F.VariantPainter};extend(L.prototype,G.prototype,e.prototype);var O=function(Z,X,ab,W,Y,aa){e.call(this,Z,X,ab,W,Y,aa);this.track_config=new R({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_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true},],saved_values:Y,onchange:function(){this.track.tile_cache.clear();this.track.draw()}});this.prefs=this.track_config.values;this.track_type="ReadTrack";this.painter=F.ReadPainter;this.make_name_popup_menu()};extend(O.prototype,G.prototype,e.prototype);var M=function(aa,Y,ac,W,Z,ab,X){e.call(this,aa,Y,ac,W,Z,ab,{},X);this.track_type="ToolDataFeatureTrack";this.data_url=raw_data_url;this.data_query_wait=1000;this.dataset_check_url=dataset_state_url};extend(M.prototype,G.prototype,e.prototype,{predraw_init:function(){var X=this;var W=function(){if(X.data_cache.size()===0){setTimeout(W,300)}else{X.data_url=default_data_url;X.data_query_wait=E;X.dataset_state_url=converted_datasets_state_url;$.getJSON(X.dataset_state_url,{dataset_id:X.dataset_id,hda_ldda:X.hda_ldda},function(Y){})}};W()}});P.View=U;P.LineTrack=l;P.FeatureTrack=e;P.ReadTrack=O};var slotting_module=function(c,b){var d=2,a=5;b.FeatureSlotter=function(h,g,e,f){this.slots={};this.start_end_dct={};this.w_scale=h;this.include_label=g;this.max_rows=e;this.measureText=f};extend(b.FeatureSlotter.prototype,{slot_features:function(l){var o=this.w_scale,r=this.slots,g=this.start_end_dct,x=[],z=[],m=0,y=this.max_rows;for(var v=0,w=l.length;v<w;v++){var k=l[v],n=k[0];if(r[n]!==undefined){m=Math.max(m,r[n]);z.push(r[n])}else{x.push(v)}}var p=function(F,G){for(var E=0;E<=y;E++){var C=false,H=g[E];if(H!==undefined){for(var B=0,D=H.length;B<D;B++){var A=H[B];if(G>A[0]&&F<A[1]){C=true;break}}}if(!C){return E}}return -1};for(var v=0,w=x.length;v<w;v++){var k=l[x[v]],n=k[0],t=k[1],e=k[2],q=k[3],f=Math.floor(t*o),j=Math.ceil(e*o),u=this.measureText(q).width,h;if(q!==undefined&&this.include_label){u+=(d+a);if(f-u>=0){f-=u;h="left"}else{j+=u;h="right"}}var s=p(f,j);if(s>=0){if(g[s]===undefined){g[s]=[]}g[s].push([f,j]);r[n]=s;m=Math.max(m,s)}else{}}return m+1}})};var painters_module=function(k,B){var r=function(M,E,K,D,J,H){if(H===undefined){H=4}var G=D-E;var F=J-K;var I=Math.floor(Math.sqrt(G*G+F*F)/H);var N=G/I;var L=F/I;var C;for(C=0;C<I;C++,E+=N,K+=L){if(C%2!==0){continue}M.fillRect(E,K,H,1)}};var s=function(E,D,C,H){var G=D-H/2,F=D+H/2,I=C-Math.sqrt(H*3/2);E.beginPath();E.moveTo(G,I);E.lineTo(F,I);E.lineTo(D,C);E.lineTo(G,I);E.strokeStyle=this.fillStyle;E.fill();E.stroke();E.closePath()};var o=function(E,G,C,D,F){this.data=E;this.view_start=G;this.view_end=C;this.prefs=extend({},this.default_prefs,D);this.mode=F};o.prototype.default_prefs={};var w=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};w.prototype.default_prefis={show_counts:false};w.prototype.draw=function(P,C,O){var H=this.view_start,R=this.view_end-this.view_start,Q=C/R;var M=this.data.data,L=this.data.delta,J=this.data.max,E=O;delta_x_px=Math.ceil(L*Q);P.save();for(var F=0,G=M.length;F<G;F++){var K=Math.floor((M[F][0]-H)*Q);var I=M[F][1];if(!I){continue}var N=I/J*O;P.fillStyle="black";P.fillRect(K,E-N,delta_x_px,N);var D=4;if(this.prefs.show_counts&&(P.measureText(I).width+D)<delta_x_px){P.fillStyle="#666";P.textAlign="center";P.fillText(I,K+(delta_x_px/2),10)}}P.restore()};var c=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};c.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};c.prototype.draw=function(R,Q,O){var J=false,K=this.prefs.min_value,H=this.prefs.max_value,N=H-K,D=O,E=this.view_start,P=this.view_end-this.view_start,F=Q/P,L=this.mode,V=this.data;R.save();var W=Math.round(O+K/N*O);if(L!=="Intensity"){R.fillStyle="#aaa";R.fillRect(0,W,Q,1)}R.beginPath();R.fillStyle=this.prefs.color;var U,I,G;if(V.length>1){G=Math.ceil((V[1][0]-V[0][0])*F)}else{G=10}for(var S=0,T=V.length;S<T;S++){U=Math.round((V[S][0]-E)*F);I=V[S][1];if(I===null){if(J&&L==="Filled"){R.lineTo(U,D)}J=false;continue}if(I<K){I=K}else{if(I>H){I=H}}if(L==="Histogram"){I=Math.round(I/N*D);R.fillRect(U,W,G,-I)}else{if(L==="Intensity"){I=255-Math.floor((I-K)/N*255);R.fillStyle="rgb("+I+","+I+","+I+")";R.fillRect(U,0,G,D)}else{I=Math.round(D-(I-K)/N*D);if(J){R.lineTo(U,I)}else{J=true;if(L==="Filled"){R.moveTo(U,D);R.lineTo(U,I)}else{R.moveTo(U,I)}}}}}if(L==="Filled"){if(J){R.lineTo(U,W);R.lineTo(0,W)}R.fill()}else{R.stroke()}var C=-1,M=-1;R.fillStyle=this.prefs.overflow_color;for(var S=0,T=V.length;S<T;S++){I=V[S][1];U=Math.round((V[S][0]-E)*F);x_minus_scaled=Math.round((V[S][0]-1-E)*F);if(M>=0&&(I===null||I<H)){R.fillRect(M,0,x_minus_scaled-M+1,2);M=-1}else{if(C>=0&&(I===null||I>K)){R.fillRect(C,O-2,x_minus_scaled-C+1,2);C=-1}}if(I!==null&&I>H&&M<0){M=U}else{if(I!==null&&I<K&&C<0){C=U}}}R.restore()};var q=function(E,G,C,D,F){o.call(this,E,G,C,D,F)};q.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};extend(q.prototype,{get_required_height:function(D){var C=y_scale=this.get_row_height(),E=this.mode;if(E==="no_detail"||E==="Squish"||E==="Pack"){C=D*y_scale}return C+Math.max(Math.round(y_scale/2),5)},draw:function(O,F,N,K){var I=this.data,L=this.view_start,P=this.view_end;O.save();O.fillStyle=this.prefs.block_color;O.textAlign="right";var S=this.view_end-this.view_start,R=F/S,E=this.get_row_height();for(var H=0,J=I.length;H<J;H++){var Q=I[H],G=Q[0],C=Q[1],D=Q[2],M=(K&&K[G]!==undefined?K[G]:null);if((C<P&&D>L)&&(this.mode=="Dense"||M!==null)){this.draw_element(O,this.mode,Q,M,L,P,R,E,F)}}O.restore()}});var d=10,j=3,n=5,A=10,g=1,u=3,f=3,a=9,p=2,h="#ccc";var t=function(E,G,C,D,F){q.call(this,E,G,C,D,F)};extend(t.prototype,q.prototype,{get_row_height:function(){var D=this.mode,C;if(D==="Dense"){C=d}else{if(D==="no_detail"){C=j}else{if(D==="Squish"){C=n}else{C=A}}}return C},draw_element:function(O,H,W,J,Q,ag,ak,al,C){var T=W[0],ai=W[1],aa=W[2]-1,R=W[3],ab=Math.floor(Math.max(0,(ai-Q)*ak)),P=Math.ceil(Math.min(C,Math.max(0,(aa-Q)*ak))),Z=(H==="Dense"?0:(0+J))*al,N,ae,S=null,am=null,F=this.prefs.block_color,ad=this.prefs.label_color;if(H=="Dense"){J=1}if(H==="no_detail"){O.fillStyle=F;O.fillRect(ab,Z+5,P-ab,g)}else{var M=W[4],Y=W[5],ac=W[6],G=W[7];if(Y&&ac){S=Math.floor(Math.max(0,(Y-Q)*ak));am=Math.ceil(Math.min(C,Math.max(0,(ac-Q)*ak)))}var aj,U;if(H==="Squish"||H==="Dense"){aj=1;U=f}else{aj=5;U=a}if(!G){if(W.strand){if(W.strand==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand_inv")}else{if(W.strand==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand_inv")}}}else{O.fillStyle=F}O.fillRect(ab,Z,P-ab,U)}else{var L,V;if(H==="Squish"||H==="Dense"){O.fillStyle=h;L=Z+Math.floor(f/2)+1;V=1}else{if(M){var L=Z;var V=U;if(M==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand")}else{if(M==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand")}}}else{O.fillStyle=h;L+=(f/2)+1;V=1}}O.fillRect(ab,L,P-ab,V);for(var ah=0,E=G.length;ah<E;ah++){var I=G[ah],D=Math.floor(Math.max(0,(I[0]-Q)*ak)),X=Math.ceil(Math.min(C,Math.max((I[1]-1-Q)*ak)));if(D>X){continue}O.fillStyle=F;O.fillRect(D,Z+(U-aj)/2+1,X-D,aj);if(S!==undefined&&ac>Y&&!(D>am||X<S)){var af=Math.max(D,S),K=Math.min(X,am);O.fillRect(af,Z+1,K-af,U);if(G.length==1&&H=="Pack"){if(M==="+"){O.fillStyle=O.canvas.manager.get_pattern("right_strand_inv")}else{if(M==="-"){O.fillStyle=O.canvas.manager.get_pattern("left_strand_inv")}}if(af+14<K){af+=2;K-=2}O.fillRect(af,Z+1,K-af,U)}}}}if(H==="Pack"&&ai>Q){O.fillStyle=ad;if(Q===0&&ab-O.measureText(R).width<0){O.textAlign="left";O.fillText(R,P+p,Z+8)}else{O.textAlign="right";O.fillText(R,ab-p,Z+8)}O.fillStyle=F}}}});var b=function(E,G,C,D,F){q.call(this,E,G,C,D,F)};extend(b.prototype,q.prototype,{draw_element:function(V,Q,K,G,Y,E,N,W,T){var K=data[i],M=K[0],U=K[1],F=K[2]-1,P=K[3],I=Math.floor(Math.max(0,(U-Y)*N)),L=Math.ceil(Math.min(T,Math.max(0,(F-Y)*N))),H=(Q==="Dense"?0:(0+G))*W,C,Z,D=null,O=null;if(no_label){V.fillStyle=block_color;V.fillRect(I+left_offset,H+5,L-I,1)}else{var X=K[4],S=K[5],J=K[6];C=9;Z=1;V.fillRect(I+left_offset,H,L-I,C);if(Q!=="Dense"&&P!==undefined&&U>Y){V.fillStyle=label_color;if(Y===0&&I-V.measureText(P).width<0){V.textAlign="left";V.fillText(P,L+2+left_offset,H+8)}else{V.textAlign="right";V.fillText(P,I-2+left_offset,H+8)}V.fillStyle=block_color}var R=X+" / "+S;if(U>Y&&V.measureText(R).width<(L-I)){V.fillStyle="white";V.textAlign="center";V.fillText(R,left_offset+I+(L-I)/2,H+8);V.fillStyle=block_color}}}});var z=1001,m=1002,e=1003,y=1004,l=1005;var x=function(G,D){var I=G[0],H=G[1],F=D[0],E=D[1],C;if(I<F){if(H<F){C=z}else{if(H<=E){C=e}else{C=m}}}else{if(I>E){C=z}else{if(H<=E){C=l}else{C=y}}}return C};var v=function(F,H,C,E,G,D){q.call(this,F,H,C,E,G);this.ref_seq=D};v.prototype.default_prefs=extend({},q.prototype.default_prefs,{show_insertions:false});extend(v.prototype,q.prototype,{get_row_height:function(){var C,D=this.mode;if(D==="Dense"){C=d}else{if(D==="Squish"){C=n}else{C=A;if(this.prefs.show_insertions){C*=2}}}return C},draw_read:function(Z,U,P,ae,E,Y,M,J,I){Z.textAlign="center";var X=this,D=[ae,E],S=0,aa=0,W=0;ref_seq=this.ref_seq,char_width_px=Z.canvas.manager.char_width_px;var aj=[];if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){W=Math.round(P/2)}if(!M){M=[[0,J.length]]}for(var Q=0,ac=M.length;Q<ac;Q++){var N=M[Q],F="MIDNSHP=X"[N[0]],R=N[1];if(F==="H"||F==="S"){S-=R}var K=Y+S,ai=Math.floor(Math.max(0,(K-ae)*P)),L=Math.floor(Math.max(0,(K+R-ae)*P));if(ai===L){L+=1}switch(F){case"H":break;case"S":case"M":case"=":var T=x([K,K+R],D);if(T!==z){var V=J.slice(aa,aa+R);if(W>0){Z.fillStyle=this.prefs.block_color;Z.fillRect(ai-W,I+1,L-ai,9);Z.fillStyle=h;for(var ag=0,C=V.length;ag<C;ag++){if(this.prefs.show_differences&&ref_seq){var O=ref_seq[K-ae+ag];if(!O||O.toLowerCase()===V[ag].toLowerCase()){continue}}if(K+ag>=ae&&K+ag<=E){var ah=Math.floor(Math.max(0,(K+ag-ae)*P));Z.fillText(V[ag],ah,I+9)}}}else{Z.fillStyle=this.prefs.block_color;Z.fillRect(ai,I+4,L-ai,f)}}aa+=R;S+=R;break;case"N":Z.fillStyle=h;Z.fillRect(ai-W,I+5,L-ai,1);S+=R;break;case"D":Z.fillStyle="red";Z.fillRect(ai-W,I+4,L-ai,3);S+=R;break;case"P":break;case"I":var T=x([K,K+R],D),ad=ai-W;if(T!==z){var V=J.slice(aa,aa+R);if(this.prefs.show_insertions){var H=ai-(L-ai)/2;if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){Z.fillStyle="yellow";Z.fillRect(H-W,I-9,L-ai,9);aj[aj.length]={type:"triangle",data:[ad,I+4,5]};Z.fillStyle=h;switch(T){case (e):V=V.slice(ae-K);break;case (y):V=V.slice(0,K-E);break;case (l):break;case (m):V=V.slice(ae-K,K-E);break}for(var ag=0,C=V.length;ag<C;ag++){var ah=Math.floor(Math.max(0,(K+ag-ae)*P));Z.fillText(V[ag],ah-(L-ai)/2,I)}}else{Z.fillStyle="yellow";Z.fillRect(H,I+(this.mode!=="Dense"?2:5),L-ai,(U!=="Dense"?f:u))}}else{if((U==="Pack"||this.mode==="Auto")&&J!==undefined&&P>char_width_px){aj[aj.length]={type:"text",data:[V.length,ad,I+9]}}else{}}}aa+=R;break;case"X":aa+=R;break}}Z.fillStyle="yellow";var af,G,ak;for(var ab=0;ab<aj.length;ab++){af=aj[ab];G=af.type;ak=af.data;if(G==="text"){Z.save();Z.font="bold "+Z.font;Z.fillText(ak[0],ak[1],ak[2]);Z.restore()}else{if(G=="triangle"){s(Z,ak[0],ak[1],ak[2])}}}},draw_element:function(V,Q,I,F,Y,D,M,W,T){var L=I[0],U=I[1],E=I[2],N=I[3],H=Math.floor(Math.max(0,(U-Y)*M)),J=Math.ceil(Math.min(T,Math.max(0,(E-Y)*M))),G=(Q==="Dense"?0:(0+F))*W,Z=this.prefs.block_color,K=this.prefs.label_color,S=0;if((Q==="Pack"||this.mode==="Auto")&&M>V.canvas.manager.char_width_px){var S=Math.round(M/2)}V.fillStyle=Z;if(I[5] instanceof Array){var R=Math.floor(Math.max(0,(I[4][0]-Y)*M)),P=Math.ceil(Math.min(T,Math.max(0,(I[4][1]-Y)*M))),O=Math.floor(Math.max(0,(I[5][0]-Y)*M)),C=Math.ceil(Math.min(T,Math.max(0,(I[5][1]-Y)*M)));if(I[4][1]>=Y&&I[4][0]<=D&&I[4][2]){this.draw_read(V,Q,M,Y,D,I[4][0],I[4][2],I[4][3],G)}if(I[5][1]>=Y&&I[5][0]<=D&&I[5][2]){this.draw_read(V,Q,M,Y,D,I[5][0],I[5][2],I[5][3],G)}if(O>P){V.fillStyle=h;r(V,P-S,G+5,O-S,G+5)}}else{V.fillStyle=Z;this.draw_read(V,Q,M,Y,D,U,I[4],I[5],G)}if(Q==="Pack"&&U>Y){V.fillStyle=this.prefs.label_color;var X=1;if(X===0&&H-V.measureText(N).width<0){V.textAlign="left";V.fillText(N,J+p-S,G+8)}else{V.textAlign="right";V.fillText(N,H-p-S,G+8)}V.fillStyle=Z}}});B.SummaryTreePainter=w;B.LinePainter=c;B.LinkedFeaturePainter=t;B.ReadPainter=v;B.VariantPainter=b};(function(d){var c={};var b=function(e){return c[e]};var a=function(f,g){var e={};g(b,e);c[f]=e};a("slotting",slotting_module);a("painters",painters_module);a("trackster",trackster_module);for(key in c.trackster){d[key]=c.trackster[key]}})(window);
\ No newline at end of file
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
12 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/2c479e68b9b8/
changeset: r5367:2c479e68b9b8
user: jgoecks
date: 2011-04-12 15:35:36
summary: Fix bugs introduced in 03c02d86d011.
affected #: 1 file (235 bytes)
--- a/static/scripts/trackster.js Mon Apr 11 14:17:35 2011 -0400
+++ b/static/scripts/trackster.js Tue Apr 12 09:35:36 2011 -0400
@@ -207,13 +207,15 @@
$.extend(params, extra_params);
// Add track filters to params.
- var filter_names = [];
- var filters = this.track.filters_manager.filters;
- for (var i = 0; i < filters.length; i++) {
- filter_names[filter_names.length] = filters[i].name;
+ if (this.track.filters_manager) {
+ var filter_names = [];
+ var filters = this.track.filters_manager.filters;
+ for (var i = 0; i < filters.length; i++) {
+ filter_names[filter_names.length] = filters[i].name;
+ }
+ params.filter_cols = JSON.stringify(filter_names);
}
- params.filter_cols = JSON.stringify(filter_names);
-
+
// Do request.
var manager = this;
return $.getJSON(this.track.data_url, params, function (result) {
@@ -1678,29 +1680,31 @@
//
// Update filtering UI.
- var filters = track.filters_manager.filters;
- for (var f = 0; f < filters.length; f++) {
- filters[f].update_ui_elt();
- }
+ if (track.filters_manager) {
+ var filters = track.filters_manager.filters;
+ for (var f = 0; f < filters.length; f++) {
+ filters[f].update_ui_elt();
+ }
- // Determine if filters are available; this is based on the example feature.
- var filters_available = false;
- if (track.example_feature) {
- for (var f = 0; f < filters.length; f++) {
- if (filters[f].applies_to(track.example_feature)) {
- filters_available = true;
- break;
+ // Determine if filters are available; this is based on the example feature.
+ var filters_available = false;
+ if (track.example_feature) {
+ for (var f = 0; f < filters.length; f++) {
+ if (filters[f].applies_to(track.example_feature)) {
+ filters_available = true;
+ break;
+ }
}
}
- }
- // If filter availability changed, hide filter div if necessary and update menu.
- if (track.filters_available !== filters_available) {
- track.filters_available = filters_available;
- if (!track.filters_available) {
- track.filters_div.hide();
+ // If filter availability changed, hide filter div if necessary and update menu.
+ if (track.filters_available !== filters_available) {
+ track.filters_available = filters_available;
+ if (!track.filters_available) {
+ track.filters_div.hide();
+ }
+ track.make_name_popup_menu();
}
- track.make_name_popup_menu();
}
}
}, 50);
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: refactor track filters out of TiledTracks and into a FiltersManager object.
by Bitbucket 11 Apr '11
by Bitbucket 11 Apr '11
11 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/03c02d86d011/
changeset: r5366:03c02d86d011
user: jgoecks
date: 2011-04-11 20:17:35
summary: Trackster: refactor track filters out of TiledTracks and into a FiltersManager object.
affected #: 1 file (389 bytes)
--- a/static/scripts/trackster.js Mon Apr 11 12:35:23 2011 -0400
+++ b/static/scripts/trackster.js Mon Apr 11 14:17:35 2011 -0400
@@ -208,8 +208,9 @@
// Add track filters to params.
var filter_names = [];
- for (var i = 0; i < this.track.filters.length; i++) {
- filter_names[filter_names.length] = this.track.filters[i].name;
+ var filters = this.track.filters_manager.filters;
+ for (var i = 0; i < filters.length; i++) {
+ filter_names[filter_names.length] = filters[i].name;
}
params.filter_cols = JSON.stringify(filter_names);
@@ -1016,21 +1017,150 @@
}
});
-/**
- * Parse filters dict and return filters.
+/**
+ * Manages a set of filters.
*/
-var get_filters_from_dict = function(filters_dict) {
- var filters = [];
- for (var i = 0; i < filters_dict.length; i++) {
- var filter_dict = filters_dict[i];
+var FiltersManager = function(track, filters_list) {
+ //
+ // Unpack filters from dict.
+ //
+ this.track = track;
+ this.filters = [];
+ for (var i = 0; i < filters_list.length; i++) {
+ var filter_dict = filters_list[i];
var name = filter_dict.name, type = filter_dict.type, index = filter_dict.index;
if (type === 'int' || type === 'float') {
- filters[i] = new NumberFilter(name, index);
+ this.filters[i] = new NumberFilter(name, index);
} else {
- filters[i] = new Filter(name, index, type);
+ this.filters[i] = new Filter(name, index, type);
}
}
- return filters;
+
+ //
+ // Init HTML elements for filters.
+ //
+
+ // Function that supports inline text editing of slider values for tools, filters.
+ // Enable users to edit parameter's value via a text box.
+ var edit_slider_values = function(container, span, slider) {
+ container.click(function() {
+ var cur_value = span.text();
+ max = parseFloat(slider.slider("option", "max")),
+ input_size = (max <= 1 ? 4 : max <= 1000000 ? max.toString().length : 6),
+ multi_value = false;
+ // Increase input size if there are two values.
+ if (slider.slider("option", "values")) {
+ input_size = 2*input_size + 1;
+ multi_value = true;
+ }
+ span.text("");
+ // Temporary input for changing value.
+ $("<input type='text'/>").attr("size", input_size).attr("maxlength", input_size)
+ .attr("value", cur_value).appendTo(span).focus().select()
+ .click(function(e) {
+ // Don't want click to propogate up to values_span and restart everything.
+ e.stopPropagation();
+ }).blur(function() {
+ $(this).remove();
+ span.text(cur_value);
+ }).keyup(function(e) {
+ if (e.keyCode === 27) {
+ // Escape key.
+ $(this).trigger("blur");
+ } else if (e.keyCode === 13) {
+ //
+ // Enter/return key initiates callback. If new value(s) are in slider range,
+ // change value (which calls slider's change() function).
+ //
+ var slider_min = slider.slider("option", "min"),
+ slider_max = slider.slider("option", "max"),
+ invalid = function(a_val) {
+ return (isNaN(a_val) || a_val > slider_max || a_val < slider_min);
+ },
+ new_value = $(this).val();
+ if (!multi_value) {
+ new_value = parseFloat(new_value);
+ if (invalid(new_value)) {
+ alert("Parameter value must be in the range [" + slider_min + "-" + slider_max + "]");
+ return $(this);
+ }
+ }
+ else { // Multi value.
+ new_value = new_value.split("-");
+ new_value = [parseFloat(new_value[0]), parseFloat(new_value[1])];
+ if (invalid(new_value[0]) || invalid(new_value[1])) {
+ alert("Parameter value must be in the range [" + slider_min + "-" + slider_max + "]");
+ return $(this);
+ }
+ }
+ slider.slider((multi_value ? "values" : "value"), new_value);
+ }
+ });
+ });
+ };
+
+ // Create filtering div.
+ this.parent_div = $("<div/>").addClass("filters").hide();
+ // Disable dragging, double clicking on div so that actions on slider do not impact viz.
+ this.parent_div.bind("drag", function(e) {
+ e.stopPropagation();
+ }).bind("click", function(e) {
+ e.stopPropagation();
+ }).bind("dblclick", function(e) {
+ e.stopPropagation();
+ });
+ var manager = this;
+ $.each(this.filters, function(index, filter) {
+ var filter_div = $("<div/>").addClass("slider-row").appendTo(manager.parent_div);
+
+ // Set up filter label (name, values).
+ var filter_label = $("<div/>").addClass("slider-label").appendTo(filter_div)
+ var name_span = $("<span/>").addClass("slider-name").text(filter.name + " ").appendTo(filter_label);
+ var values_span = $("<span/>");
+ var values_span_container = $("<span/>").addClass("slider-value").appendTo(filter_label).append("[").append(values_span).append("]");
+
+ // Set up slider for filter.
+ var slider_div = $("<div/>").addClass("slider").appendTo(filter_div);
+ filter.control_element = $("<div/>").attr("id", filter.name + "-filter-control").appendTo(slider_div);
+ var prev_values = [0,0];
+ filter.control_element.slider({
+ range: true,
+ min: Number.MAX_VALUE,
+ max: -Number.MIN_VALUE,
+ values: [0, 0],
+ slide: function(event, ui) {
+ //
+ // Always update UI values, but set timeout for doing more--especially drawing--
+ // so that viz is more responsive.
+ //
+ prev_values = ui.values;
+ values_span.text(ui.values[0] + "-" + ui.values[1]);
+ setTimeout(function() {
+ if (ui.values[0] == prev_values[0] && ui.values[1] == prev_values[1]) {
+ var values = ui.values;
+ // Set new values in UI.
+ values_span.text(values[0] + "-" + values[1]);
+ // Set new values in filter.
+ filter.low = values[0];
+ filter.high = values[1];
+ // Redraw track.
+ manager.track.draw(true, true);
+ }
+ }, 50);
+ },
+ change: function(event, ui) {
+ filter.control_element.slider("option", "slide").call(filter.control_element, event, ui);
+ }
+ });
+ filter.slider = filter.control_element;
+ filter.slider_label = values_span;
+
+ // Enable users to edit slider values via text box.
+ edit_slider_values(values_span_container, values_span, filter.control_element);
+
+ // Add to clear floating layout.
+ $("<div style='clear: both;'/>").appendTo(filter_div);
+ });
};
/**
@@ -1259,12 +1389,12 @@
}
});
-var TiledTrack = function(filters, tool_dict, parent_track) {
+var TiledTrack = function(filters_list, tool_dict, parent_track) {
var track = this,
view = track.view;
// Attribute init.
- this.filters = (filters !== undefined ? get_filters_from_dict( filters ) : []);
+ this.filters_manager = (filters_list !== undefined ? new FiltersManager(this, filters_list) : undefined);
// filters_available is determined by data, filters_visible is set by user.
this.filters_available = false;
this.filters_visible = false;
@@ -1282,150 +1412,17 @@
if (track.hidden) { return; }
//
- // Init HTML elements for tool, filters.
- //
-
- // Function that supports inline text editing of slider values for tools, filters.
- // Enable users to edit parameter's value via a text box.
- var edit_slider_values = function(container, span, slider) {
- container.click(function() {
- var cur_value = span.text();
- max = parseFloat(slider.slider("option", "max")),
- input_size = (max <= 1 ? 4 : max <= 1000000 ? max.toString().length : 6),
- multi_value = false;
- // Increase input size if there are two values.
- if (slider.slider("option", "values")) {
- input_size = 2*input_size + 1;
- multi_value = true;
- }
- span.text("");
- // Temporary input for changing value.
- $("<input type='text'/>").attr("size", input_size).attr("maxlength", input_size)
- .attr("value", cur_value).appendTo(span).focus().select()
- .click(function(e) {
- // Don't want click to propogate up to values_span and restart everything.
- e.stopPropagation();
- }).blur(function() {
- $(this).remove();
- span.text(cur_value);
- }).keyup(function(e) {
- if (e.keyCode === 27) {
- // Escape key.
- $(this).trigger("blur");
- } else if (e.keyCode === 13) {
- //
- // Enter/return key initiates callback. If new value(s) are in slider range,
- // change value (which calls slider's change() function).
- //
- var slider_min = slider.slider("option", "min"),
- slider_max = slider.slider("option", "max"),
- invalid = function(a_val) {
- return (isNaN(a_val) || a_val > slider_max || a_val < slider_min);
- },
- new_value = $(this).val();
- if (!multi_value) {
- new_value = parseFloat(new_value);
- if (invalid(new_value)) {
- alert("Parameter value must be in the range [" + slider_min + "-" + slider_max + "]");
- return $(this);
- }
- }
- else { // Multi value.
- new_value = new_value.split("-");
- new_value = [parseFloat(new_value[0]), parseFloat(new_value[1])];
- if (invalid(new_value[0]) || invalid(new_value[1])) {
- alert("Parameter value must be in the range [" + slider_min + "-" + slider_max + "]");
- return $(this);
- }
- }
- slider.slider((multi_value ? "values" : "value"), new_value);
- }
- });
- });
- };
-
-
// If track has parent:
// -replace drag handle with child-track icon button; (TODO: eventually, we'll want to be able
// to make a set of child tracks dragable.)
// -remove tool b/c child tracks cannot have tools.
+ //
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;
}
- // Create filtering div.
- this.filters_div = $("<div/>").addClass("filters").hide();
- this.header_div.after(this.filters_div);
- // Disable dragging, double clicking on div so that actions on slider do not impact viz.
- this.filters_div.bind("drag", function(e) {
- e.stopPropagation();
- }).bind("click", function(e) {
- e.stopPropagation();
- }).bind("dblclick", function(e) {
- e.stopPropagation();
- });
- $.each(this.filters, function(index, filter) {
- var filter_div = $("<div/>").addClass("slider-row").appendTo(track.filters_div);
-
- // Set up filter label (name, values).
- var filter_label = $("<div/>").addClass("slider-label").appendTo(filter_div)
- var name_span = $("<span/>").addClass("slider-name").text(filter.name + " ").appendTo(filter_label);
- var values_span = $("<span/>");
- var values_span_container = $("<span/>").addClass("slider-value").appendTo(filter_label).append("[").append(values_span).append("]");
-
- // Set up slider for filter.
- var slider_div = $("<div/>").addClass("slider").appendTo(filter_div);
- filter.control_element = $("<div/>").attr("id", filter.name + "-filter-control").appendTo(slider_div);
- var prev_values = [0,0];
- filter.control_element.slider({
- range: true,
- min: Number.MAX_VALUE,
- max: -Number.MIN_VALUE,
- values: [0, 0],
- slide: function(event, ui) {
- //
- // Always update UI values, but set timeout for doing more--especially drawing--
- // so that viz is more responsive.
- //
- prev_values = ui.values;
- values_span.text(ui.values[0] + "-" + ui.values[1]);
- setTimeout(function() {
- if (ui.values[0] == prev_values[0] && ui.values[1] == prev_values[1]) {
- var values = ui.values;
- // Set new values in UI.
- values_span.text(values[0] + "-" + values[1]);
- // Set new values in filter.
- filter.low = values[0];
- filter.high = values[1];
- // Redraw track.
- track.draw(true, true);
- }
- }, 50);
- },
- change: function(event, ui) {
- filter.control_element.slider("option", "slide").call(filter.control_element, event, ui);
- }
- });
- filter.slider = filter.control_element;
- filter.slider_label = values_span;
-
- // Enable users to edit slider values via text box.
- edit_slider_values(values_span_container, values_span, filter.control_element);
-
- // Add to clear floating layout.
- $("<div style='clear: both;'/>").appendTo(filter_div);
- });
-
- //
- // Create dynamic tool div.
- //
- if (this.tool) {
- this.dynamic_tool_div = this.tool.parent_div;
- this.header_div.after(this.dynamic_tool_div);
- }
-
//
// Child tracks container setup.
//
@@ -1433,6 +1430,22 @@
track.container_div.append(track.child_tracks_container);
//
+ // Create filters div.
+ //
+ if (this.filters_manager) {
+ this.filters_div = this.filters_manager.parent_div
+ this.header_div.after(this.filters_div);
+ }
+
+ //
+ // Create dynamic tool div.
+ //
+ if (this.tool) {
+ this.dynamic_tool_div = this.tool.parent_div;
+ this.header_div.after(this.dynamic_tool_div);
+ }
+
+ //
// Create modes control.
//
if (track.display_modes !== undefined) {
@@ -1665,15 +1678,16 @@
//
// Update filtering UI.
- for (var f = 0; f < track.filters.length; f++) {
- track.filters[f].update_ui_elt();
+ var filters = track.filters_manager.filters;
+ for (var f = 0; f < filters.length; f++) {
+ filters[f].update_ui_elt();
}
// Determine if filters are available; this is based on the example feature.
var filters_available = false;
if (track.example_feature) {
- for (var f = 0; f < track.filters.length; f++) {
- if (track.filters[f].applies_to(track.example_feature)) {
+ for (var f = 0; f < filters.length; f++) {
+ if (filters[f].applies_to(track.example_feature)) {
filters_available = true;
break;
}
@@ -2206,12 +2220,13 @@
// Filter features
var filtered = [];
if ( result.data ) {
+ var filters = this.filters_manager.filters;
for (var i = 0, len = result.data.length; i < len; i++) {
var feature = result.data[i];
var hide_feature = false;
var filter;
- for (var f = 0, flen = this.filters.length; f < flen; f++) {
- filter = this.filters[f];
+ for (var f = 0, flen = filters.length; f < flen; f++) {
+ filter = filters[f];
filter.update_attrs(feature);
if (!filter.keep(feature)) {
hide_feature = true;
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: Enable GFF and GFF3 attributes to be written in GTF format.
by Bitbucket 11 Apr '11
by Bitbucket 11 Apr '11
11 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/c946e83bdd1c/
changeset: r5365:c946e83bdd1c
user: jgoecks
date: 2011-04-11 18:35:23
summary: Enable GFF and GFF3 attributes to be written in GTF format.
affected #: 1 file (380 bytes)
--- a/lib/galaxy/datatypes/util/gff_util.py Mon Apr 11 10:37:14 2011 -0400
+++ b/lib/galaxy/datatypes/util/gff_util.py Mon Apr 11 12:35:23 2011 -0400
@@ -281,6 +281,16 @@
"""
if gff_format == 'GTF':
format_string = '%s "%s"'
+ # Convert group (GFF) and ID, parent (GFF3) attributes to transcript_id, gene_id
+ id_attr = None
+ if 'group' in attrs:
+ id_attr = 'group'
+ elif 'ID' in attrs:
+ id_attr = 'ID'
+ elif 'Parent' in attrs:
+ id_attr = 'Parent'
+ if id_attr:
+ attrs['transcript_id'] = attrs['gene_id'] = attrs[id_attr]
elif gff_format == 'GFF3':
format_string = '%s=%s'
attrs_strs = []
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
11 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/b6beb68c36b0/
changeset: r5364:b6beb68c36b0
user: greg
date: 2011-04-11 16:37:14
summary: Fix for rating a tool in the tool shed.
affected #: 1 file (206 bytes)
--- a/templates/webapps/community/common/rate_tool.mako Mon Apr 11 09:39:55 2011 -0400
+++ b/templates/webapps/community/common/rate_tool.mako Mon Apr 11 10:37:14 2011 -0400
@@ -146,7 +146,13 @@
</div><div class="form-row"><label>Your Rating:</label>
- ${render_star_rating( 'rating', tra.rating )}
+ <%
+ if tra and tra.rating:
+ rating = tra.rating
+ else:
+ rating = 0
+ %>
+ ${render_star_rating( 'rating', rating )}
<div style="clear: both"></div></div><div class="form-row">
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
11 Apr '11
1 new changeset in galaxy-central:
http://bitbucket.org/galaxy/galaxy-central/changeset/e7873feacc48/
changeset: r5363:e7873feacc48
user: jgoecks
date: 2011-04-11 15:39:55
summary: Add tool 'Filter GTF by attribute values list.' Tool filters a GTF based on a list of attribute values; this tool is especially useful as a downstream analysis tool for filtering GTF files based on Cuffdiff outputs. Functional tests are included as well.
affected #: 12 files (140 bytes)
--- a/tool_conf.xml.main Fri Apr 08 17:07:08 2011 -0400
+++ b/tool_conf.xml.main Mon Apr 11 09:39:55 2011 -0400
@@ -78,6 +78,7 @@
<tool file="filters/gff/extract_GFF_Features.xml" /><tool file="filters/gff/gff_filter_by_attribute.xml" /><tool file="filters/gff/gff_filter_by_feature_count.xml" />
+ <tool file="filters/gff/gtf_filter_by_attribute_values_list.xml" /></section><section name="Join, Subtract and Group" id="group"><tool file="filters/joiner.xml" />
--- a/tool_conf.xml.sample Fri Apr 08 17:07:08 2011 -0400
+++ b/tool_conf.xml.sample Mon Apr 11 09:39:55 2011 -0400
@@ -67,6 +67,7 @@
<tool file="filters/gff/extract_GFF_Features.xml" /><tool file="filters/gff/gff_filter_by_attribute.xml" /><tool file="filters/gff/gff_filter_by_feature_count.xml" />
+ <tool file="filters/gff/gtf_filter_by_attribute_values_list.xml" /></section><section name="Join, Subtract and Group" id="group"><tool file="filters/joiner.xml" />
--- a/tools/filters/gff/extract_GFF_Features.xml Fri Apr 08 17:07:08 2011 -0400
+++ b/tools/filters/gff/extract_GFF_Features.xml Mon Apr 11 09:39:55 2011 -0400
@@ -1,5 +1,5 @@
<tool id="Extract_features1" name="Extract features">
- <description> from GFF file</description>
+ <description> from GFF data</description><command interpreter="python">extract_GFF_Features.py $input1 $out_file1 ${column_choice.col} ${column_choice.feature}</command><inputs><param format="gff" name="input1" type="data" label="Select GFF data"/>
--- a/tools/filters/gff/gff_filter_by_attribute.xml Fri Apr 08 17:07:08 2011 -0400
+++ b/tools/filters/gff/gff_filter_by_attribute.xml Mon Apr 11 09:39:55 2011 -0400
@@ -1,4 +1,4 @@
-<tool id="gff_filter_by_attribute" name="Filter GFF file by attribute" version="0.1">
+<tool id="gff_filter_by_attribute" name="Filter GFF data by attribute" version="0.1"><description>using simple expressions</description><command interpreter="python">
gff_filter_by_attribute.py $input $out_file1 "$attribute_type" "$attribute_name" "$cond"
--- a/tools/filters/gff/gff_filter_by_feature_count.xml Fri Apr 08 17:07:08 2011 -0400
+++ b/tools/filters/gff/gff_filter_by_feature_count.xml Mon Apr 11 09:39:55 2011 -0400
@@ -1,4 +1,4 @@
-<tool id="gff_filter_by_feature_count" name="Filter GFF file by feature count" version="0.1">
+<tool id="gff_filter_by_feature_count" name="Filter GFF data by feature count" version="0.1"><description>using simple expressions</description><command interpreter="python">
gff_filter_by_feature_count.py $input_file1 $out_file1 "$feature_name" "$cond"
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