UNPKG

escher-vis

Version:

Escher: A Web Application for Building, Sharing, and Embedding Data-Rich Visualizations of Biological Pathways

2 lines 493 kB
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.escher=a()}}(function(){var a;return function b(a,c,d){function e(g,h){if(!c[g]){if(!a[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};a[g][0].call(k.exports,function(b){var c=a[g][1][b];return e(c?c:b)},k,k.exports,b,a,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){function d(a,b){this.map=a,this.undo_stack=b,this.empty_behavior=function(){},this.rotation_mode_enabled=!1,this.rotation_drag=w(),this.selectable_mousedown=null,this.text_label_mousedown=null,this.text_label_click=null,this.selectable_drag=this.empty_behavior,this.node_mouseover=null,this.node_mouseout=null,this.label_mousedown=null,this.label_mouseover=null,this.label_mouseout=null,this.bezier_drag=this.empty_behavior,this.bezier_mouseover=null,this.bezier_mouseout=null,this.reaction_label_drag=this.empty_behavior,this.node_label_drag=this.empty_behavior,this.dragging=!1,this.turn_everything_on()}function e(){this.toggle_selectable_click(!0),this.toggle_selectable_drag(!0),this.toggle_label_drag(!0),this.toggle_label_mouseover(!0)}function f(){this.toggle_selectable_click(!1),this.toggle_selectable_drag(!1),this.toggle_label_drag(!1),this.toggle_label_mouseover(!1)}function g(a){function b(){var a=this.map.sel.selectAll("#rotation-center").data([0]),b=a.enter().append("g").attr("id","rotation-center");b.append("path").attr("d","M-32 0 L32 0").attr("class","rotation-center-line"),b.append("path").attr("d","M0 -32 L0 32").attr("class","rotation-center-line");var c=b.merge(a);c.attr("transform","translate("+this.center.x+","+this.center.y+")").attr("visibility","visible").on("mouseover",function(){var a=parseFloat(c.selectAll("path").style("stroke-width"));c.selectAll("path").style("stroke-width",2*a+"px")}).on("mouseout",function(){c.selectAll("path").style("stroke-width",null)}).call(w().on("drag",function(){var a=u.d3_transform_catch(c.attr("transform")),b=[z.event.dx+a.translate[0],z.event.dy+a.translate[1]];c.attr("transform","translate("+b+")"),this.center={x:b[0],y:b[1]}}.bind(this)))}function c(a){this.map.sel.select("#rotation-center").attr("visibility","hidden")}function d(a){var b=[],c=[];for(var d in a){var e=a[d];void 0!==e.x&&b.push(e.x),void 0!==e.y&&c.push(e.y)}return{x:u.mean(b),y:u.mean(c)}}void 0===a?this.rotation_mode_enabled=!this.rotation_mode_enabled:this.rotation_mode_enabled=a;var e=this.map.sel.selectAll(".node-circle"),f=this.map.sel.selectAll("#canvas");if(this.rotation_mode_enabled){this.map.callback_manager.run("start_rotation");var g=this.map.get_selected_nodes();if(0===Object.keys(g).length)return void console.warn("No selected nodes");this.center=d(g),b.call(this);var h=this.map,i=Object.keys(g),j=this.map.reactions,k=this.map.nodes,l=this.map.beziers,m=function(a){z.event.sourceEvent.stopPropagation()},n=function(a,b,c,d){var e=v.rotate_nodes(g,j,l,b,d);h.draw_these_nodes(e.node_ids),h.draw_these_reactions(e.reaction_ids)},o=function(a){},p=function(a,b,c){var d={};i.forEach(function(a){d[a]=k[a]});var e=v.rotate_nodes(d,j,l,-b,c);h.draw_these_nodes(e.node_ids),h.draw_these_reactions(e.reaction_ids)},q=function(a,b,c){var d={};i.forEach(function(a){d[a]=k[a]});var e=v.rotate_nodes(d,j,l,b,c);h.draw_these_nodes(e.node_ids),h.draw_these_reactions(e.reaction_ids)},r=function(){return this.center}.bind(this);this.rotation_drag=this._get_generic_angular_drag(m,n,o,p,q,r,this.map.sel),f.call(this.rotation_drag),this.selectable_drag=this.rotation_drag}else c.call(this),e.on("mousedown.center",null),f.on("mousedown.center",null),f.on("mousedown.drag",null),f.on("touchstart.drag",null),this.rotation_drag=null,this.selectable_drag=null}function h(a){if(void 0===a&&(a=null===this.selectable_mousedown),a){var b=this.map;this.selectable_mousedown=function(a){z.event.stopPropagation()},this.selectable_click=function(a){z.event.stopPropagation(),z.event.defaultPrevented||b.select_selectable(this,a,z.event.shiftKey)},this.node_mouseover=function(a){x(this).style("stroke-width",null);var b=parseFloat(x(this).style("stroke-width"));x(this.parentNode).classed("selected")||x(this).style("stroke-width",3*b+"px")},this.node_mouseout=function(a){x(this).style("stroke-width",null)}}else this.selectable_mousedown=null,this.selectable_click=null,this.node_mouseover=null,this.node_mouseout=null,this.map.sel.select("#nodes").selectAll(".node-circle").style("stroke-width",null)}function i(a){if(void 0===a&&(a=null==this.text_edit_mousedown),a){var b=this.map;this.selection;this.text_label_mousedown=function(){if(!z.event.defaultPrevented){var a=u.d3_transform_catch(x(this).attr("transform")).translate,c={x:a[0],y:a[1]};b.callback_manager.run("edit_text_label",null,x(this),c),z.event.stopPropagation()}},this.text_label_click=null,this.map.sel.select("#text-labels").selectAll(".label").classed("edit-text-cursor",!0),this.map.sel.on("mousedown.new_text_label",function(a){z.event.preventDefault();var b={x:y(a)[0],y:y(a)[1]};this.map.callback_manager.run("new_text_label",null,b)}.bind(this,this.map.sel.node()))}else this.text_label_mousedown=this.selectable_mousedown,this.text_label_click=this.selectable_click,this.map.sel.select("#text-labels").selectAll(".label").classed("edit-text-cursor",!1),this.map.sel.on("mousedown.new_text_label",null),this.map.callback_manager.run("hide_text_label_editor")}function j(a){void 0===a&&(a=this.selectable_drag===this.empty_behavior),a?(this.selectable_drag=this._get_selectable_drag(this.map,this.undo_stack),this.bezier_drag=this._get_bezier_drag(this.map,this.undo_stack)):(this.selectable_drag=this.empty_behavior,this.bezier_drag=this.empty_behavior)}function k(a){void 0===a&&(a=this.label_drag===this.empty_behavior),a?(this.reaction_label_drag=this._get_reaction_label_drag(this.map),this.node_label_drag=this._get_node_label_drag(this.map)):(this.reaction_label_drag=this.empty_behavior,this.node_label_drag=this.empty_behavior)}function l(a){void 0===a&&(a=null===this.label_mouseover),a?(this.label_mouseover=function(a,b){this.dragging||this.map.callback_manager.run("show_tooltip",null,a,b)}.bind(this),this.label_mouseout=function(){this.map.callback_manager.run("delay_hide_tooltip")}.bind(this)):this.label_mouseover=null}function m(a){void 0===a&&(a=this.bezier_drag===this.empty_behavior),a?(this.bezier_drag=this._get_bezier_drag(this.map),this.bezier_mouseover=function(a){x(this).style("stroke-width",String(3)+"px")},this.bezier_mouseout=function(a){x(this).style("stroke-width",String(1)+"px")}):(this.bezier_drag=this.empty_behavior,this.bezier_mouseover=null,this.bezier_mouseout=null)}function n(a){a.on("mousedown.drag",null),a.on("touchstart.drag",null)}function o(a,b){function c(b,c){var d=a.nodes[c],e=a.nodes[b],f=[];return d.connected_segments.forEach(function(d){var g;try{if(g=a.reactions[d.reaction_id].segments[d.segment_id],void 0===g)throw new Error("undefined segment")}catch(h){return void console.warn("Could not find connected segment "+d.segment_id)}if(g.from_node_id==c)g.from_node_id=b;else{if(g.to_node_id!=c)return void console.error("Segment does not connect to dragged node");g.to_node_id=b}e.connected_segments.push(d),f.push(u.clone(d))}),a.delete_node_data([c]),a.sel.selectAll(".node-to-combine").classed("node-to-combine",!1),a.draw_everything(),f}var d=w(),e=null,f=null,g=null,h=null,i=null,j=function(b,c){var d=a.text_labels[b];d.x=d.x+c.x,d.y=d.y+c.y},k=function(a){this.dragging=a}.bind(this);return d.on("start",function(b){if(k(!0),z.event.sourceEvent.stopPropagation(),f={x:0,y:0},-1===x(this).attr("class").indexOf("label")){var c=this.parentNode.__data__,d=c.bigg_id,g=this.parentNode;e=setTimeout(function(){g.parentNode.insertBefore(g,g.parentNode.firstChild)},200),a.sel.selectAll(".metabolite-circle").on("mouseover.combine",function(a){a.bigg_id===d&&a.node_id!==c.node_id&&x(this).style("stroke-width",String(12)+"px").classed("node-to-combine",!0)}).on("mouseout.combine",function(b){b.bigg_id===d&&a.sel.selectAll(".node-to-combine").style("stroke-width",String(2)+"px").classed("node-to-combine",!1)})}}),d.on("drag",function(b){x(this.parentNode).classed("selected")||a.select_selectable(this,b);var c={};-1===x(this).attr("class").indexOf("label")?(c.type="node",c.id=this.parentNode.__data__.node_id):(c.type="label",c.id=this.__data__.text_label_id);var d=a.get_selected_node_ids(),e=a.get_selected_text_label_ids();g=[],i=[],"node"==c.type&&-1===d.indexOf(c.id)?g.push(c.id):"label"===c.type&&-1===e.indexOf(c.id)?i.push(c.id):(g=d,i=e),h=[];var k={x:z.event.dx,y:z.event.dy};f=u.c_plus_c(f,k),g.forEach(function(b){var c=a.nodes[b],d=v.move_node_and_dependents(c,b,a.reactions,a.beziers,k);h=u.unique_concat([h,d.reaction_ids])}),i.forEach(function(a){j(a,k)}),a.draw_these_nodes(g),a.draw_these_reactions(h),a.draw_these_text_labels(i)}),d.on("end",function(){if(k(!1),null===g)return f=null,g=null,i=null,h=null,void(e=null);var d=[];if(a.sel.selectAll(".node-to-combine").each(function(a){d.push(a.node_id)}),1===d.length){var l=d[0],m=this.parentNode.__data__.node_id,n=u.clone(a.nodes[m]),o=c(l,m);b.push(function(){a.nodes[m]=n;var b=a.nodes[l],c=[];o.forEach(function(d){var e=a.reactions[d.reaction_id].segments[d.segment_id];e.from_node_id==l?e.from_node_id=m:e.to_node_id==l?e.to_node_id=m:console.error("Segment does not connect to fixed node"),b.connected_segments=b.connected_segments.filter(function(a){return!(a.reaction_id==d.reaction_id&&a.segment_id==d.segment_id)}),-1==c.indexOf(d.reaction_id)&&c.push(d.reaction_id)}),a.draw_these_nodes([m]),a.draw_these_reactions(c)},function(){c(l,m)})}else{var p=u.clone(f),q=u.clone(g),r=u.clone(i),s=u.clone(h);b.push(function(){q.forEach(function(b){var c=a.nodes[b];v.move_node_and_dependents(c,b,a.reactions,a.beziers,u.c_times_scalar(p,-1))}),r.forEach(function(a){j(a,u.c_times_scalar(p,-1))}),a.draw_these_nodes(q),a.draw_these_reactions(s),a.draw_these_text_labels(r)},function(){q.forEach(function(b){var c=a.nodes[b];v.move_node_and_dependents(c,b,a.reactions,a.beziers,p)}),r.forEach(function(a){j(a,p)}),a.draw_these_nodes(q),a.draw_these_reactions(s),a.draw_these_text_labels(r)})}a.sel.selectAll(".metabolite-circle").on("mouseover.combine",null).on("mouseout.combine",null),clearTimeout(e),f=null,g=null,i=null,h=null,e=null}),d}function p(a){var b=function(b,c,d,e,f){var g=a.reactions[b].segments[c];g[d]=u.c_plus_c(g[d],f),a.beziers[e].x=g[d].x,a.beziers[e].y=g[d].y},c=function(a){a.dragging=!0},d=function(c,d,e){b(c.reaction_id,c.segment_id,c.bezier,c.bezier_id,d),a.draw_these_reactions([c.reaction_id],!1),a.draw_these_beziers([c.bezier_id])},e=function(a){a.dragging=!1},f=function(c,d){b(c.reaction_id,c.segment_id,c.bezier,c.bezier_id,u.c_times_scalar(d,-1)),a.draw_these_reactions([c.reaction_id],!1),a.draw_these_beziers([c.bezier_id])},g=function(c,d){b(c.reaction_id,c.segment_id,c.bezier,c.bezier_id,d),a.draw_these_reactions([c.reaction_id],!1),a.draw_these_beziers([c.bezier_id])};return this._get_generic_drag(c,d,e,f,g,this.map.sel)}function q(a){var b=function(b,c){var d=a.reactions[b];d.label_x=d.label_x+c.x,d.label_y=d.label_y+c.y},c=function(b){a.callback_manager.run("hide_tooltip")},d=function(c,d,e){b(c.reaction_id,d),a.draw_these_reactions([c.reaction_id])},e=function(a){},f=function(c,d){b(c.reaction_id,u.c_times_scalar(d,-1)),a.draw_these_reactions([c.reaction_id])},g=function(c,d){b(c.reaction_id,d),a.draw_these_reactions([c.reaction_id])};return this._get_generic_drag(c,d,e,f,g,this.map.sel)}function r(a){var b=function(b,c){var d=a.nodes[b];d.label_x=d.label_x+c.x,d.label_y=d.label_y+c.y},c=function(b){a.callback_manager.run("hide_tooltip")},d=function(c,d,e){b(c.node_id,d),a.draw_these_nodes([c.node_id])},e=function(a){},f=function(c,d){b(c.node_id,u.c_times_scalar(d,-1)),a.draw_these_nodes([c.node_id])},g=function(c,d){b(c.node_id,d),a.draw_these_nodes([c.node_id])};return this._get_generic_drag(c,d,e,f,g,this.map.sel)}function s(a,b,c,d,e,f){var g,h=w(),i=this.undo_stack,j=f.node();return h.on("start",function(b){this.dragging=!0,z.event.sourceEvent.stopPropagation(),g={x:0,y:0},a(b)}.bind(this)),h.on("drag",function(a){var c={x:z.event.dx,y:z.event.dy},d={x:y(j)[0],y:y(j)[1]};g=u.c_plus_c(g,c),b(a,c,g,d)}.bind(this)),h.on("end",function(a){this.dragging=!1;var b=u.clone(a),f=u.clone(g),h={x:y(j)[0],y:y(j)[1]};i.push(function(){d(b,f,h)},function(){e(b,f,h)}),c(a)}.bind(this)),h}function t(a,b,c,d,e,f,g){var h,i=w(),j=this.undo_stack,k=g.node();return i.on("start",function(b){this.dragging=!0,z.event.sourceEvent.stopPropagation(),h=0,a(b)}.bind(this)),i.on("drag",function(a){var c={x:z.event.dx,y:z.event.dy},d={x:y(k)[0],y:y(k)[1]},e=f(),g=u.angle_for_event(c,d,e);h+=g,b(a,g,h,e)}.bind(this)),i.on("end",function(a){this.dragging=!1;var b=u.clone(a),g=h,i=u.clone(f());j.push(function(){d(b,g,i)},function(){e(b,g,i)}),c(a)}.bind(this)),i}var u=a("./utils"),v=a("./build"),w=a("d3-drag").drag,x=a("d3-selection").select,y=a("d3-selection").mouse,z=a("d3-selection"),A=u.make_class();A.prototype={init:d,toggle_rotation_mode:g,turn_everything_on:e,turn_everything_off:f,toggle_selectable_click:h,toggle_text_label_edit:i,toggle_selectable_drag:j,toggle_label_drag:k,toggle_label_mouseover:l,toggle_bezier_drag:m,turn_off_drag:n,_get_selectable_drag:o,_get_bezier_drag:p,_get_reaction_label_drag:q,_get_node_label_drag:r,_get_generic_drag:s,_get_generic_angular_drag:t},b.exports=A},{"./build":26,"./utils":33,"d3-drag":46,"d3-selection":53}],2:[function(a,b,c){function d(a,b,c,d){this.brush_sel=a.append("g").attr("id","brush-container");var e=this.brush_sel.node(),f=a.select(d).node().nextSibling;e!==f&&e.parentNode.insertBefore(e,f),this.enabled=b,this.map=c}function e(a){void 0===a&&(a=!this.enabled),a?this.setup_selection_brush():this.brush_sel.selectAll("*").remove()}function f(a){a.selectAll("rect").attr("cursor",null)}function g(){var a=this.map,b=this.brush_sel,c=a.sel.selectAll("#nodes,#text-labels"),d=a.canvas.size_and_location(),e=d.width,g=d.height,h=d.x,l=d.y;b.selectAll("*").remove();var m=!1,n=i().extent([[h,l],[h+e,l+g]]).on("start",function(){f(b),a.settings.get_option("hide_secondary_metabolites")&&(a.settings.set_conditional("hide_secondary_metabolites",!1),a.draw_everything(),a.set_status("Showing secondary metabolites. You can hide them again in Settings.",2e3))}).on("brush",function(){var a=k.event.sourceEvent.shiftKey,b=j(this);if(null!==b){var d=a?c.selectAll(".node:not(.selected),.text-label:not(.selected)"):c.selectAll(".node,.text-label");d.classed("selected",function(a){var c=a.x,d=a.y;return b[0][0]<=c&&c<b[1][0]&&b[0][1]<=d&&d<b[1][1]})}}).on("end",function(){f(b);var c=j(this);null===c?m?m=!1:a.select_none():(m=!0,b.call(n.move,null))});b.call(n),f(b)}var h=a("./utils"),i=a("d3-brush").brush,j=a("d3-brush").brushSelection,k=(a("d3-scale").scaleIdentity,a("d3-selection")),l=(a("d3-selection").select,h.make_class());l.prototype={init:d,toggle:e,setup_selection_brush:g},b.exports=l},{"./utils":33,"d3-brush":42,"d3-scale":52,"d3-selection":53}],3:[function(a,b,c){function d(a,b,c,d){var e=a.append("div").attr("id","rxn-input");this.placed_div=s(e,b,{x:240,y:0}),this.placed_div.hide();var f=t(e.node(),{backgroundColor:"#eee"});x(f.input),this.completely=f,e.append("button").attr("class","button input-close-button").text("×").on("mousedown",function(){this.hide_dropdown()}.bind(this)),this.map=b;var g=90;this.direction_arrow=new u(b.sel),this.direction_arrow.set_rotation(g),this.setup_map_callbacks(b),this.zoom_container=c,this.setup_zoom_callbacks(c),this.settings=d,this.toggle(!1),this.target_coords=null}function e(a){a.callback_manager.set("select_metabolite_with_id.input",function(a,b){this.is_active&&(this.reload(a,b,!1),this.show_dropdown(b)),this.hide_target()}.bind(this)),a.callback_manager.set("select_selectable.input",function(a,b,c){this.hide_target(),1==a&&this.is_active&&c?(this.reload(b,c,!1),this.show_dropdown(c)):this.toggle(!1)}.bind(this)),a.callback_manager.set("deselect_nodes",function(){this.direction_arrow.hide(),this.hide_dropdown()}.bind(this)),a.callback_manager.set("before_svg_export",function(){this.direction_arrow.hide(),this.hide_target()}.bind(this))}function f(a){a.callback_manager.set("zoom.input",function(){this.is_active&&this.place_at_selected()}.bind(this))}function g(){return this.placed_div.is_visible()}function h(a){void 0===a?this.is_active=!this.is_active:this.is_active=a,this.is_active?(this.toggle_start_reaction_listener(!0),w.isNull(this.target_coords)?this.reload_at_selected():this.placed_div.place(this.target_coords),this.show_dropdown(),this.map.set_status("Click on the canvas or an existing metabolite"),this.direction_arrow.show()):(this.toggle_start_reaction_listener(!1),this.hide_dropdown(),this.map.set_status(null),this.direction_arrow.hide())}function i(a){this.clear_escape=this.map.key_manager.add_escape_listener(function(){this.hide_dropdown()}.bind(this),!0),this.completely.input.blur(),this.completely.repaint(),this.completely.setText(""),this.completely.input.focus()}function j(){this.clear_escape&&this.clear_escape(),this.clear_escape=null,this.placed_div.hide(),this.completely.input.blur(),this.completely.hideDropDown()}function k(){this.map.deselect_text_labels();var a=this.map.select_single_node();if(null!=a){var b={x:a.x,y:a.y};this.place(b)}}function l(a){this.placed_div.place(a),this.direction_arrow.set_location(a),this.direction_arrow.show()}function m(){this.map.deselect_text_labels();var a=this.map.select_single_node();if(null==a)return!1;var b={x:a.x,y:a.y};return this.reload(a,b,!1),!0}function n(a,b,c){function d(a,b){for(var c in b)if(b[c].bigg_id===a)return!0;return!1}if(!c&&!a)return void console.error("No selected node, and not starting from scratch");if(this.place(b),null===this.map.cobra_model)return void this.completely.setText("Cannot add: No model.");var e="name"===this.settings.get_option("identifiers_on_map"),f=this.settings.get_option("allow_building_duplicate_reactions"),g=[],h=this.map.cobra_model.reactions,i=this.map.cobra_model.metabolites,j=this.map.reactions,k=this.map.has_data_on_reactions,l=(this.map.reaction_data,this.map.reaction_data_styles,a?e?a.name:a.bigg_id:""),m=function(a,b){return a.replace(new RegExp("(^| )("+b.join("|")+")($| )","g"),"$1<b>$2</b>$3")},n={};for(var o in h){var p=h[o],q=p.name,s=e?q:o;if(f||!d(o,j))for(var t in p.metabolites)if(c||t==a.bigg_id){if(o in n)continue;i[t].name;if(k)g.push({reaction_data:p.data,html:"<b>"+s+"</b>: "+p.data_string,matches:[s],id:o}),n[o]=!0;else{var u,x={},y=[];if(e)for(u in p.metabolites){var z=i[u].name;x[z]=p.metabolites[u],y.push(z)}else{x=r.clone(p.metabolites);for(u in p.metabolites)y.push(u)}var A=w.flatten(p.genes.map(function(a){return[a.name,a.bigg_id]})),B=v.build_reaction_string(x,p.reversibility,p.lower_bound,p.upper_bound);g.push({html:"<b>"+s+"</b> "+m(B,[l]),matches:[s].concat(y).concat(A),id:o}),n[o]=!0}}}var C;C=k?function(a,b){return Math.abs(b.reaction_data)-Math.abs(a.reaction_data)}:function(a,b){return a.html.toLowerCase()<b.html.toLowerCase()?-1:1},g=g.sort(C);var D=this.completely;D.options=g,D.setText("");var E=this.direction_arrow,F=function(d){if(null!==d)if(c)this.map.new_reaction_from_scratch(d,b,E.get_rotation());else{if(!(a.node_id in this.map.nodes))return console.error("Selected node no longer exists"),void this.hide_dropdown();this.map.new_reaction_for_metabolite(d,a.node_id,E.get_rotation())}}.bind(this);D.onEnter=function(a){this.setText(""),this.onChange(""),F(a)}}function o(a){if(void 0===a)this.start_reaction_listener=!this.start_reaction_listener;else{if(this.start_reaction_listener===a)return;this.start_reaction_listener=a}this.start_reaction_listener?(this.map.sel.on("click.start_reaction",function(a){if(!this.direction_arrow.dragging){var b={x:y(a)[0],y:y(a)[1]};this.map.deselect_nodes(),this.map.deselect_text_labels(),this.reload(null,b,!0),this.show_target(this.map,b),this.show_dropdown(b)}}.bind(this,this.map.sel.node())),this.map.sel.classed("start-reaction-cursor",!0)):(this.map.sel.on("click.start_reaction",null),this.map.sel.classed("start-reaction-cursor",!1),this.hide_target())}function p(){this.target_coords&&this.map.sel.selectAll(".start-reaction-target").remove(),this.target_coords=null}function q(a,b){var c=a.sel.selectAll(".start-reaction-target").data([12,5]);c.enter().append("circle").classed("start-reaction-target",!0).attr("r",function(a){return a}).style("stroke-width",4).merge(c).style("visibility","visible").attr("transform","translate("+b.x+","+b.y+")"),this.target_coords=b}var r=a("./utils"),s=a("./PlacedDiv"),t=a("./complete.ly"),u=a("./DirectionArrow"),v=a("./CobraModel"),w=a("underscore"),x=a("d3-selection").select,y=a("d3-selection").mouse,z=r.make_class();z.prototype={init:d,setup_map_callbacks:e,setup_zoom_callbacks:f,is_visible:g,toggle:h,show_dropdown:i,hide_dropdown:j,place_at_selected:k,place:l,reload_at_selected:m,reload:n,toggle_start_reaction_listener:o,hide_target:p,show_target:q},b.exports=z},{"./CobraModel":7,"./DirectionArrow":9,"./PlacedDiv":13,"./complete.ly":27,"./utils":33,"d3-selection":53,underscore:98}],4:[function(a,b,c){function d(a,b,c,d,e){if(d?d instanceof T||(d=S("node"in d?d.node():d)):d=S("body").append("div"),e||(e={}),c||(c=O),this.map_data=a,this.model_data=b,this.embedded_css=c,this.selection=d,this.selection.datum(this),this.selection.__builder__=this,this.has_custom_reaction_styles=Boolean(e.reaction_styles),this.options=A.set_options(e,{menu:"all",scroll_behavior:"pan",use_3d_transform:!A.check_browser("safari"),enable_editing:!0,enable_keys:!0,enable_search:!0,fill_screen:!1,zoom_to_element:null,full_screen_button:!1,ignore_bootstrap:!1,starting_reaction:null,never_ask_before_quit:!1,unique_map_id:null,primary_metabolite_radius:20,secondary_metabolite_radius:10,marker_radius:5,gene_font_size:18,hide_secondary_metabolites:!1,show_gene_reaction_rules:!1,hide_all_labels:!1,canvas_size_and_loc:null,reaction_data:null,reaction_styles:["color","size","text"],reaction_compare_style:"log2_fold",reaction_scale:[{type:"min",color:"#c8c8c8",size:12},{type:"median",color:"#9696ff",size:20},{type:"max",color:"#ff0000",size:25}],reaction_no_data_color:"#dcdcdc",reaction_no_data_size:8,gene_data:null,and_method_in_gene_reaction_rule:"mean",metabolite_data:null,metabolite_styles:["color","size","text"],metabolite_compare_style:"log2_fold",metabolite_scale:[{type:"min",color:"#fffaf0",size:20},{type:"median",color:"#f1c470",size:30},{type:"max",color:"#800000",size:40}],metabolite_no_data_color:"#ffffff",metabolite_no_data_size:10,identifiers_on_map:"bigg_id",highlight_missing:!1,allow_building_duplicate_reactions:!1,cofactors:["atp","adp","nad","nadh","nadp","nadph","gtp","gdp","h","coa","ump","h20","ppi"],tooltip_component:Q,enable_tooltips:!0,first_load_callback:null},{primary_metabolite_radius:!0,secondary_metabolite_radius:!0,marker_radius:!0,gene_font_size:!0,reaction_no_data_size:!0,metabolite_no_data_size:!0}),A.check_for_parent_tag(this.selection,"svg"))throw new Error("Builder cannot be placed within an svg node becuase UI elements are html-based.");var f=function(a,b){this.options[a]=b}.bind(this),g=function(a){return this.options[a]}.bind(this),h=["hide_secondary_metabolites","show_gene_reaction_rules","hide_all_labels","scroll_behavior","reaction_styles","reaction_compare_style","reaction_scale","reaction_no_data_color","reaction_no_data_size","and_method_in_gene_reaction_rule","metabolite_styles","metabolite_compare_style","metabolite_scale","metabolite_no_data_color","metabolite_no_data_size","identifiers_on_map","highlight_missing","allow_building_duplicate_reactions","enable_tooltips"];this.settings=new J(f,g,h);var i=["reaction_scale","metabolite_scale"];i.forEach(function(a){this.settings.streams[a].onValue(function(b){var c=["min","max"];c.forEach(function(c){var d=b.reduce(function(a,b){return a||b.type===c},!1);d||(b.push({type:c,color:"#ffffff",size:10}),this.settings.set_conditional(a,b))}.bind(this))}.bind(this))}.bind(this)),this.callback_manager=G(),null!==this.options.first_load_callback&&this.callback_manager.set("first_load",this.options.first_load_callback),this.load_model(this.model_data,!1),this.load_map(this.map_data,!1);var j=this._reaction_check_add_abs();this._update_data(!0,!0),this.settings.status_bus.onValue(function(a){if("accepted"===a){if(this._update_data(!0,!0,["reaction","metabolite"],!1),null!==this.zoom_container){var b=this.settings.get_option("scroll_behavior");this.zoom_container.set_scroll_behavior(b)}null!==this.map&&(this.map.draw_all_nodes(!1),this.map.draw_all_reactions(!0,!1),this.map.select_none())}}.bind(this)),this.callback_manager.run("first_load",this),null!==j&&setTimeout(j,500)}function e(a,b){R.isUndefined(b)&&(b=!0),R.isNull(a)?this.cobra_model=null:this.cobra_model=E.from_cobra_json(a),this.map&&(this.map.cobra_model=this.cobra_model,b&&this._update_data(!0,!1),this.settings.get_option("highlight_missing")&&this.map.draw_all_reactions(!1,!1)),this.callback_manager.run("load_model",null,a,b)}function f(a,b){R.isUndefined(b)&&(b=!0);A.remove_child_nodes(this.selection),this.zoom_container=new C(this.selection,this.options.scroll_behavior,this.options.use_3d_transform,this.options.fill_screen);var c=this.zoom_container.zoomed_sel,d=this.zoom_container.svg;this.map&&this.map.key_manager.toggle(!1),null!==a?this.map=D.from_data(a,d,this.embedded_css,c,this.zoom_container,this.settings,this.cobra_model,this.options.enable_search):this.map=new D(d,this.embedded_css,c,this.zoom_container,this.settings,this.cobra_model,this.options.canvas_size_and_loc,this.options.enable_search),this.zoom_container.callback_manager.set("svg_start",function(){this.map.set_status("Drawing ...")}.bind(this)),this.zoom_container.callback_manager.set("svg_finish",function(){this.map.set_status("")}.bind(this)),b&&this._update_data(!1,!0),this.build_input=new B(this.selection,this.map,this.zoom_container,this.settings),this.text_edit_input=new L(this.selection,this.map,this.zoom_container),this.tooltip_container=new P(this.selection,this.map,this.options.tooltip_component,this.zoom_container),this.brush=new F(c,!1,this.map,".canvas-group"),this.map.canvas.callback_manager.set("resize",function(){this.brush.toggle(!0)}.bind(this)),this._setup_modes(this.map,this.brush,this.zoom_container);var e=this.selection.append("div").attr("class","search-menu-container").append("div").attr("class","search-menu-container-inline"),f=e.append("div"),g=e.append("div"),h=this.selection.append("div");this.search_bar=new I(g,this.map.search_index,this.map),this.search_bar.callback_manager.set("show",function(){this.settings_bar.toggle(!1)}.bind(this));var i=this.selection.append("div"),j=function(a,b){var c=this.options[a+"_styles"];if(b&&-1===c.indexOf("abs"))c.push("abs");else if(!b){var d=c.indexOf("abs");-1!==d&&(this.options[a+"_styles"]=c.slice(0,d).concat(c.slice(d+1)))}this._update_data(!1,!0,a)}.bind(this);this.settings_bar=new K(i,this.settings,this.map,j),this.settings_bar.callback_manager.set("show",function(){this.search_bar.toggle(!1)}.bind(this));var k=this._get_keys(this.map,this.zoom_container,this.search_bar,this.settings_bar,this.options.enable_editing,this.options.full_screen_button);if(this.map.key_manager.assigned_keys=k,this.map.key_manager.input_list=[this.build_input,this.search_bar,this.settings_bar,this.text_edit_input],this.map.key_manager.update(),this.map.key_manager.toggle(this.options.enable_keys),"all"===this.options.menu&&(this.options.ignore_bootstrap?console.error("Cannot create the dropdown menus if ignore_bootstrap = true"):this._set_up_menu(f,this.map,this.map.key_manager,k,this.options.enable_editing,this.options.enable_keys,this.options.full_screen_button)),this._set_up_button_panel(h,k,this.options.enable_editing,this.options.enable_keys,this.options.full_screen_button,this.options.menu,this.options.ignore_bootstrap),this.options.zoom_to_element){var l=this.options.zoom_to_element.type,m=this.options.zoom_to_element.id;if(R.isUndefined(l)||-1===["reaction","node"].indexOf(l))throw new Error('zoom_to_element type must be "reaction" or "node"');if(R.isUndefined(m))throw new Error("zoom_to_element must include id");"reaction"===l?this.map.zoom_to_reaction(m):"node"===l&&this.map.zoom_to_node(m)}else if(null!==a)this.map.zoom_extent_canvas();else if(null!==this.options.starting_reaction&&null!==this.cobra_model){var n=this.zoom_container.get_size(),o={x:n.width/2,y:n.height/4};this.map.new_reaction_from_scratch(this.options.starting_reaction,o,90),this.map.zoom_extent_nodes()}else this.map.zoom_extent_canvas();this._setup_status(this.selection,this.map);this._setup_quick_jump(this.selection),this.options.enable_editing?this.zoom_mode():this.view_mode(),this.options.enable_editing&&this._setup_confirm_before_exit(),this.map.draw_everything()}function g(a){this.search_bar.toggle(!1),this.build_input.toggle("build"==a),this.build_input.direction_arrow.toggle("build"==a),"all"==this.options.menu&&this.options.enable_editing&&this._toggle_direction_buttons("build"==a),this.brush.toggle("brush"==a),this.zoom_container.toggle_pan_drag("zoom"==a||"view"==a),this.map.canvas.toggle_resize("zoom"==a||"brush"==a),"rotate"==a?(this.map.behavior.toggle_selectable_drag(!1),this.map.behavior.toggle_rotation_mode(!0)):(this.map.behavior.toggle_rotation_mode("rotate"==a),this.map.behavior.toggle_selectable_drag("brush"==a)),this.map.behavior.toggle_selectable_click("build"==a||"brush"==a),this.map.behavior.toggle_label_drag("brush"==a),this.map.behavior.toggle_label_mouseover(!0),this.map.behavior.toggle_text_label_edit("text"==a),this.map.behavior.toggle_bezier_drag("brush"==a),("view"==a||"text"==a)&&this.map.select_none(),"rotate"==a&&this.map.deselect_text_labels(),this.map.draw_everything()}function h(){this.callback_manager.run("view_mode"),this._set_mode("view")}function i(){this.callback_manager.run("build_mode"),this._set_mode("build")}function j(){this.callback_manager.run("brush_mode"),this._set_mode("brush")}function k(){this.callback_manager.run("zoom_mode"),this._set_mode("zoom")}function l(){this.callback_manager.run("rotate_mode"),this._set_mode("rotate")}function m(){this.callback_manager.run("text_mode"),this._set_mode("text")}function n(){var a=this.options.reaction_styles;return null===this.options.reaction_data||this.has_custom_reaction_styles||R.contains(a,"abs")?null:(this.settings.set_conditional("reaction_styles",a.concat("abs")),function(){this.map.set_status("Visualizing absolute value of reaction data. Change this option in Settings.",5e3)}.bind(this))}function o(a){this.options.reaction_data=a;var b=this._reaction_check_add_abs();this._update_data(!0,!0,"reaction"),b?b():this.map.set_status("")}function p(a,b){b&&this.settings.set_conditional("show_gene_reaction_rules",!1),this.options.gene_data=a,this._update_data(!0,!0,"reaction"),this.map.set_status("")}function q(a){this.options.metabolite_data=a,this._update_data(!0,!0,"metabolite"),this.map.set_status("")}function r(a,b,c,d){function e(a,b,c){var d={};return null!==b&&A.extend(d,b.reactions),null!==c&&A.extend(d,c.reactions,!0),N.import_and_check(a,"gene_data",d)}void 0===c&&(c=["reaction","metabolite"]),void 0===d&&(d=!0);var f,g,h,i=-1!==c.indexOf("metabolite"),j=-1!==c.indexOf("reaction");i&&b&&null!==this.map&&(f=N.import_and_check(this.options.metabolite_data,"metabolite_data"),this.map.apply_metabolite_data_to_map(f),d&&this.map.draw_all_nodes(!1)),j&&(null!==this.options.reaction_data&&b&&null!==this.map?(g=N.import_and_check(this.options.reaction_data,"reaction_data"), this.map.apply_reaction_data_to_map(g),d&&this.map.draw_all_reactions(!1,!1)):null!==this.options.gene_data&&b&&null!==this.map?(h=e(this.options.gene_data,this.cobra_model,this.map),this.map.apply_gene_data_to_map(h),d&&this.map.draw_all_reactions(!1,!1)):b&&null!==this.map&&(this.map.apply_reaction_data_to_map(null),d&&this.map.draw_all_reactions(!1,!1))),this.update_model_timer&&clearTimeout(this.update_model_timer);var k=5;this.update_model_timer=setTimeout(function(){i&&a&&null!==this.cobra_model&&(f||(f=N.import_and_check(this.options.metabolite_data,"metabolite_data")),this.cobra_model.apply_metabolite_data(f,this.options.metabolite_styles,this.options.metabolite_compare_style)),j&&(null!==this.options.reaction_data&&a&&null!==this.cobra_model?(g||(g=N.import_and_check(this.options.reaction_data,"reaction_data")),this.cobra_model.apply_reaction_data(g,this.options.reaction_styles,this.options.reaction_compare_style)):null!==this.options.gene_data&&a&&null!==this.cobra_model?(h||(h=e(this.options.gene_data,this.cobra_model,this.map)),this.cobra_model.apply_gene_data(h,this.options.reaction_styles,this.options.identifiers_on_map,this.options.reaction_compare_style,this.options.and_method_in_gene_reaction_rule)):a&&null!==this.cobra_model&&this.cobra_model.apply_reaction_data(null,this.options.reaction_styles,this.options.reaction_compare_style)),this.callback_manager.run("update_data",null,a,b,c,d)}.bind(this),k)}function s(a,b,c,d,e,f,g,h){function i(a,b){function c(a){if(!("map_id"in a[0]&&"reactions"in a[1]&&"nodes"in a[1]&&"canvas"in a[1]))throw new Error("Bad map data.")}if(a)return console.warn(a),void this.map.set_status("Error loading map: "+a,2e3);try{c(b),this.load_map(b),this.map.set_status("Loaded map "+b[0].map_name,3e3)}catch(d){console.warn(d),this.map.set_status("Error loading map: "+d,2e3)}}function j(a,b){if(a)return console.warn(a),void this.map.set_status("Error loading model: "+a,2e3);try{this.load_model(b,!0),this.build_input.toggle(!1),"id"in b?this.map.set_status("Loaded model "+b.id,3e3):this.map.set_status("Loaded model (no model id)",3e3)}catch(c){console.warn(c),this.map.set_status("Error loading model: "+c,2e3)}}function k(a,b){return a?(console.warn(a),void this.map.set_status("Could not parse file as JSON or CSV",2e3)):(null!==b&&this.set_gene_data(null),void this.set_reaction_data(b))}function l(a,b){return a?(console.warn(a),void this.map.set_status("Could not parse file as JSON or CSV",2e3)):void this.set_metabolite_data(b)}function m(a,b){return a?(console.warn(a),void this.map.set_status("Could not parse file as JSON or CSV",2e3)):(null!==b&&this.set_reaction_data(null),this.settings.set_conditional("show_gene_reaction_rules",!0),void this.set_gene_data(b))}var n=a.attr("id","menu").append("ul").attr("class","nav nav-pills");H.dropdown_menu(n,"Map").button({key:d.save,text:"Save map JSON",key_text:f?" (Ctrl+S)":null}).button({text:"Load map JSON",key_text:f?" (Ctrl+O)":null,input:{assign:c.assigned_keys.load,key:"fn",fn:i.bind(this),pre_fn:function(){b.set_status("Loading map ...")},failure_fn:function(){b.set_status("")}}}).button({key:d.save_svg,text:"Export as SVG",key_text:f?" (Ctrl+Shift+S)":null}).button({key:d.save_png,text:"Export as PNG",key_text:f?" (Ctrl+Shift+P)":null}).button({key:d.clear_map,text:"Clear map"});var o=H.dropdown_menu(n,"Model").button({text:"Load COBRA model JSON",key_text:f?" (Ctrl+M)":null,input:{assign:c.assigned_keys.load_model,key:"fn",fn:j.bind(this),pre_fn:function(){b.set_status("Loading model ...")},failure_fn:function(){b.set_status("")}}}).button({id:"convert_map",key:d.convert_map,text:"Update names and gene reaction rules using model"}).button({id:"clear_model",key:d.clear_model,text:"Clear model"}),p=function(){o.dropdown.selectAll("li").classed("escher-disabled",function(a){return"clear_model"!=a.id&&"convert_map"!=a.id||null!==this.cobra_model?null:!0}.bind(this))}.bind(this);p(),this.callback_manager.set("load_model",p);var q=H.dropdown_menu(n,"Data").button({input:{assign:c.assigned_keys.load_reaction_data,key:"fn",fn:k.bind(this),accept_csv:!0,pre_fn:function(){b.set_status("Loading reaction data ...")},failure_fn:function(){b.set_status("")}},text:"Load reaction data"}).button({key:d.clear_reaction_data,text:"Clear reaction data"}).divider().button({input:{fn:m.bind(this),accept_csv:!0,pre_fn:function(){b.set_status("Loading gene data ...")},failure_fn:function(){b.set_status("")}},text:"Load gene data"}).button({key:d.clear_gene_data,text:"Clear gene data"}).divider().button({input:{fn:l.bind(this),accept_csv:!0,pre_fn:function(){b.set_status("Loading metabolite data ...")},failure_fn:function(){b.set_status("")}},text:"Load metabolite data"}).button({key:d.clear_metabolite_data,text:"Clear metabolite data"}),r=function(){q.dropdown.selectAll("li").classed("escher-disabled",function(a){return a?"Clear reaction data"==a.text&&null===this.options.reaction_data?!0:"Clear gene data"==a.text&&null===this.options.gene_data?!0:"Clear metabolite data"==a.text&&null===this.options.metabolite_data?!0:null:null}.bind(this))}.bind(this);r(),this.callback_manager.set("update_data",r);var s=H.dropdown_menu(n,"Edit",!0);e?s.button({key:d.zoom_mode,id:"zoom-mode-menu-button",text:"Pan mode",key_text:f?" (Z)":null}).button({key:d.brush_mode,id:"brush-mode-menu-button",text:"Select mode",key_text:f?" (V)":null}).button({key:d.build_mode,id:"build-mode-menu-button",text:"Add reaction mode",key_text:f?" (N)":null}).button({key:d.rotate_mode,id:"rotate-mode-menu-button",text:"Rotate mode",key_text:f?" (R)":null}).button({key:d.text_mode,id:"text-mode-menu-button",text:"Text mode",key_text:f?" (T)":null}).divider().button({key:d["delete"],text:"Delete",key_text:f?" (Del)":null}).button({key:d.undo,text:"Undo",key_text:f?" (Ctrl+Z)":null}).button({key:d.redo,text:"Redo",key_text:f?" (Ctrl+Shift+Z)":null}).button({key:d.toggle_primary,text:"Toggle primary/secondary",key_text:f?" (P)":null}).button({key:d.cycle_primary,text:"Rotate reactant locations",key_text:f?" (C)":null}).button({key:d.select_all,text:"Select all",key_text:f?" (Ctrl+A)":null}).button({key:d.select_none,text:"Select none",key_text:f?" (Ctrl+Shift+A)":null}).button({key:d.invert_selection,text:"Invert selection"}):s.button({key:d.view_mode,id:"view-mode-menu-button",text:"View mode"});var t=H.dropdown_menu(n,"View",!0).button({key:d.zoom_in,text:"Zoom in",key_text:f?" (+)":null}).button({key:d.zoom_out,text:"Zoom out",key_text:f?" (-)":null}).button({key:d.extent_nodes,text:"Zoom to nodes",key_text:f?" (0)":null}).button({key:d.extent_canvas,text:"Zoom to canvas",key_text:f?" (1)":null}).button({key:d.search,text:"Find",key_text:f?" (F)":null});g&&t.button({key:d.full_screen,text:"Full screen",key_text:f?" (2)":null}),e&&(t.button({key:d.toggle_beziers,id:"bezier-button",text:"Show control points",key_text:f?" (B)":null}),b.callback_manager.set("toggle_beziers.button",function(a){n.select("#bezier-button").select(".dropdown-button-text").text((a?"Hide":"Show")+" control points"+(f?" (B)":""))})),t.divider().button({key:d.show_settings,text:"Settings",key_text:f?" (,)":null}),n.append("a").attr("class","help-button").attr("target","#").attr("href","https://escher.readthedocs.org").text("?");var u=function(a){$(this.selection.node()).find("#"+a).button("toggle");var b=["zoom-mode-menu-button","brush-mode-menu-button","build-mode-menu-button","rotate-mode-menu-button","view-mode-menu-button","text-mode-menu-button"];b.forEach(function(b){var c=b.replace("-menu","");this.selection.select("#"+b).select("span").classed("glyphicon",c==a).classed("glyphicon-ok",c==a)}.bind(this))};this.callback_manager.set("zoom_mode",u.bind(this,"zoom-mode-button")),this.callback_manager.set("brush_mode",u.bind(this,"brush-mode-button")),this.callback_manager.set("build_mode",u.bind(this,"build-mode-button")),this.callback_manager.set("rotate_mode",u.bind(this,"rotate-mode-button")),this.callback_manager.set("view_mode",u.bind(this,"view-mode-button")),this.callback_manager.set("text_mode",u.bind(this,"text-mode-button"))}function t(a,b,c,d,e,f,g){var h=a.append("ul").attr("class","nav nav-pills nav-stacked").attr("id","button-panel");if(H.individual_button(h.append("li"),{key:b.zoom_in,text:"+",icon:"glyphicon glyphicon-plus-sign",tooltip:"Zoom in",key_text:d?" (+)":null,ignore_bootstrap:g}),H.individual_button(h.append("li"),{key:b.zoom_out,text:"–",icon:"glyphicon glyphicon-minus-sign",tooltip:"Zoom out",key_text:d?" (-)":null,ignore_bootstrap:g}),H.individual_button(h.append("li"),{key:b.extent_canvas,text:"↔",icon:"glyphicon glyphicon-resize-full",tooltip:"Zoom to canvas",key_text:d?" (1)":null,ignore_bootstrap:g}),e&&H.individual_button(h.append("li"),{key:b.full_screen,text:"▣",icon:"glyphicon glyphicon-fullscreen",tooltip:"Full screen",key_text:d?" (2)":null,ignore_bootstrap:g}),c&&"all"===f){H.radio_button_group(h.append("li")).button({key:b.zoom_mode,id:"zoom-mode-button",text:"Z",icon:"glyphicon glyphicon-move",tooltip:"Pan mode",key_text:d?" (Z)":null,ignore_bootstrap:g}).button({key:b.brush_mode,text:"V",id:"brush-mode-button",icon:"glyphicon glyphicon-hand-up",tooltip:"Select mode",key_text:d?" (V)":null,ignore_bootstrap:g}).button({key:b.build_mode,text:"N",id:"build-mode-button",icon:"glyphicon glyphicon-plus",tooltip:"Add reaction mode",key_text:d?" (N)":null,ignore_bootstrap:g}).button({key:b.rotate_mode,text:"R",id:"rotate-mode-button",icon:"glyphicon glyphicon-repeat",tooltip:"Rotate mode",key_text:d?" (R)":null,ignore_bootstrap:g}).button({key:b.text_mode,text:"T",id:"text-mode-button",icon:"glyphicon glyphicon-font",tooltip:"Text mode",key_text:d?" (T)":null,ignore_bootstrap:g}),this.direction_buttons=h.append("li");H.button_group(this.direction_buttons).button({key:b.direction_arrow_left,text:"←",icon:"glyphicon glyphicon-arrow-left",tooltip:"Direction arrow (←)",ignore_bootstrap:g}).button({key:b.direction_arrow_right,text:"→",icon:"glyphicon glyphicon-arrow-right",tooltip:"Direction arrow (→)",ignore_bootstrap:g}).button({key:b.direction_arrow_up,text:"↑",icon:"glyphicon glyphicon-arrow-up",tooltip:"Direction arrow (↑)",ignore_bootstrap:g}).button({key:b.direction_arrow_down,text:"↓",icon:"glyphicon glyphicon-arrow-down",tooltip:"Direction arrow (↓)",ignore_bootstrap:g})}}function u(a){R.isUndefined(a)&&(a="block"===!this.direction_buttons.style("display")),this.direction_buttons.style("display",a?"block":"none")}function v(a,b){var c=a.append("div").attr("id","status");return b.callback_manager.set("set_status",function(a){c.html(a)}),c}function w(a){var b=function(a,b,c){if(this.options.enable_editing&&!this.options.never_ask_before_quit&&!confirm("You will lose any unsaved changes.\n\nAre you sure you want to switch maps?"))return void(c&&c(!1));this.map.set_status("Loading map "+a+" ...");var d=A.name_to_url(a,b);U(d,function(a,b){return a?(console.warn("Could not load data: "+a),this.map.set_status("Could not load map",2e3),void(c&&c(!1))):(c&&c(!0),this.load_map(b),void this.map.set_status(""))}.bind(this))}.bind(this);this.quick_jump=M(a,b)}function x(a,b,c){var d={};a.callback_manager.set("start_rotation",function(){d.brush=b.enabled,b.toggle(!1),d.zoom=c.zoom_on,c.toggle_pan_drag(!1),d.selectable_mousedown=null!==a.behavior.selectable_mousedown,a.behavior.toggle_selectable_click(!1),d.label_mouseover=null!==a.behavior.label_mouseover,a.behavior.toggle_label_mouseover(!1)}),a.callback_manager.set("end_rotation",function(){b.toggle(d.brush),c.toggle_pan_drag(d.zoom),a.behavior.toggle_selectable_click(d.selectable_mousedown),a.behavior.toggle_label_mouseover(d.label_mouseover),d={}})}function y(a,b,c,d,e,f){var g={save:{key:"ctrl+s",target:a,fn:a.save},save_svg:{key:"ctrl+shift+s",target:a,fn:a.save_svg},save_png:{key:"ctrl+shift+p",target:a,fn:a.save_png},load:{key:"ctrl+o",fn:null},convert_map:{target:a,fn:a.convert_map},clear_map:{target:a,fn:a.clear_map},load_model:{key:"ctrl+m",fn:null},clear_model:{fn:this.load_model.bind(this,null,!0)},load_reaction_data:{fn:null},clear_reaction_data:{target:this,fn:function(){this.set_reaction_data(null)}},load_metabolite_data:{fn:null},clear_metabolite_data:{target:this,fn:function(){this.set_metabolite_data(null)}},load_gene_data:{fn:null},clear_gene_data:{target:this,fn:function(){this.set_gene_data(null,!0)}},zoom_in_ctrl:{key:"ctrl+=",target:b,fn:b.zoom_in},zoom_in:{key:"=",target:b,fn:b.zoom_in,ignore_with_input:!0},zoom_out_ctrl:{key:"ctrl+-",target:b,fn:b.zoom_out},zoom_out:{key:"-",target:b,fn:b.zoom_out,ignore_with_input:!0},extent_nodes_ctrl:{key:"ctrl+0",target:a,fn:a.zoom_extent_nodes},extent_nodes:{key:"0",target:a,fn:a.zoom_extent_nodes,ignore_with_input:!0},extent_canvas_ctrl:{key:"ctrl+1",target:a,fn:a.zoom_extent_canvas},extent_canvas:{key:"1",target:a,fn:a.zoom_extent_canvas,ignore_with_input:!0},search_ctrl:{key:"ctrl+f",fn:c.toggle.bind(c,!0)},search:{key:"f",fn:c.toggle.bind(c,!0),ignore_with_input:!0},view_mode:{target:this,fn:this.view_mode,ignore_with_input:!0},show_settings_ctrl:{key:"ctrl+,",target:d,fn:d.toggle},show_settings:{key:",",target:d,fn:d.toggle,ignore_with_input:!0}};return f&&A.extend(g,{full_screen_ctrl:{key:"ctrl+2",target:a,fn:a.full_screen},full_screen:{key:"2",target:a,fn:a.full_screen,ignore_with_input:!0}}),e&&A.extend(g,{build_mode:{key:"n",target:this,fn:this.build_mode,ignore_with_input:!0},zoom_mode:{key:"z",target:this,fn:this.zoom_mode,ignore_with_input:!0},brush_mode:{key:"v",target:this,fn:this.brush_mode,ignore_with_input:!0},rotate_mode:{key:"r",target:this,fn:this.rotate_mode,ignore_with_input:!0},text_mode:{key:"t",target:this,fn:this.text_mode,ignore_with_input:!0},toggle_beziers:{key:"b",target:a,fn:a.toggle_beziers,ignore_with_input:!0},delete_ctrl:{key:"ctrl+backspace",target:a,fn:a.delete_selected,ignore_with_input:!0},"delete":{key:"backspace",target:a,fn:a.delete_selected,ignore_with_input:!0},delete_del:{key:"del",target:a,fn:a.delete_selected,ignore_with_input:!0},toggle_primary:{key:"p",target:a,fn:a.toggle_selected_node_primary,ignore_with_input:!0},cycle_primary:{key:"c",target:a,fn:a.cycle_primary_node,ignore_with_input:!0},direction_arrow_right:{key:"right",target:this.build_input.direction_arrow,fn:this.build_input.direction_arrow.right,ignore_with_input:!0},direction_arrow_down:{key:"down",target:this.build_input.direction_arrow,fn:this.build_input.direction_arrow.down,ignore_with_input:!0},direction_arrow_left:{key:"left",target:this.build_input.direction_arrow,fn:this.build_input.direction_arrow.left,ignore_with_input:!0},direction_arrow_up:{key:"up",target:this.build_input.direction_arrow,fn:this.build_input.direction_arrow.up,ignore_with_input:!0},undo:{key:"ctrl+z",target:a.undo_stack,fn:a.undo_stack.undo},redo:{key:"ctrl+shift+z",target:a.undo_stack,fn:a.undo_stack.redo},select_all:{key:"ctrl+a",target:a,fn:a.select_all},select_none:{key:"ctrl+shift+a",target:a,fn:a.select_none},invert_selection:{target:a,fn:a.invert_selection}}),g}function z(){window.onbeforeunload=function(a){return a=a||window.event,this.options.never_ask_before_quit?null:"You will lose any unsaved changes."}.bind(this)}var A=a("./utils"),B=a("./BuildInput"),C=a("./ZoomContainer"),D=a("./Map"),E=a("./CobraModel"),F=a("./Brush"),G=a("./CallbackManager"),H=a("./ui"),I=a("./SearchBar"),J=a("./Settings"),K=a("./SettingsMenu"),L=a("./TextEditInput"),M=a("./QuickJump"),N=a("./data_styles"),O=a("./inline").builder_embed,P=a("./TooltipContainer"),Q=a("./Tooltip").DefaultTooltip,R=a("underscore"),S=a("d3-selection").select,T=a("d3-selection").selection,U=a("d3-request").json,V=A.make_class();V.prototype={init:d,load_map:f,load_model:e,_set_mode:g,view_mode:h,build_mode:i,brush_mode:j,zoom_mode:k,rotate_mode:l,text_mode:m,_reaction_check_add_abs:n,set_reaction_data:o,set_metabolite_data:q,set_gene_data:p,_update_data:r,_toggle_direction_buttons:u,_set_up_menu:s,_set_up_button_panel:t,_setup_status:v,_setup_quick_jump:w,_setup_modes:x,_get_keys:y,_setup_confirm_before_exit:z},b.exports=V},{"./Brush":2,"./BuildInput":3,"./CallbackManager":5,"./CobraModel":7,"./Map":12,"./QuickJump":14,"./SearchBar":17,"./Settings":19,"./SettingsMenu":20,"./TextEditInput":21,"./Tooltip":22,"./TooltipContainer":23,"./ZoomContainer":25,"./data_styles":28,"./inline":29,"./ui":32,"./utils":33,"d3-request":51,"d3-selection":53,underscore:98}],5:[function(a,b,c){function d(){}function e(a,b){return void 0===this.callbacks&&(this.callbacks={}),void 0===this.callbacks[a]&&(this.callbacks[a]=[]),this.callbacks[a].push(b),this}function f(a){return(void 0===this.callbacks||0==Object.keys(this.callbacks).length)&&console.warn("No callbacks to remove"),delete this.callbacks[a],this}function g(a,b){if(i.isUndefined(this.callbacks))return this;i.isUndefined(b)&&(b=null);var c=Array.prototype.slice.call(arguments,2);for(var d in this.callbacks){var e=d.split(".")[0];e==a&&this.callbacks[d].forEach(function(a){a.apply(b,c)})}return this}var h=a("./utils"),i=a("underscore"),j=h.make_class();j.prototype={init:d,set:e,remove:f,run:g},b.exports=j},{"./utils":33,underscore:98}],6:[function(a,b,c){function d(a,b){this.selection=a,this.x=b.x,this.y=b.y,this.width=b.width,this.height=b.height,this.resize_enabled=!0,this.callback_manager=new i,this.setup()}function e(a){l.isUndefined(a)&&(a=!this.resize_enabled),a?this.selection.selectAll(".drag-rect").style("pointer-events","auto"):this.selection.selectAll(".drag-rect").style("pointer-events","none")}function f(){function a(){k.event.sourceEvent.stopPropagation()}function b(a,b,c){var d=h.d3_transform_catch(c),e=d.translate;return null!==a&&(e[0]=a),null!==b&&(e[1]=b),"translate("+e+")"}function c(a){var c=a.x;a.x=Math.min(a.x+g.width-i/2,k.event.x),g.x=a.x,g.width=g.width+(c-a.x),t.attr("transform",function(a){return b(a.x-i/2,null,t.attr("transform"))}),n.attr("transform",function(a){return b(a.x,null,n.attr("transform"))}).attr("width",g.width*l),o.attr("transform",function(a){return b(a.x,null,o.attr("t