LP={CANVAS_WIDTH:430,CANVAS_HEIGHT:500,LINE_LENGTH:500,ARC_THICKNESS:20,ARC_MARKER_THICKNESS:30,SHORT_FEATURE:0.01,BACKBONE_FILL_COLOR:"#ffffcc",BACKBONE_STROKE_COLOR:"#cccc99",LABEL_DISTANCE:40,FONT_SIZE:13,LABEL_COLOR:"navy",ENZYME_LABEL_COLOR:"#940000",sequence_to_pos:function(b,a){if(a==0){return(this.CANVAS_WIDTH/2-this.LINE_LENGTH/2)}return(b/(a))*this.LINE_LENGTH+(this.CANVAS_WIDTH/2-this.LINE_LENGTH/2)},mid_point:function(a,e,c){if(a<e){return(e+a)/2}else{var d=this.sequence_to_pos(0,c);var b=this.sequence_to_pos(c,c);total=(e-d)+(b-a);if((b-a)>(e-d)){return a+total/2}else{return e-total/2}}}};function generate_linear(U,k,V){var u=[LP.CANVAS_HEIGHT/2,LP.CANVAS_HEIGHT/2+LP.ARC_MARKER_THICKNESS,LP.CANVAS_HEIGHT/2+2*LP.ARC_MARKER_THICKNESS,LP.CANVAS_HEIGHT/2+3*LP.ARC_MARKER_THICKNESS];var E=[];var Y=[];var p=[];var F=[];var a=[LP.CANVAS_WIDTH/2,LP.CANVAS_HEIGHT/2];document.getElementById(V).innerHTML="";var K=Raphael(V,LP.CANVAS_WIDTH,LP.CANVAS_HEIGHT);for(var W=0,l=k.length;W<l;W++){var G=k[W];if(G.is_translation){continue}if(G.is_enzyme&&!DS.show_restrictions_in_graphics){continue}if(G.is_orf&&!DS.show_orfs_in_graphics){continue}if(!G.is_enzyme&&!G.is_orf&&!DS.show_features_in_graphics){continue}var c=u[0];var b=LP.sequence_to_pos(G.sequence_start-1,U);var n=LP.sequence_to_pos(G.sequence_end,U);if(Math.abs(n-b)<LP.SHORT_FEATURE*LP.LINE_LENGTH||G.is_enzyme){Y.push(new LineMarker(G.feature_id,[(b+n)/2,c],LP.ARC_MARKER_THICKNESS,4,"navy"));var H=LP.mid_point(b,n,U);var y=[H,c-LP.LABEL_DISTANCE];var X=y[0]<a[0]?1:-1;var h=[H+X,c-LP.ARC_THICKNESS];var g=[H,c-LP.ARC_THICKNESS/2];var Z=G.name.truncate(20);var C=testLabelDims(K,Z);var z=G.is_enzyme?LP.ENZYME_LABEL_COLOR:LP.LABEL_COLOR;p.push(new ItemLabel(G.feature_id,y,h,g,a,Z,z,C))}else{F.push(G)}}for(var W=0,l=F.length;W<l;W++){var G=F[W];var b=LP.sequence_to_pos(G.sequence_start-1,U);var n=LP.sequence_to_pos(G.sequence_end,U);for(var S=0,A=u.length;S<A;S++){var c=u[S];var D="#66cc99";var v=LP.ARC_THICKNESS;if(FEATURE_COLORS[G.feature_type]!=null){D=FEATURE_COLORS[G.feature_type]}if(G.is_orf==true){D="#999999";v=LP.ARC_THICKNESS/2}var B=new Arrow(G.feature_id,b,n,c,G.complementary,U,v,D);var t=false;for(var Q=0,T=E.length;Q<T;Q++){t=t||B.intersects(E[Q])}if(t){continue}E.push(B);var H=LP.mid_point(b,n,U);var y=[H,u[0]-LP.LABEL_DISTANCE];var g=[H,c-LP.ARC_THICKNESS/2];var X=y[0]<a[0]?1:-1;var h=[H+X,u[0]-LP.ARC_THICKNESS];var Z=G.name.truncate(20);var C=testLabelDims(K,Z);if(G.is_orf!=true){p.push(new ItemLabel(G.feature_id,y,h,g,a,Z,LP.LABEL_COLOR,C))}break}}LO.organize_labels(p);E.splice(0,0,new BackboneLine(a,LP.LINE_LENGTH,4,LP.BACKBONE_FILL_COLOR,LP.BACKBONE_STROKE_COLOR));var q=LP.sequence_to_pos(0,U)-5;var m=LP.CANVAS_HEIGHT;var N=LP.sequence_to_pos(U,U)+5;var M=0;for(var S=0,x=p.length;S<x;S++){var L=p[S];q=Math.min(L.x(),q);m=Math.min(L.y(),m);N=Math.max(L.x()+L.width(),N);M=Math.max(L.y()+L.height(),M)}var J=1;var P=0;var O=0;if(q<0||m<0||N>LP.CANVAS_WIDTH||M>LP.CANVAS_HEIGHT){if(q<0){J=Math.min(J,(-LP.CANVAS_WIDTH/2)/(q-LP.CANVAS_WIDTH/2))}if(N>LP.CANVAS_WIDTH){J=Math.min(J,(LP.CANVAS_WIDTH/2)/(N-LP.CANVAS_WIDTH/2))}if(m<0){J=Math.min(J,(-LP.CANVAS_HEIGHT/2)/(m-LP.CANVAS_HEIGHT/2))}if(M>LP.CANVAS_HEIGHT){J=Math.min(J,(LP.CANVAS_HEIGHT/2)/(M-LP.CANVAS_HEIGHT/2))}P=(1-J)*LP.CANVAS_WIDTH/2;O=(1-J)*LP.CANVAS_HEIGHT/2}E=E.concat(Y,p);for(var S=0,w=E.length;S<w;S++){E[S].draw(K,J,P,O)}var o={stroke:"#555555","stroke-width":2,fill:"none"};var I=[J*LP.sequence_to_pos(0,U)+P,J*(u[0]-LP.ARC_MARKER_THICKNESS)+O];var R=[J*LP.sequence_to_pos(0,U)+P,J*(u[0]+2*LP.ARC_MARKER_THICKNESS)+O];start_hand=K.path(o,"M "+I[0]+" "+I[1]+" L "+R[0]+" "+R[1]);end_hand=K.path(o,"M "+I[0]+" "+I[1]+" L "+R[0]+" "+R[1]);var e={stroke:"#555555","stroke-width":J*10,"stroke-linecap":"round"};hand_arc1=K.path(e).moveTo(R[0],R[1]).lineTo(R[0],R[1]);hand_arc2=K.path(e).moveTo(R[0],R[1]).lineTo(R[0],R[1]);return{height:u[0],start_hand:start_hand,end_hand:end_hand,hand_arc1:hand_arc1,hand_arc2:hand_arc2,sequence_length:U,updateHand:function(f,i){var j=Raphael.parsePathString(f.attr("path"));var r=[J*LP.sequence_to_pos(i,U)+P,J*(this.height-LP.ARC_MARKER_THICKNESS)+O];var d=[J*LP.sequence_to_pos(i,U)+P,J*(this.height+2*LP.ARC_MARKER_THICKNESS)+O];j[0][1]=r[0];j[0][2]=r[1];j[1][1]=d[0];j[1][2]=d[1];f.attr({path:j.join(" ")});return d},updateBoth:function(i,j){var aa=this.updateHand(this.start_hand,i);var f=this.updateHand(this.end_hand,j+1);if(i<=j){var s=Raphael.parsePathString(hand_arc1.attr("path"));s[0][1]=aa[0];s[0][2]=aa[1];s[1][1]=f[0];s[1][2]=f[1];hand_arc1.attr({path:s.join(" ")});var s=Raphael.parsePathString(hand_arc2.attr("path"));s[0][1]=aa[0];s[0][2]=aa[1];s[1][1]=f[0];s[1][2]=f[1];hand_arc2.attr({path:s.join(" ")})}else{var r=[J*LP.sequence_to_pos(0,U)+P,J*(this.height+2*LP.ARC_MARKER_THICKNESS)+O];var d=[J*LP.sequence_to_pos(U,U)+P,J*(this.height+2*LP.ARC_MARKER_THICKNESS)+O];var s=Raphael.parsePathString(hand_arc1.attr("path"));s[0][1]=aa[0];s[0][2]=aa[1];s[1][1]=d[0];s[1][2]=d[1];hand_arc1.attr({path:s.join(" ")});var s=Raphael.parsePathString(hand_arc2.attr("path"));s[0][1]=r[0];s[0][2]=r[1];s[1][1]=f[0];s[1][2]=f[1];hand_arc2.attr({path:s.join(" ")})}},sequence_to_pos:function(f,d){return[J*LP.sequence_to_pos(f,d)+P,J*(this.height)+O]},pos_to_sequence:function(d,j,f){d=(d-P)/J;j=(j-O)/J;var i=Math.round(((d-LP.CANVAS_WIDTH/2+LP.LINE_LENGTH/2)/LP.LINE_LENGTH)*(f));i=Math.min(i,f);i=Math.max(i,1);return i}}}function BackboneLine(a,c,b,e,d){this.center=a;this.length=c;this.thickness=b;this.fill_color=e;this.stroke_color=d}BackboneLine.prototype.draw=function draw(e,d,b,a){var c=e.rect(d*(this.center[0]-this.length/2)+b,d*(this.center[1]-this.thickness/2)+a,d*this.length,d*this.thickness);c.attr({"stroke-width":1,fill:this.fill_color,stroke:this.stroke_color})};function LineMarker(c,a,e,d,b){this.feature_id=c;this.color=b;this.thickness=d;this.line_start=QaDV.add(a,[0,-e/2]);this.line_end=QaDV.add(a,[0,e/2])}LineMarker.prototype.draw=function(f,e,c,a){var b={stroke:this.color,"stroke-width":e*this.thickness,fill:"none"};var g=f.path(b,"M "+(e*this.line_start[0]+c)+" "+(e*this.line_start[1]+a)+" L "+(e*this.line_end[0]+c)+" "+(e*this.line_end[1]+a));var d=this.feature_id;g.node.onclick=function(){CF.click(d)}};function Arrow(d,a,b,j,f,e,h,c){this.feature_id=d;this.pos_start=a;this.pos_end=b;this.complementary=f;this.height=j;var g=f?-1:1;if(!f){this.visual_start=a;this.visual_end=b-g*0.015*LP.LINE_LENGTH;this.visual_end_eps=b-g*0.01*LP.LINE_LENGTH;this.arrow_end=b}else{this.visual_start=a-g*0.01*LP.LINE_LENGTH;this.visual_end=a-g*0.015*LP.LINE_LENGTH;this.visual_end_eps=b;this.arrow_end=a}this.thickness=h;this.color=c;this.sequence_start_pos=LP.sequence_to_pos(0,e);this.sequence_end_pos=LP.sequence_to_pos(e,e);var i=[this.visual_end,j];this.v1=[i[0],(j-3*h/4)];this.v2=[i[0],(j+3*h/4)]}Arrow.prototype.draw=function(a,j,f,d){var c={stroke:this.color,"stroke-width":this.thickness*j,"stroke-linecap":"butt"};if(this.pos_end>this.pos_start){var k=a.path(c).moveTo(j*this.visual_start+f,j*this.height+d).lineTo(j*this.visual_end_eps+f,j*this.height+d);k.node.onclick=function(){CF.click(e)}}else{var i=a.path(c).moveTo(j*this.visual_start+f,j*this.height+d).lineTo(j*this.sequence_end_pos+f,j*this.height+d);i.node.onclick=function(){CF.click(e)};var h=a.path(c).moveTo(j*this.sequence_start_pos+f,j*this.height+d).lineTo(j*this.visual_end_eps+f,j*this.height+d);h.node.onclick=function(){CF.click(e)}}var b={stroke:"none","stroke-width":0,fill:this.color};var g=a.path(b,"M "+(j*this.v1[0]+f)+" "+(j*this.v1[1]+d)+" L "+(j*this.v2[0]+f)+" "+(j*this.v2[1]+d)+" L "+(j*this.arrow_end+f)+" "+(j*this.height+d)+" L "+(j*this.v1[0]+f)+" "+(j*this.v1[1]+d));var e=this.feature_id;g.node.onclick=function(){CF.click(e)}};Arrow.prototype.intersects=function(f){if(f.height!=this.height){return false}function d(h,i,j,g){return((j>=h&&j<=i)||(g>=h&&g<=i)||(h>=j&&h<=g)||(i>=j&&i<=g))}var b=this.pos_start;var c=this.pos_end;var e=f.pos_start;var a=f.pos_end;if(b<=c){if(e<=a){return d(b,c,e,a)}else{return d(b,c,e,this.sequence_end_pos)||d(b,c,this.sequence_start_pos,a)}}else{if(e<=a){return d(e,a,b,this.sequence_end_pos)||d(e,a,this.sequence_start_pos,c)}else{return true}}};