CP={CANVAS_WIDTH:430,CANVAS_HEIGHT:500,RADIUS:130,ARC_THICKNESS:20,ARC_MARKER_THICKNESS:30,SHORT_FEATURE:0.05,BACKBONE_FILL_COLOR:"#ffffcc",BACKBONE_STROKE_COLOR:"#cccc99",LABEL_DISTANCE:40,FONT_SIZE:13,LABEL_COLOR:"navy",ENZYME_LABEL_COLOR:"#940000",sequence_to_angle:function(b,a){if(a==0){return -Math.PI/2}return(b/a*(2*Math.PI))-Math.PI/2},mid_angle:function(c,e){if(c<e){return(c+e)/2}else{var a=c+Math.PI/2;var b=e+Math.PI/2;var d=0;if(b<a){d=b+(Math.PI*2-a)}else{d=b-a}return c+d/2}}};QaDV={distance_squared:function(b,a){var e=b[0]-a[0];var c=e*e;e=b[1]-a[1];c=c+e*e;return c},polar_to_euclidean:function(c,b,a){return[Math.cos(c)*b+a[0],Math.sin(c)*b+a[1]]},scale:function(c,b){var d=[0,0];d[0]=c[0]*b;d[1]=c[1]*b;return d},scaleInPlace:function(c,b){c[0]=c[0]*b;c[1]=c[1]*b},add:function(e,d){var f=[0,0];f[0]=e[0]+d[0];f[1]=e[1]+d[1];return f},sub:function(e,d){var f=[0,0];f[0]=e[0]-d[0];f[1]=e[1]-d[1];return f}};function BackboneCircle(b,a,c,e,d){this.center=b;this.radius=a;this.thickness=c;this.fill_color=e;this.stroke_color=d}BackboneCircle.prototype.draw=function draw(d,c,b,a){var f=d.circle(c*this.center[0]+b,c*this.center[1]+a,c*(this.radius+this.thickness/2));var e=d.circle(c*this.center[0]+b,c*this.center[1]+a,c*(this.radius-this.thickness/2));f.attr({"stroke-width":1,fill:this.fill_color,stroke:this.stroke_color});e.attr({"stroke-width":1,fill:"white",stroke:this.stroke_color})};function ArcMarker(d,i,a,e,b,g,c){this.feature_id=d;var j=QaDV.sub(i,a);var h=QaDV.scale(j,(e-b/2)/e);var f=QaDV.scale(j,(e+b/2)/e);this.color=c;this.thickness=g;this.line_start=QaDV.add(h,a);this.line_end=QaDV.add(f,a)}ArcMarker.prototype.draw=function(f,e,c,a){var b={stroke:this.color,"stroke-width":this.thickness*e,fill:"none"};var g=f.path(b,"M "+(this.line_start[0]*e+c)+" "+(this.line_start[1]*e+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 Arc(d,e,l,m,f,a,i,c){this.feature_id=d;this.radius=e;this.center=a;this.angle_start=l;this.angle_end=m;this.arc_start=QaDV.polar_to_euclidean(l,e,a);this.arc_end=QaDV.polar_to_euclidean(m,e,a);var h=f?-1:1;if(!f){this.visual_arc_start=this.arc_start;this.visual_arc_end=QaDV.polar_to_euclidean(m-h*0.06,e,a);this.visual_arc_end_eps=QaDV.polar_to_euclidean(m-h*0.05,e,a);this.arrow_end=this.arc_end}else{this.visual_arc_start=this.arc_end;this.visual_arc_end=QaDV.polar_to_euclidean(l-h*0.06,e,a);this.visual_arc_end_eps=QaDV.polar_to_euclidean(l-h*0.05,e,a);this.arrow_end=this.arc_start}this.sweep=f?0:1;this.thickness=i;this.color=c;var k=QaDV.sub(this.visual_arc_end,a);var b=i*1.5;var j=QaDV.scale(k,(e-b/2)/e);var g=QaDV.scale(k,(e+b/2)/e);this.v1=QaDV.add(j,a);this.v2=QaDV.add(g,a)}Arc.prototype.arc_length=function(){var a=this.angle_start+Math.PI/2;var b=this.angle_end+Math.PI/2;if(b<a){return b+(Math.PI*2-a)}else{return(b-a)}};Arc.prototype.draw=function(a,j,h,f){var d=this.arc_length()>Math.PI?1:0;var e={stroke:this.color,"stroke-width":j*this.thickness,"stroke-linecap":"butt"};var b=a.path(e).moveTo(j*this.visual_arc_start[0]+h,j*this.visual_arc_start[1]+f).arcTo(j*this.radius,j*this.radius,d,this.sweep,(j*this.visual_arc_end_eps[0]+h),(j*this.visual_arc_end_eps[1]+f));var c={stroke:"none","stroke-width":0,fill:this.color};var i=a.path(c,"M "+(j*this.v1[0]+h)+" "+(j*this.v1[1]+f)+" L "+(j*this.v2[0]+h)+" "+(j*this.v2[1]+f)+" L "+(j*this.arrow_end[0]+h)+" "+(j*this.arrow_end[1]+f)+" L "+(j*this.v1[0]+h)+" "+(j*this.v1[1]+f)).andClose();var g=this.feature_id;b.node.onclick=function(){CF.click(g)};i.node.onclick=function(){CF.click(g)}};Arc.prototype.intersects=function(f){function d(h,i,j,g){return((j>=h&&j<=i)||(g>=h&&g<=i)||(h>=j&&h<=g)||(i>=j&&i<=g))}if(f.radius!=this.radius){return false}var b=this.angle_start+Math.PI/2;var c=this.angle_end+Math.PI/2;var e=f.angle_start+Math.PI/2;var a=f.angle_end+Math.PI/2;if(b<=c){if(e<=a){return d(b,c,e,a)}else{return d(b,c,e,Math.PI*2)||d(b,c,0,a)}}else{if(e<=a){return d(e,a,b,Math.PI*2)||d(e,a,0,c)}else{return true}}};function testLabelDims(c,b){var a={font:CP.FONT_SIZE+'px "Arial"',stroke:"none",fill:"white",opacity:0};var a=c.text(0,0,b).attr(a);return a.getBBox()}function ItemLabel(h,n,e,j,b,l,g,f){this.feature_id=h;this.label=l;this.color=g;this.est_width=f.width;this.est_height=f.height;this.label_dims=f;var m=[n[0]+f.x,n[1]+f.y];var k=[m[0],m[1]];var i=QaDV.sub(n,b);var c=null;if(i[0]<0&&i[1]<0){c=[k[0]+this.est_width,k[1]+this.est_height]}else{if(i[0]<0&&i[1]>0){c=[k[0]+this.est_width,k[1]]}else{if(i[0]>0&&i[1]<0){c=[k[0],k[1]+this.est_height]}else{c=[k[0],k[1]]}}}this.box_offset=QaDV.sub(m,c);this.location=QaDV.add(n,this.box_offset);this.anchor_location=j;this.restricted_location=e}ItemLabel.prototype.draw=function(a,l,g,d,k){if(!k){var k=1}var m={stroke:"black","stroke-width":1,fill:"none"};var h=[this.box_offset[0],this.box_offset[1]/k];var j=QaDV.sub(this.location,h);var m=a.path(m,"M "+(l*j[0]+g)+" "+(l*j[1]+d)+" L "+(l*this.anchor_location[0]+g)+" "+(l*this.anchor_location[1]+d));var f={font:l*CP.FONT_SIZE+'px "Arial"',stroke:"none",fill:this.color};var f=a.text(l*(this.location[0]+this.est_width/2)+g,l*(this.location[1]+this.est_height/2)+d,this.label).attr(f);var i={stroke:"white",fill:"yellow",opacity:0};var i=a.rect(l*this.x()+g,l*this.y()+d,l*this.width(),l*this.height()).attr(i);var e=this.feature_id;i.node.onclick=function(){CF.click(e)};f.node.onclick=function(){CF.click(e)}};ItemLabel.prototype.x=function(){return this.location[0]};ItemLabel.prototype.y=function(){return this.location[1]};ItemLabel.prototype.width=function(){return this.est_width};ItemLabel.prototype.height=function(){return this.est_height};ItemLabel.prototype.closest_corner=function(){return QaDV.sub(this.location,this.box_offset)};function generate_circle(Y,e,Z){var K=[CP.RADIUS,CP.RADIUS-CP.ARC_MARKER_THICKNESS,CP.RADIUS-2*CP.ARC_MARKER_THICKNESS,CP.RADIUS-3*CP.ARC_MARKER_THICKNESS,CP.RADIUS-4*CP.ARC_MARKER_THICKNESS];var J=CP.RADIUS-20;var F=[];var z=[];var m=[];var G=[];var a=[CP.CANVAS_WIDTH/2,CP.CANVAS_HEIGHT/2];$(Z).innerHTML="";var O=Raphael(Z,CP.CANVAS_WIDTH,CP.CANVAS_HEIGHT);for(var aa=0,g=e.length;aa<g;aa++){var I=e[aa];if(I.is_translation){continue}if(I.is_enzyme&&!DS.show_restrictions_in_graphics){continue}if(I.is_orf&&!DS.show_orfs_in_graphics){continue}if(!I.is_enzyme&&!e.is_orf&&!DS.show_features_in_graphics){continue}var N=CP.RADIUS;var h=CP.sequence_to_angle(I.sequence_start-1,Y);var o=CP.sequence_to_angle(I.sequence_end,Y);if(Math.abs(o-h)<CP.SHORT_FEATURE||I.is_enzyme){z.push(new ArcMarker(I.feature_id,QaDV.polar_to_euclidean((h+o)/2,N,a),a,N,CP.ARC_MARKER_THICKNESS,4,"navy"));var t=CP.mid_angle(h,o);var x=QaDV.polar_to_euclidean(t,N+CP.LABEL_DISTANCE,a);var d=QaDV.polar_to_euclidean(t,CP.RADIUS+CP.ARC_THICKNESS,a);var c=QaDV.polar_to_euclidean(t,N+CP.ARC_THICKNESS/2,a);var ac=I.name.truncate(20);var C=testLabelDims(O,ac);var y=I.is_enzyme?CP.ENZYME_LABEL_COLOR:CP.LABEL_COLOR;m.push(new ItemLabel(I.feature_id,x,d,c,a,ac,y,C))}else{G.push(I)}}for(var aa=0,g=G.length;aa<g;aa++){var I=G[aa];var h=CP.sequence_to_angle(I.sequence_start-1,Y);var o=CP.sequence_to_angle(I.sequence_end,Y);for(var W=0,A=K.length;W<A;W++){N=K[W];var E="#66cc99";var u=CP.ARC_THICKNESS;if(FEATURE_COLORS[I.feature_type]!=null){E=FEATURE_COLORS[I.feature_type]}if(I.is_orf==true){E="#999999";u=CP.ARC_THICKNESS/2}var B=new Arc(I.feature_id,N,h,o,I.complementary,a,u,E);var q=false;for(var U=0,X=F.length;U<X;U++){q=q||B.intersects(F[U])}if(q){continue}F.push(B);var t=CP.mid_angle(h,o);x=QaDV.polar_to_euclidean(t,CP.RADIUS+CP.LABEL_DISTANCE,a);c=QaDV.polar_to_euclidean(t,N+CP.ARC_THICKNESS/2,a);d=QaDV.polar_to_euclidean(t,CP.RADIUS+CP.ARC_THICKNESS,a);var ac=I.name.truncate(20);var C=testLabelDims(O,ac);if(I.is_orf!=true){m.push(new ItemLabel(I.feature_id,x,d,c,a,ac,CP.LABEL_COLOR,C))}break}}LO.organize_labels(m);var n=CP.CANVAS_WIDTH;var k=CP.CANVAS_HEIGHT;var R=0;var Q=0;for(var W=0,w=m.length;W<w;W++){var P=m[W];n=Math.min(P.x(),n);k=Math.min(P.y(),k);R=Math.max(P.x()+P.width(),R);Q=Math.max(P.y()+P.height(),Q)}var M=1;var T=0;var S=0;if(n<0||k<0||R>CP.CANVAS_WIDTH||Q>CP.CANVAS_HEIGHT){if(n<0){M=Math.min(M,(-CP.CANVAS_WIDTH/2)/(n-CP.CANVAS_WIDTH/2))}if(R>CP.CANVAS_WIDTH){M=Math.min(M,(CP.CANVAS_WIDTH/2)/(R-CP.CANVAS_WIDTH/2))}if(k<0){M=Math.min(M,(-CP.CANVAS_HEIGHT/2)/(k-CP.CANVAS_HEIGHT/2))}if(Q>CP.CANVAS_HEIGHT){M=Math.min(M,(CP.CANVAS_HEIGHT/2)/(Q-CP.CANVAS_HEIGHT/2))}T=(1-M)*CP.CANVAS_WIDTH/2;S=(1-M)*CP.CANVAS_HEIGHT/2}F.splice(0,0,new BackboneCircle(a,CP.RADIUS,4,CP.BACKBONE_FILL_COLOR,CP.BACKBONE_STROKE_COLOR));F=F.concat(z,m);for(var W=0,v=F.length;W<v;W++){F[W].draw(O,M,T,S)}var l={stroke:"#555555","stroke-width":2,fill:"none"};var L=[(CP.CANVAS_WIDTH/2),(CP.CANVAS_HEIGHT/2-J)];var V=[(CP.CANVAS_WIDTH/2),(CP.CANVAS_HEIGHT/2-J)];start_hand=O.path(l,"M "+(M*(CP.CANVAS_WIDTH/2)+T)+" "+(M*(CP.CANVAS_HEIGHT/2)+S)+" L "+(M*L[0]+T)+" "+(M*L[1]+S));end_hand=O.path(l,"M "+(M*(CP.CANVAS_WIDTH/2)+T)+" "+(M*(CP.CANVAS_HEIGHT/2)+S)+" L "+(M*L[0]+T)+" "+(M*L[1]+S));var p=0;var H=0;var ab=0;var D=0;var b={stroke:"#555555","stroke-width":10*M,"stroke-linecap":"round"};hand_arc=O.path(b).moveTo(M*L[0]+T,M*L[1]+S).arcTo(M*J,M*J,ab,D,M*V[0]+T,M*V[1]+S);return{start_hand:start_hand,end_hand:end_hand,hand_arc:hand_arc,sequence_length:Y,s:M,tx:T,ty:S,updateHand:function(i,j){var s=2*Math.PI*j/this.sequence_length-Math.PI/2;var r=Raphael.parsePathString(i.attr("path"));var f=[M*(CP.CANVAS_WIDTH/2+J*Math.cos(s))+T,M*(CP.CANVAS_HEIGHT/2+J*Math.sin(s))+S];r[1][1]=f[0];r[1][2]=f[1];i.attr({path:r.join(" ")});return f},updateBoth:function(s,ad){var f=null;var j=null;var i=0;var ae=1;var r=0;if(ad<s){r=(ad)+(this.sequence_length-s)+1;i=r>this.sequence_length/2?1:0}else{r=(ad-s+1);i=r>this.sequence_length/2?1:0}f=this.updateHand(this.start_hand,s);j=this.updateHand(this.end_hand,ad+1);if(r==this.sequence_length){var ai=0.001;f=this.updateHand(this.start_hand,s+ai*this.sequence_length)}var ag=2*Math.PI*s/this.sequence_length-Math.PI/2;var af=2*Math.PI*ad/this.sequence_length-Math.PI/2;var ah=Raphael.parsePathString(this.hand_arc.attr("path"));ah[0][1]=f[0];ah[0][2]=f[1];ah[1][4]=i;ah[1][5]=ae;ah[1][6]=j[0];ah[1][7]=j[1];this.hand_arc.attr({path:ah.join(" ")})},sequence_to_pos:function(i,f){var j=CP.sequence_to_angle(i,f);return[M*(CP.RADIUS*Math.cos(j)+CP.CANVAS_WIDTH/2)+T,M*(CP.RADIUS*Math.sin(j)+CP.CANVAS_HEIGHT/2)+S]},pos_to_sequence:function(f,r,i){f=(f-T)/M;r=(r-S)/M;var j=Math.atan2(r-(CP.CANVAS_HEIGHT/2),f-(CP.CANVAS_WIDTH/2))+Math.PI/2;if(j<0){j=j+Math.PI*2}return Math.round((i)*j/(2*Math.PI))}}};