Smits={};Smits.Common={nodeIdIncrement:0,activeNode:0,roundFloat:function(c,e){for(var k=0,s=1;k<e;){s*=10;k++}return Math.round(c*s)/s},apply:function(c,e){if(c&&typeof e=="object")for(var k in e)c[k]=e[k];return c},addEventHandler:function(c,e,k,s){try{c.addEventListener(e,function(u){return function(B){s.e=B;u(s)}}(k,s),false)}catch(p){}},isInteger:function(c){return!isNaN(parseInt(c))},isXMLSerializerAvailable:function(){return typeof XMLSerializer=="function"?true:false}};
Smits.PhyloCanvas=function(){var c,e,k,s;return function(p,u,B,f,x){this.getNewickObject=function(){};this.clear=function(){};this.scale=function(a){k.svg.scale(a)};this.getSvg=function(){return k};this.getPhylogram=function(){return c};this.getSvgSource=function(){return Raphael.svg&&Smits.Common.isXMLSerializerAvailable()?(new XMLSerializer).serializeToString(k.svg.canvas):false};if(typeof p==="object")if(p.xml){var b=p.fileSource?p.xml:XMLObjectifier.textToXML(p.xml);b=XMLObjectifier.xmlToJSON(b);
s=new Smits.PhyloCanvas.PhyloxmlParse(b)}else if(p.phyloxml){b=p.fileSource?p.phyloxml:XMLObjectifier.textToXML(p.phyloxml);b=XMLObjectifier.xmlToJSON(b);s=new Smits.PhyloCanvas.PhyloxmlParse(b)}else if(p.nexml){b=p.fileSource?p.nexml:XMLObjectifier.textToXML(p.nexml);b=XMLObjectifier.xmlToJSON(b);s=new Smits.PhyloCanvas.NexmlParse(b,p)}else if(p.json)s=new Smits.PhyloCanvas.PhyloxmlParse(p.json);else if(p.newick)s=new Smits.PhyloCanvas.NewickParse(p.newick);else if(p.nexmlJson){console.log("load nexmlJson");
s=new Smits.PhyloCanvas.NexmlJsonParse(p)}else alert("Please set the format of input data");else s=new Smits.PhyloCanvas.NewickParse(p);e=u;k=new Smits.PhyloCanvas.Render.SVG(e,B,f);c=x=="circular"?new Smits.PhyloCanvas.Render.CircularPhylogram(k,s):new Smits.PhyloCanvas.Render.Phylogram(k,s)}}();Smits.PhyloCanvas.prototype={};
Smits.PhyloCanvas.Node=function(){return function(c,e){this.id=Smits.Common.nodeIdIncrement+=1;this.newickLen=this.len=this.level=0;this.type=this.name="";this.chart={};this.img=[];c&&Smits.Common.apply(this,c);this.children=[];e&&e.children.push(this)}}();
Smits.PhyloCanvas.Node.prototype={getCountAllChildren:function(){var c=0;for(var e in this.children)if(Smits.Common.isInteger(e)){var k=this.children[e];if(k.children&&k.children.length>0)c+=k.getCountAllChildren();else c++}return c},getCountImmediateChildren:function(){var c=0;for(var e in this.children)c+=this.children[e].length;return c},getMidbranchPosition:function(){for(var c=[0,0],e=0;e<this.children.length;e++){var k=this.children[e];if(k.children&&k.children.length>0)if(e==0){c[0]=k.getMidbranchPosition();
c[1]+=k.getCountAllChildren()}else c[1]+=e==this.children.length-1?k.getMidbranchPosition():k.getCountAllChildren();else{if(e==0)c[0]=1;c[1]+=1}}return c[1]>=c[0]?(c[1]-c[0])/2+c[0]:c[0]}};
Smits.PhyloCanvas.NewickParse=function(){var c,e,k,s=0,p=0,u,B=function(h){for(var d=new Smits.PhyloCanvas.Node;e!==")"&&e!==",";)if(e===":"){a();d.len=Smits.Common.roundFloat(x(),4);if(d.len==0)d.len=1.0E-4}else if(e==="'"||e==='"'){d.type="label";d.name=b(e)}else{d.type="label";d.name=x()}d.level=h.level+1;return d},f=function(h){var d=new Smits.PhyloCanvas.Node;if(h)d.level=h.level+1;for(;e!==")";){a();e==="("?d.children.push(f(d)):d.children.push(B(d))}a();if(e!==":"&&e!==")"&&e!==","&&e!==";"){d.type=
"label";d.name=x()}if(e===":"){a();d.len=Smits.Common.roundFloat(x(),4);if(d.len==0)d.len=1.0E-4;d.type="stem"}return d},x=function(){for(var h="";e!==":"&&e!==")"&&e!==","&&e!==";";){h+=e;a()}return h},b=function(h){for(var d="";e!==h;){d+=e;a()}return d},a=function(){e=c.charAt(k);k+=1;return e},g=function(h){if(h.children&&h.children.length)for(var d=0;d<h.children.length;d++){var j=h.children[d];if(j.len===0)j.len=1;j.newickLen=Smits.Common.roundFloat(j.len+h.newickLen,4);if(j.level>s)s=j.level;
if(j.newickLen>p)p=j.newickLen;j.children.length>0&&g(j,h)}return h};return function(h){this.getRoot=function(){return u};this.getLevels=function(){return s};this.getNewickLen=function(){return p};this.getValidate=function(){};c=h;k=0;a();u=f();u=g(u)}}();Smits.PhyloCanvas.NewickParse.prototype={};
Smits.PhyloCanvas.PhyloxmlParse=function(){var c=0,e=0,k,s,p=function(f,x){var b=new Smits.PhyloCanvas.Node;if(x)b.level=x.level+1;if(f.clade&&f.clade.length)for(var a=0;a<f.clade.length;a++)b.children.push(p(f.clade[a],b));if(f.branch_length){if(typeof f.branch_length==="object")f.branch_length=f.branch_length[0].Text;b.len=Smits.Common.roundFloat(f.branch_length,4);if(b.len==0)b.len=1.0E-4}if(f.name){b.type="label";b.name=f.name[0].Text;if(f.name[0]&&f.name[0].style)b.style=f.name[0].style;if(f.name[0]&&
f.name[0].bgStyle)b.bgStyle=f.name[0].bgStyle}else if(f.confidence)b.name=f.confidence[0].Text;if(f.sequence&&f.sequence[0]&&f.sequence[0].name&&f.sequence[0].name[0]&&f.sequence[0].name[0].Text)b.sequenceName=f.sequence[0].name[0].Text;if(f.taxonomy&&f.taxonomy[0]){if(f.taxonomy[0].scientific_name&&f.taxonomy[0].scientific_name[0]&&f.taxonomy[0].scientific_name[0].Text)b.taxonomyScientificName=f.taxonomy[0].scientific_name[0].Text;if(f.taxonomy[0].common_name&&f.taxonomy[0].common_name[0]&&f.taxonomy[0].common_name[0].Text)b.taxonomyCommonName=
f.taxonomy[0].common_name[0].Text}if(f.sequence&&f.sequence[0]&&f.sequence[0].accession&&f.sequence[0].accession[0]&&f.sequence[0].accession[0].Text)b.sequenceAccession=f.sequence[0].accession[0].Text;if(f.point)b.LatLong=[f.point[0].lat[0].Text,f.point[0]["long"][0].Text];if(!b.name){if(b.sequenceName)b.name=b.sequenceName;else if(b.taxonomyScientificName)b.name=b.taxonomyScientificName;else if(b.taxonomyCommonName)b.name=b.taxonomyCommonName;else if(b.sequenceAccession)b.name=b.sequenceAccession;
if(b.name)b.type="label"}if(f.annotation){if(f.annotation[0]&&f.annotation[0].desc&&f.annotation[0].desc[0]&&f.annotation[0].desc[0].Text)b.description=f.annotation[0].desc[0].Text;if(f.annotation[0]&&f.annotation[0].uri&&f.annotation[0].uri[0]&&f.annotation[0].uri[0].Text)b.uri=f.annotation[0].uri[0].Text;if(f.annotation[0]&&f.annotation[0].img)for(a in f.annotation[0].img)if(Smits.Common.isInteger(a))b.img[a]=f.annotation[0].img[a].Text}if(f.chart)if(f.chart[0])for(a in f.chart[0])if(a!="Text"&&
a!="_children")b.chart[a]=f.chart[0][a][0].Text;if(b&&b.level>1)b.len||(s="Error. Please include Branch Lengths - we only draw rooted phylogenetic trees.");return b},u=function(f){if(f.children&&f.children.length)for(var x=0;x<f.children.length;x++){var b=f.children[x];b.newickLen=Math.round((b.len+f.newickLen)*1E4)/1E4;if(b.level>c)c=b.level;if(b.newickLen>e)e=b.newickLen;b.children.length>0&&u(b,f)}return f},B=function(f,x){for(var b in f)if(b!="_children"&&b!="Text")if(b=="rectangular"||b=="circular")B(f[b][0],
b);else{Smits.PhyloCanvas.Render.Parameters[b]||(Smits.PhyloCanvas.Render.Parameters[b]={});Smits.PhyloCanvas.Render.Parameters.set(b,f[b][0].Text,x)}};return function(f){this.getRoot=function(){return k};this.getLevels=function(){return c};this.getNewickLen=function(){return e};this.getValidate=function(){return s};if(f.phylogeny&&f.phylogeny[0]&&f.phylogeny[0].clade)k=p(f.phylogeny[0].clade[0]);if(f.phylogeny&&f.phylogeny[0]&&f.phylogeny[0].render&&f.phylogeny[0].render[0]){if((f=f.phylogeny[0].render[0])&&
f.styles){var x=f.styles[0];for(var b in x)if(b!="_children"&&b!="Text"){Smits.PhyloCanvas.Render.Style[b]||(Smits.PhyloCanvas.Render.Style[b]={});for(var a in x[b][0])if(a!="_attributes")Smits.PhyloCanvas.Render.Style[b][a.replace("_","-")]=x[b][0][a]}}f&&f.parameters&&B(f.parameters[0]);if(f&&f.charts){f=f.charts[0];for(b in f)if(b!="_children"&&b!="Text")for(a in f[b])if(f[b][a].type=="binary"){f[b][a].chart=b;Smits.PhyloCanvas.Render.Parameters.binaryCharts.push(f[b][a])}else if(f[b][a].type==
"bar"){f[b][a].chart=b;Smits.PhyloCanvas.Render.Parameters.barCharts.push(f[b][a])}}}k=u(k)}}();Smits.PhyloCanvas.PhyloxmlParse.prototype={};
Smits.PhyloCanvas.NexmlParse=function(){var c=0,e=0,k,s,p,u,B=function(b,a,g){var h=new Smits.PhyloCanvas.Node;if(g)h.level=g.level+1;for(g=0;g<p.length;g++)if(p[g].source==b.id)for(var d=0;d<u.length;d++)p[g].target==u[d].id&&h.children.push(B(u[d],p[g].length,h));if(a){h.len=Smits.Common.roundFloat(a,4);if(h.len==0)h.len=1.0E-4}if(b.label){h.type="label";h.name=b.label;if(b.style)h.style=b.style}if(h&&h.level>1)h.len||(s="Error. Please include Branch Lengths - we only draw rooted phylogenetic trees.");
return h},f=function(b){if(b.children&&b.children.length)for(var a=0;a<b.children.length;a++){var g=b.children[a];g.newickLen=Math.round((g.len+b.newickLen)*1E4)/1E4;if(g.level>c)c=g.level;if(g.newickLen>e)e=g.newickLen;g.children.length>0&&f(g,b)}return b},x=function(b,a){for(var g in b)if(g!="_children"&&g!="Text")if(g=="rectangular"||g=="circular")x(b[g][0],g);else{Smits.PhyloCanvas.Render.Parameters[g]||(Smits.PhyloCanvas.Render.Parameters[g]={});Smits.PhyloCanvas.Render.Parameters.set(g,b[g][0].Text,
a)}};return function(b,a){this.getRoot=function(){return k};this.getLevels=function(){return c};this.getNewickLen=function(){return e};this.getValidate=function(){return s};if(a.tree&&b.trees[0]&&b.trees[0].tree[a.tree-1]){p=b.trees[0].tree[a.tree-1].edge;u=b.trees[0].tree[a.tree-1].node}else{p=b.trees[0].tree[0].edge;u=b.trees[0].tree[0].node}for(i=0;i<u.length;i++)if(u[i].root&&u[i].root=="true")k=u[i];if(k){k=B(k);k=f(k)}else s="Error. Currently, only rooted NeXML trees are supported."}}();
Smits.PhyloCanvas.NexmlParse.prototype={};
Smits.PhyloCanvas.NexmlJsonParse=function(){var c=0,e=0,k,s,p=[],u=[],B=function(b,a,g){var h=new Smits.PhyloCanvas.Node;if(g)h.level=g.level+1;for(g=0;g<p.length;g++)if(p[g].source==b.id)for(var d=0;d<u.length;d++)p[g].target==u[d].id&&h.children.push(B(u[d],p[g].length,h));if(a){h.len=Smits.Common.roundFloat(a,4);if(h.len==0)h.len=1.0E-4}if(b.label){h.type="label";h.name=b.label;if(b.style)h.style=b.style;if(b.bgStyle)h.bgStyle=b.bgStyle}if(h&&h.level>1)h.len||(s="Error. Please include Branch Lengths - we only draw rooted phylogenetic trees.");
return h},f=function(b){if(b.children&&b.children.length)for(var a=0;a<b.children.length;a++){var g=b.children[a];g.newickLen=Math.round((g.len+b.newickLen)*1E4)/1E4;if(g.level>c)c=g.level;if(g.newickLen>e)e=g.newickLen;g.children.length>0&&f(g,b)}return b},x=function(b){for(var a in b)if(a!="_children"&&a!="Text"){console.log([a,b]);if(a=="rectangular"||a=="circular")x(b[a],a);else{Smits.PhyloCanvas.Render.Parameters[a]||(Smits.PhyloCanvas.Render.Parameters[a]={});console.log([a,b[a]])}}};return function(b){this.getRoot=
function(){return k};this.getLevels=function(){return c};this.getNewickLen=function(){return e};this.getValidate=function(){return s};var a=b.nexmlJson.nexml,g=a.render;if(g&&g.styles){var h=g.styles;for(var d in h)if(d!="_children"&&d!="Text"){Smits.PhyloCanvas.Render.Style[d]||(Smits.PhyloCanvas.Render.Style[d]={});for(var j in h[d]["@attributes"])if(j!="_attributes")Smits.PhyloCanvas.Render.Style[d][j.replace("_","-")]=h[d]["@attributes"][j]}}g&&g.parameters&&x(g.parameters);if(b.tree&&a.trees[0]&&
a.trees[0].tree[b.tree-1]){p=a.trees[0].tree[b.tree-1].edge;u=a.trees[0].tree[b.tree-1].node}else{for(d=0;d<a.trees.tree.edge.length;d++)p.push(a.trees.tree.edge[d]["@attributes"]);for(d=0;d<a.trees.tree.node.length;d++)u.push(a.trees.tree.node[d]["@attributes"])}for(d=0;d<u.length;d++)if(u[d].root&&u[d].root=="true")k=u[d];if(k){k=B(k);k=f(k)}else s="Error. Currently, only rooted NeXML trees are supported."}}();Smits.PhyloCanvas.NexmlParse.prototype={};Smits.PhyloCanvas.Render={};
Smits.PhyloCanvas.Render.Style={line:{stroke:"rgb(0,0,0)","stroke-width":1},text:{"font-family":"Verdana","font-size":12,"text-anchor":"start"},path:{stroke:"rgb(0,0,0)","stroke-width":1},connectedDash:{stroke:"rgb(200,200,200)","stroke-dasharray":". "},textSecantBg:{fill:"#EEE",stroke:"#DDD"},highlightedEdgeCircle:{fill:"red"},barChart:{fill:"#003300",stroke:"#DDD"},getStyle:function(c,e){return this[c]?this[c]:this[e]}};
Smits.PhyloCanvas.Render.Parameters={jsOverride:0,Rectangular:{bufferX:200,bufferY:40,bufferInnerLabels:10,bufferOuterLabels:5,minHeightBetweenLeaves:10,alignPadding:0,alignRight:false,showScaleBar:false},Circular:{bufferRadius:0.33,bufferAngle:20,initStartAngle:160,innerCircleRadius:0,minHeightBetweenLeaves:5,bufferInnerLabels:2,bufferOuterLabels:5},binaryCharts:[],barCharts:[],binaryChartBufferInner:5,binaryChartBufferSiblings:0.01,binaryChartThickness:15,binaryChartDisjointed:false,barChartBufferInner:3,
barChartHeight:50,barChartWidth:0.5,mouseRollOver:function(c){if(c.node.edgeCircleHighlight)c.node.edgeCircleHighlight.show();else{var e=c.svg.draw(new Smits.PhyloCanvas.Render.Circle(c.x,c.y,5,{attr:Smits.PhyloCanvas.Render.Style.highlightedEdgeCircle}));c.node.edgeCircleHighlight=e[0]}c.textEl.attr({fill:"red"})},mouseRollOut:function(c){c.node.edgeCircleHighlight.hide();c.textEl.attr({fill:"#000"})},set:function(c,e,k){if(!this.jsOverride)if(k)if(k=="circular")this.Circular[c]=parseFloat(e);else{if(k==
"rectangular")this.Rectangular[c]=parseFloat(e)}else this[c]=parseFloat(e)}};Smits.PhyloCanvas.Render.Line=function(){return function(c,e,k,s,p){this.type="line";this.attr=Smits.PhyloCanvas.Render.Style.line;this.x1=c;this.x2=e;this.y1=k;this.y2=s;if(p){Smits.Common.apply(this,p);if(p.attr)this.attr=p.attr}}}();
Smits.PhyloCanvas.Render.Text=function(){return function(c,e,k,s){this.type="text";this.attr=Smits.PhyloCanvas.Render.Style.text;this.x=c;this.y=e;this.text=k;if(s){Smits.Common.apply(this,s);if(s.attr)this.attr=s.attr}}}();Smits.PhyloCanvas.Render.Path=function(){return function(c,e){this.type="path";this.attr=Smits.PhyloCanvas.Render.Style.path;this.path=c;if(e){Smits.Common.apply(this,e);if(e.attr)this.attr=e.attr}}}();
Smits.PhyloCanvas.Render.Circle=function(){return function(c,e,k,s){this.type="circle";this.x=c;this.y=e;this.radius=k;if(s){Smits.Common.apply(this,s);if(s.attr)this.attr=s.attr}}}();Smits.PhyloCanvas.Render.SVG=function(){return function(c,e,k){this.canvasSize=[e,k];this.svg=Raphael(c,this.canvasSize[0],this.canvasSize[1])}}();
Smits.PhyloCanvas.Render.SVG.prototype={render:function(){for(var c=this.phylogramObject.getDrawInstructs(),e=0;e<c.length;e++)if(c[e].type=="line")this.svg.path(["M",c[e].x1,c[e].y1,"L",c[e].x2,c[e].y2]).attr(Smits.PhyloCanvas.Render.Style.line);else if(c[e].type=="path")this.svg.path(c[e].path).attr(c[e].attr);else if(c[e].type=="circle")this.svg.circle(c[e].x,c[e].y,c[e].radius).attr({stroke:"red"});else{var k=this.svg.text(c[e].x,c[e].y,c[e].text).attr(Smits.PhyloCanvas.Render.Style.text);c[e].attr&&
k.attr(c[e].attr);c[e].rotate&&k.rotate(c[e].rotate);k=k.getBBox();Math.sqrt(k.height*k.height+k.width*k.width)}},draw:function(c){var e,k;if(c.type=="line")e=this.svg.path(["M",c.x1,c.y1,"L",c.x2,c.y2]).attr(Smits.PhyloCanvas.Render.Style.line);else if(c.type=="path")e=this.svg.path(c.path).attr(c.attr);else if(c.type=="circle")e=this.svg.circle(c.x,c.y,c.radius).attr({stroke:"red"});else if(c.type=="text"){e=this.svg.text(c.x,c.y,c.text).attr(Smits.PhyloCanvas.Render.Style.text);c.attr&&e.attr(c.attr);
c.rotate&&e.rotate(c.rotate);c=e.getBBox();k=Math.sqrt(c.height*c.height+c.width*c.width)}return[e,k]}};
Smits.PhyloCanvas.Render.Phylogram=function(){var c,e=Smits.PhyloCanvas.Render.Parameters.Rectangular,k,s,p,u,B,f,x=true,b=0,a=0,g,h,d,j,o=[],z=function(m,w,t,r){return["M",m,w,"L",t,w,"L",t,r,"L",m,r,"Z"]},J=function(m,w){if(m.len)if(x)x=false;else if(m.children.length==0)b=Smits.Common.roundFloat(b+u,4);if(m.children.length>0){var t=[],r,C,E,D;if(m.len){r=w;C=w=Smits.Common.roundFloat(w+p*m.len,4);D=E=b+m.getMidbranchPosition()*u;c.draw(new Smits.PhyloCanvas.Render.Line(r,C,E,D))}if(m.name){r={};
r=Smits.PhyloCanvas.Render.Style.getStyle("bootstrap","text");if(m.uri)r.href=m.uri;if(m.description)r.title=m.description;if(m.level==0){C=2;var I=b+m.getMidbranchPosition()*u}else{C=C;I=D}c.draw(new Smits.PhyloCanvas.Render.Text(C+5,I,m.name,{attr:r}))}if(m.children&&m.children.length)for(r=0;r<m.children.length;r++)t.push(J(m.children[r],w));m=[];for(r=0;r<t.length;r++){t[r][0]&&m.push(t[r][0]);t[r][1]&&m.push(t[r][1])}t=Math.min.apply(null,m);m=Math.max.apply(null,m);c.draw(new Smits.PhyloCanvas.Render.Path(["M",
w+1.0E-4,t,"L",w,t,"L",w,m,"L",w+1.0E-4,m],{attr:Smits.PhyloCanvas.Render.Style.line}))}else{r=w;C=Smits.Common.roundFloat(w+p*m.len,2);D=E=b;m.y=b;o.push(m);c.draw(new Smits.PhyloCanvas.Render.Line(r,C,E,D));e.alignRight&&c.draw(new Smits.PhyloCanvas.Render.Path(["M",C,E,"L",e.alignPadding+B,D],{attr:Smits.PhyloCanvas.Render.Style.connectedDash}));if(m.name){r={};if(m.style)r=Smits.PhyloCanvas.Render.Style.getStyle(m.style,"text");r["text-anchor"]="start";if(m.uri)r.href=m.uri;if(m.description)r.title=
m.description;w=c.draw(new Smits.PhyloCanvas.Render.Text(e.alignRight?B+e.bufferInnerLabels+e.alignPadding:C+e.bufferInnerLabels,D,m.name,{attr:r}));m.style&&console.log([m,r]);a=Math.max(w[1],a);Smits.PhyloCanvas.Render.Parameters.mouseRollOver&&Smits.Common.addEventHandler(w[0].node,"mouseover",Smits.PhyloCanvas.Render.Parameters.mouseRollOver,{svg:c,node:m,x:C,y:D,textEl:w[0]});Smits.PhyloCanvas.Render.Parameters.mouseRollOut&&Smits.Common.addEventHandler(w[0].node,"mouseout",Smits.PhyloCanvas.Render.Parameters.mouseRollOut,
{svg:c,node:m,x:C,y:D,textEl:w[0]});Smits.PhyloCanvas.Render.Parameters.onClickAction&&Smits.Common.addEventHandler(w[0].node,"click",Smits.PhyloCanvas.Render.Parameters.onClickAction,{svg:c,node:m,x:C,y:D,textEl:w[0]})}}return[E,D]},N=function(){y=b+u;h=e.showScaleBar*p;c.draw(new Smits.PhyloCanvas.Render.Line(0,h,y,y));c.draw(new Smits.PhyloCanvas.Render.Text((0+h)/2,y-8,e.showScaleBar))},K=function(m,w,t){var r=(t&&t.bufferInner?t.bufferInner:0)|Smits.PhyloCanvas.Render.Parameters.binaryChartBufferInner,
C=(t&&t.bufferSiblings?t.bufferSiblings*u:0)|(Smits.PhyloCanvas.Render.Parameters.binaryChartBufferSiblings<1?u*Smits.PhyloCanvas.Render.Parameters.binaryChartBufferSiblings:Smits.PhyloCanvas.Render.Parameters.binaryChartBufferSiblings);t=(t&&t.thickness?t.thickness:0)|Smits.PhyloCanvas.Render.Parameters.binaryChartThickness;for(var E=0;E<o.length;E++){var D=o[E];c.draw(new Smits.PhyloCanvas.Render.Path(z(m+r,D.y-u/2+C/2,m+r+t,D.y+u/2-C/2),{attr:Smits.PhyloCanvas.Render.Style.getStyle(D.chart[w],
"textSecantBg")}))}return m+r+t},O=function(m,w,t){var r=[],C=t&&t.bufferInner?t.bufferInner:0|Smits.PhyloCanvas.Render.Parameters.barChartBufferInner,E=t&&t.height?t.height:0|Smits.PhyloCanvas.Render.Parameters.barChartHeight;t=t&&t.width?t.width<1?u*t.width:t.width:0|(Smits.PhyloCanvas.Render.Parameters.barChartWidth<1?u*Smits.PhyloCanvas.Render.Parameters.barChartWidth:Smits.PhyloCanvas.Render.Parameters.barChartWidth);for(var D=0,I=0;I<o.length;I++)r.push(o[I].chart[w]);r=Math.max.apply(null,
r);D=Smits.Common.roundFloat(E/r,4);for(I=0;I<o.length;I++){r=o[I];c.draw(new Smits.PhyloCanvas.Render.Path(z(m+C,r.y-t/2,m+C+D*r.chart[w],r.y+t/2),{attr:Smits.PhyloCanvas.Render.Style.getStyle(r.chart[w],"barChart")}))}return m+C+E};return function(m,w){b=0;this.getCanvasSize=function(){return[k,s]};this.getRoot=function(){return w.getRoot()};w.getValidate()&&c.draw(0,0,w.getValidate());c=m;m=w.getRoot();var t=w.getNewickLen();k=c.canvasSize[0];s=c.canvasSize[1];d=e.bufferX;j=e.bufferY;f=e.minHeightBetweenLeaves;
p=Math.round((k-d)/t);u=Math.round((s-j)/(e.showScaleBar?m.getCountAllChildren()+1:m.getCountAllChildren()));if(u<f)u=f;B=Math.round(k-d);if(Smits.PhyloCanvas.Render.Parameters.binaryCharts.length||Smits.PhyloCanvas.Render.Parameters.barCharts.length)e.alignRight=true;J(m,0);e.showScaleBar&&N();g=B+a+e.bufferInnerLabels;if(Smits.PhyloCanvas.Render.Parameters.binaryCharts.length){m=Smits.PhyloCanvas.Render.Parameters.binaryCharts;for(var r in m)g=K(g,m[r].chart,m[r])}if(Smits.PhyloCanvas.Render.Parameters.barCharts.length){m=
Smits.PhyloCanvas.Render.Parameters.barCharts;for(r in m)O(g,m[r].chart,m[r])}}}();Smits.PhyloCanvas.Render.Phylogram.prototype={};
Smits.PhyloCanvas.Render.CircularPhylogram=function(){function c(l,q){q+=I;return[Smits.Common.roundFloat(O+l*Math.sin(q*P),4),Smits.Common.roundFloat(m+l*Math.cos(q*P),4)]}function e(l,q,n,v){var A=c(l,q),F=c(l,n),H=[],G=0;q=Math.abs(s(n-q))>180?1:-1;if(v&&v.invertSecant){q*=-1;G=1}v&&v.noMove||H.push("M");H.push(A[0],A[1],"A",l,l,0,q<1?0:1,G,F[0],F[1]);return H}function k(l,q,n,v){var A=[];q=c(q,l);l=c(n,l);v&&v.noMove||A.push("M");A.push(q[0],q[1],"L",l[0],l[1]);return A}function s(l){for(;l>360||
l<0;)if(l>360)l-=360;else if(l<0)l+=360;return l}function p(l,q,n,v){return B("M",e(l,n,v,{noMove:1,invertSecant:0}),"L",e(q,v,n,{noMove:1,invertSecant:1}),"Z")}function u(l,q){q=q;if(l.len)if(N){K=C|1;N=false}else if(l.children.length==0)K=Smits.Common.roundFloat(K+z,4);if(l.children.length>0){var n=[],v,A,F;v=q;A=q+=Smits.Common.roundFloat(o*l.len,4);if(l.children&&l.children.length)for(var H=0;H<l.children.length;H++){var G=u(l.children[H],q);G>0&&n.push(G)}H=Smits.Common.roundFloat(Math.min.apply(null,
n),4);n=Smits.Common.roundFloat(Math.max.apply(null,n),4);a.draw(new Smits.PhyloCanvas.Render.Path(B("M",c(q+0.01,H),"L",e(q,H,n,{noMove:true}),"L",c(q+0.01,n))));if(l.len){F=Smits.Common.roundFloat(H+(n-H)/2,4);a.draw(new Smits.PhyloCanvas.Render.Path(k(F,v,A)))}}else{l.y=K;t.push(l);v=q;A=Smits.Common.roundFloat(q+o*l.len);F=K;a.draw(new Smits.PhyloCanvas.Render.Path(k(F,v,A)));a.draw(new Smits.PhyloCanvas.Render.Path(k(F,A,w),{attr:Smits.PhyloCanvas.Render.Style.connectedDash}));if(l.name){q=c(w+
g.bufferInnerLabels,F);v=s(91-F-I);if(v>90&&v<270){v+=180;alignment="end"}else alignment="start";n={};l.style&&Smits.Common.apply(n,Smits.PhyloCanvas.Render.Style.getStyle(l.style,"text"));n["text-anchor"]=alignment;if(l.uri)n.href=l.uri;if(l.description)n.title=l.description;v=a.draw(new Smits.PhyloCanvas.Render.Text(q[0],q[1],l.name,{attr:n,rotate:[v,q[0],q[1]]}));l.bgStyle&&r.push([l.bgStyle,F]);q=c(A,F);Smits.PhyloCanvas.Render.Parameters.mouseRollOver&&Smits.Common.addEventHandler(v[0].node,
"mouseover",Smits.PhyloCanvas.Render.Parameters.mouseRollOver,{svg:a,node:l,x:q[0],y:q[1],textEl:v[0]});Smits.PhyloCanvas.Render.Parameters.mouseRollOut&&Smits.Common.addEventHandler(v[0].node,"mouseout",Smits.PhyloCanvas.Render.Parameters.mouseRollOut,{svg:a,node:l,x:q[0],y:q[1],textEl:v[0]});Smits.PhyloCanvas.Render.Parameters.onClickAction&&Smits.Common.addEventHandler(v[0].node,"click",Smits.PhyloCanvas.Render.Parameters.onClickAction,{svg:a,node:l,x:q[0],y:q[1],textEl:v[0]});D=Math.max(v[1],
D)}}return F}function B(l){for(var q=l,n=1;n<arguments.length;n++)q=q.concat(arguments[n]);return q}function f(){var l=[];if(r.length>0)for(var q=0;q<r.length;q++){l=p(w,w+D+g.bufferOuterLabels,r[q][1]-z/2,r[q][1]+z/2);l=a.draw(new Smits.PhyloCanvas.Render.Path(l,{attr:Smits.PhyloCanvas.Render.Style.getStyle(r[q][0],"textSecantBg")}));l[0].toBack()}l=p(w,w+D+g.bufferOuterLabels,(C|1)+z/2,360+z/2+0.999);l=a.draw(new Smits.PhyloCanvas.Render.Path(l,{attr:Smits.PhyloCanvas.Render.Style.textSecantBg}));
l[0].toBack();return w+D+g.bufferOuterLabels}function x(l,q,n){var v=(n&&n.bufferInner?n.bufferInner:0)|Smits.PhyloCanvas.Render.Parameters.binaryChartBufferInner,A=(n&&n.bufferSiblings?n.bufferSiblings*z:0)|(Smits.PhyloCanvas.Render.Parameters.binaryChartBufferSiblings<1?z*Smits.PhyloCanvas.Render.Parameters.binaryChartBufferSiblings:Smits.PhyloCanvas.Render.Parameters.binaryChartBufferSiblings),F=(n&&n.thickness?n.thickness:0)|Smits.PhyloCanvas.Render.Parameters.binaryChartThickness;n=(n&&n.disjointed?
n.disjointed:false)|Smits.PhyloCanvas.Render.Parameters.binaryChartDisjointed;for(var H=true,G,L=0;L<t.length;L++){var M=t[L];if(!t[L+1]||M.chart[q]!==t[L+1].chart[q]||n){a.draw(new Smits.PhyloCanvas.Render.Path(p(l+v,l+v+F,(G?G:M.y)-z/2+(H&&!n?0:A/2),M.y+z/2-(L==t.length-1&&!n?0:A/2)),{attr:Smits.PhyloCanvas.Render.Style.getStyle(M.chart[q],"textSecantBg")}));G=0}else if(!G)G=M.y;H=false}return l+v+F}function b(l,q,n){var v=[],A=n&&n.bufferInner?n.bufferInner:0|Smits.PhyloCanvas.Render.Parameters.barChartBufferInner,
F=n&&n.height?n.height:0|Smits.PhyloCanvas.Render.Parameters.barChartHeight;n=n&&n.width?n.width<1?z*n.width:n.width:0|(Smits.PhyloCanvas.Render.Parameters.barChartWidth<1?z*Smits.PhyloCanvas.Render.Parameters.barChartWidth:Smits.PhyloCanvas.Render.Parameters.barChartWidth);for(var H=0,G=0;G<t.length;G++)v.push(t[G].chart[q]);v=Math.max.apply(null,v);H=Smits.Common.roundFloat(F/v,4);for(G=0;G<t.length;G++){v=t[G];a.draw(new Smits.PhyloCanvas.Render.Path(p(l+A,l+A+H*v.chart[q],v.y-n/2,v.y+n/2),{attr:Smits.PhyloCanvas.Render.Style.getStyle(v.chart[q],
"barChart")}))}return l+A+F}var a,g=Smits.PhyloCanvas.Render.Parameters.Circular,h,d,j,o,z,J,N=true,K=0,O,m,w,t=[],r=[],C,E,D=0,I,P=Math.PI/180;return function(l,q,n){this.getCanvasSize=function(){return[h,d]};this.getRoot=function(){return q.getRoot()};if(q.getValidate())l.draw({type:"text",x:0,y:l.canvasSize[1]/3,text:q.getValidate()});else{a=l;l=q.getRoot();var v=q.getNewickLen();h=a.canvasSize[0];d=a.canvasSize[1];O=h/2;m=d/2;j=Math.min.apply(null,[h,d]);n=g.bufferRadius>1?g.bufferRadius:Smits.Common.roundFloat(j*
g.bufferRadius,4);C=g.bufferAngle;J=g.innerCircleRadius;I=g.initStartAngle;w=Math.round((j-n-J)/2);o=(w-J)/v;z=Smits.Common.roundFloat((360-C)/l.getCountAllChildren(),4);u(l,J);E=f();if(Smits.PhyloCanvas.Render.Parameters.binaryCharts.length){n=Smits.PhyloCanvas.Render.Parameters.binaryCharts;for(var A in n)E=x(E,n[A].chart,n[A])}if(Smits.PhyloCanvas.Render.Parameters.barCharts.length){n=Smits.PhyloCanvas.Render.Parameters.barCharts;for(A in n)E=b(E,n[A].chart,n[A])}}}}();
Smits.PhyloCanvas.Render.CircularPhylogram.prototype={};
var XMLObjectifier=function(){var c=function(e){var k="";if(e&&typeof e==="string")k=e;return/^((-)?([0-9]*)((\.{0,1})([0-9]+))?$)/.test(k)};return{xmlToJSON:function(e){try{if(!e)return null;var k={};k.typeOf="JSXBObject";var s=e.nodeType==9?e.documentElement:e;k.RootName=s.nodeName||"";if(e.nodeType==3||e.nodeType==4)return e.nodeValue;var p=function(a){return a.replace(/^\s+|\s+$/gm,"")},u=function(a){return String(a).replace(/-/g,"_")},B=function(a,g){if(g.attributes.length>0){var h=g.attributes.length-
1,d;a._attributes=[];do{d=String(u(g.attributes[h].name));a._attributes.push(d);a[d]=p(g.attributes[h].value)}while(h--)}};(function(){return{activate:function(){var a=[];if(a){a.getNodesByAttribute=function(g,h){if(a&&a.length>0){var d=[],j,o=a.length-1;try{do{j=a[o];j[g]===h&&d.push(j)}while(o--);d.reverse();return d}catch(z){return null}}};a.getNodeByAttribute=function(g,h){if(a&&a.length>0){var d,j=a.length-1;try{do{d=a[j];if(d[g]===h)return d}while(j--)}catch(o){return null}return null}};a.getNodesByValue=
function(g){if(a&&a.length>0){var h=[],d,j=a.length-1;try{do{d=a[j];d.Text&&d.Text===g&&h.push(d)}while(j--);return h}catch(o){return null}}};a.contains=function(g,h){if(a&&a.length>0){var d=a.length-1;try{do if(a[d][g]===h)return true;while(d--)}catch(j){return false}return false}};a.indexOf=function(g,h){var d=-1;if(a&&a.length>0){var j=a.length-1;try{do if(a[j][g]===h)d=j;while(j--)}catch(o){return-1}return d}};a.SortByAttribute=function(g,h){if(a&&a.length>0){var d=function(j,o){j=j[o];return j=
bam.validation.isNumeric(j)?parseFloat(j):j};a.sort(function(j,o){j=d(j,g);o=d(o,g);o=j<o?-1:o<j?1:0;if(h)o=h.toUpperCase()==="DESC"?0-o:o;return o})}};a.SortByValue=function(g){if(a&&a.length>0){var h=function(d){d=d.Text;return d=bam.validation.isNumeric(d)?parseFloat(d):d};a.sort(function(d,j){d=h(d);j=h(j);j=d<j?-1:j<d?1:0;if(g)j=g.toUpperCase()==="DESC"?0-j:j;return j})}};a.SortByNode=function(g,h){if(a&&a.length>0){var d=function(j,o){j=j[o][0].Text;return j=bam.validation.isNumeric(j)?parseFloat(j):
j};a.sort(function(j,o){j=d(j,g);o=d(o,g);o=j<o?-1:o<j?1:0;if(h)o=h.toUpperCase()==="DESC"?0-o:o;return o})}}}return a}}})();var f=function(a){a.getNodeByAttribute=function(g,h){if(this.length>0){var d,j=this.length-1;try{do{d=this[j];if(d[g]==h)return d}while(j--)}catch(o){return false}return false}};a.contains=function(g,h){if(this.length>0){var d=this.length-1;try{do if(this[d][g]==h)return true;while(d--)}catch(j){return false}return false}};a.indexOf=function(g,h){var d=-1;if(this.length>0){var j=
this.length-1;try{do if(this[j][g]==h)d=j;while(j--)}catch(o){return-1}return d}};a.SortByAttribute=function(g,h){if(this.length){var d=function(j,o){j=j[o];return j=c(j)?parseFloat(j):j};this.sort(function(j,o){var z=0;j=d(j,g);o=d(o,g);if(j<o)z=-1;else if(o<j)z=1;if(h)z=h.toUpperCase()=="DESC"?0-z:z;return z})}};a.SortByValue=function(g){if(this.length){var h=function(d){d=d.Text;return d=c(d)?parseFloat(d):d};this.sort(function(d,j){var o=0;d=h(d);j=h(j);if(d<j)o=-1;else if(j<d)o=1;if(g)o=g.toUpperCase()==
"DESC"?0-o:o;return o})}};a.SortByNode=function(g,h){if(this.length){var d=function(j,o){j=j[o][0].Text;return j=c(j)?parseFloat(j):j};this.sort(function(j,o){var z=0;j=d(j,g);o=d(o,g);if(j<o)z=-1;else if(o<j)z=1;if(h)z=h.toUpperCase()=="DESC"?0-z:z;return z})}}},x=function(a,g){var h,d,j,o="";if(!g)return null;g.attributes.length>0&&B(a,g);a.Text="";if(g.hasChildNodes()){var z=g.childNodes.length-1,J=0;do{d=g.childNodes[J];switch(d.nodeType){case 1:a._children=[];h=d.localName?d.localName:d.baseName;
h=u(h);o!=h&&a._children.push(h);a[h]||(a[h]=[]);j={};a[h].push(j);d.attributes.length>0&&B(j,d);a[h].contains||f(a[h]);o=h;d.hasChildNodes()&&x(j,d);break;case 3:a.Text+=p(d.nodeValue);break;case 4:a.Text+=d.text?p(d.text):p(d.nodeValue);break}}while(J++<z)}};x(k,s);s=e=null;return k}catch(b){return null}},textToXML:function(e){var k=null;try{k=document.all?new ActiveXObject("Microsoft.XMLDOM"):new DOMParser;k.async=false}catch(s){throw new Error("XML Parser could not be instantiated");}var p;try{p=
document.all?k.loadXML(e)?k:false:k.parseFromString(e,"text/xml")}catch(u){throw new Error("Error parsing XML string");}return p}}}();

