A;A++)for(var C,D=this.chart.lines[A],E=D.attr("path"),F=f.attr("path"),G=0,H=E.length-1;H>G;G++){var I=[];I.push(["M",E[G][1],E[G][2]]),I.push(["L",E[G+1][1],E[G+1][2]]);for(var J=I[0][1],K=I[0][2],L=I[1][1],M=I[1][2],N=0,O=F.length-1;O>N;N++){var P=[];P.push(["M",F[N][1],F[N][2]]),P.push(["L",F[N+1][1],F[N+1][2]]);var Q=P[0][1],R=P[0][2],S=P[1][1],T=P[1][2],U=e(J,K,L,M,Q,R,S,T);if(U.onLine1&&U.onLine2){var V;R===T?Q>S?(V=["L",U.x+2*y,R],F.splice(N+1,0,V),V=["C",U.x+2*y,R,U.x,R-4*y,U.x-2*y,R],F.splice(N+2,0,V),f.attr("path",F)):(V=["L",U.x-2*y,R],F.splice(N+1,0,V),V=["C",U.x-2*y,R,U.x,R-4*y,U.x+2*y,R],F.splice(N+2,0,V),f.attr("path",F)):R>T?(V=["L",Q,U.y+2*y],F.splice(N+1,0,V),V=["C",Q,U.y+2*y,Q+4*y,U.y,Q,U.y-2*y],F.splice(N+2,0,V),f.attr("path",F)):(V=["L",Q,U.y-2*y],F.splice(N+1,0,V),V=["C",Q,U.y-2*y,Q+4*y,U.y,Q,U.y+2*y],F.splice(N+2,0,V),f.attr("path",F)),N+=2,C+=2}}}this.chart.lines.push(f)}(!this.chart.maxXFromLine||this.chart.maxXFromLine&&w>this.chart.maxXFromLine)&&(this.chart.maxXFromLine=w)},r.inherits(h,g),r.inherits(i,g),r.inherits(j,g),r.inherits(k,g),r.inherits(l,g),l.prototype.getLeft=function(){var a=this.getY()+this.group.getBBox().height/2,b=this.getX()+this.textMargin;return{x:b,y:a}},l.prototype.getRight=function(){var a=this.getY()+this.group.getBBox().height/2,b=this.getX()+this.group.getBBox().width-this.textMargin;return{x:b,y:a}},r.inherits(m,g),m.prototype.render=function(){this.yes_direction&&(this[this.yes_direction+"_symbol"]=this.yes_symbol),this.no_direction&&(this[this.no_direction+"_symbol"]=this.no_symbol);var a=this.getAttr("line-length");if(this.bottom_symbol){var b=this.getBottom();this.bottom_symbol.getTop();this.bottom_symbol.isPositioned||(this.bottom_symbol.shiftY(this.getY()+this.height+a),this.bottom_symbol.setX(b.x-this.bottom_symbol.width/2),this.bottom_symbol.isPositioned=!0,this.bottom_symbol.render())}if(this.right_symbol){var c=this.getRight();this.right_symbol.getLeft();if(!this.right_symbol.isPositioned){this.right_symbol.setY(c.y-this.right_symbol.height/2),this.right_symbol.shiftX(this.group.getBBox().x+this.width+a);var d=this;!function e(){for(var b,c=!1,f=0,g=d.chart.symbols.length;g>f;f++){b=d.chart.symbols[f];var h=Math.abs(b.getCenter().x-d.right_symbol.getCenter().x);if(b.getCenter().y>d.right_symbol.getCenter().y&&h<=d.right_symbol.width/2){c=!0;break}}c&&(d.right_symbol.setX(b.getX()+b.width+a),e())}(),this.right_symbol.isPositioned=!0,this.right_symbol.render()}}},m.prototype.renderLines=function(){this.yes_symbol&&this.drawLineTo(this.yes_symbol,this.getAttr("yes-text"),this.yes_direction),this.no_symbol&&this.drawLineTo(this.no_symbol,this.getAttr("no-text"),this.no_direction)},p.parse=n}();
-//# sourceMappingURL=flowchart.min.map
\ No newline at end of file
+!function(t,i){if("object"==typeof exports&&"object"==typeof module)module.exports=i(require("Raphael"));else if("function"==typeof define&&define.amd)define(["Raphael"],i);else{var e=i("object"==typeof exports?require("Raphael"):t.Raphael);for(var s in e)("object"==typeof exports?exports:t)[s]=e[s]}}(this,function(t){return function(t){function i(s){if(e[s])return e[s].exports;var n=e[s]={exports:{},id:s,loaded:!1};return t[s].call(n.exports,n,n.exports,i),n.loaded=!0,n.exports}var e={};return i.m=t,i.c=e,i.p="",i(0)}([function(t,i,e){e(9);var s=e(4);e(17);var n={parse:s};"undefined"!=typeof window&&(window.flowchart=n),t.exports=n},function(t,i){function e(t,i){if(!t||"function"==typeof t)return i;var s={};for(var n in i)s[n]=i[n];for(n in t)t[n]&&("object"==typeof s[n]?s[n]=e(s[n],t[n]):s[n]=t[n]);return s}function s(t,i){if("function"==typeof Object.create)t.super_=i,t.prototype=Object.create(i.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}});else{t.super_=i;var e=function(){};e.prototype=i.prototype,t.prototype=new e,t.prototype.constructor=t}}t.exports={defaults:e,inherits:s}},function(t,i,e){function s(t,i,e){this.chart=t,this.group=this.chart.paper.set(),this.symbol=e,this.connectedTo=[],this.symbolType=i.symbolType,this.flowstate=i.flowstate||"future",this.lineStyle=i.lineStyle||{},this.key=i.key||"",this.leftLines=[],this.rightLines=[],this.topLines=[],this.bottomLines=[],this.params=i.params,this.next_direction=i.next&&i.direction_next?i.direction_next:void 0,this.text=this.chart.paper.text(0,0,i.text),i.key&&(this.text.node.id=i.key+"t"),this.text.node.setAttribute("class",this.getAttr("class")+"t"),this.text.attr({"text-anchor":"start",x:this.getAttr("text-margin"),fill:this.getAttr("font-color"),"font-size":this.getAttr("font-size")});var s=this.getAttr("font"),n=this.getAttr("font-family"),h=this.getAttr("font-weight");s&&this.text.attr({font:s}),n&&this.text.attr({"font-family":n}),h&&this.text.attr({"font-weight":h}),i.link&&this.text.attr("href",i.link),i.function&&(this.text.attr({cursor:"pointer"}),this.text.node.addEventListener("click",function(t){window[i.function](t,i)},!1)),i.target&&this.text.attr("target",i.target);var r=this.getAttr("maxWidth");if(r){for(var o=i.text.split(" "),a="",l=0,p=o.length;lr?"\n"+x:" "+x}this.text.attr("text",a.substring(1))}if(this.group.push(this.text),e){var y=this.getAttr("text-margin");e.attr({fill:this.getAttr("fill"),stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),width:this.text.getBBox().width+2*y,height:this.text.getBBox().height+2*y}),e.node.setAttribute("class",this.getAttr("class"));var g=this.getAttr("roundness");isNaN(g)||(e.node.setAttribute("ry",g),e.node.setAttribute("rx",g)),i.link&&e.attr("href",i.link),i.target&&e.attr("target",i.target),i.function&&(e.node.addEventListener("click",function(t){window[i.function](t,i)},!1),e.attr({cursor:"pointer"})),i.key&&(e.node.id=i.key),this.group.push(e),e.insertBefore(this.text),this.text.attr({y:e.getBBox().height/2}),this.initialize()}}var n=e(3),h=n.drawLine,r=n.checkLineIntersection;s.prototype.getAttr=function(t){if(this.chart){var i,e=this.chart.options?this.chart.options[t]:void 0,s=this.chart.options.symbols?this.chart.options.symbols[this.symbolType][t]:void 0;return this.chart.options.flowstate&&this.chart.options.flowstate[this.flowstate]&&(i=this.chart.options.flowstate[this.flowstate][t]),i||s||e}},s.prototype.initialize=function(){this.group.transform("t"+this.getAttr("line-width")+","+this.getAttr("line-width")),this.width=this.group.getBBox().width,this.height=this.group.getBBox().height},s.prototype.getCenter=function(){return{x:this.getX()+this.width/2,y:this.getY()+this.height/2}},s.prototype.getX=function(){return this.group.getBBox().x},s.prototype.getY=function(){return this.group.getBBox().y},s.prototype.shiftX=function(t){this.group.transform("t"+(this.getX()+t)+","+this.getY())},s.prototype.setX=function(t){this.group.transform("t"+t+","+this.getY())},s.prototype.shiftY=function(t){this.group.transform("t"+this.getX()+","+(this.getY()+t))},s.prototype.setY=function(t){this.group.transform("t"+this.getX()+","+t)},s.prototype.getTop=function(){var t=this.getY(),i=this.getX()+this.width/2;return{x:i,y:t}},s.prototype.getBottom=function(){var t=this.getY()+this.height,i=this.getX()+this.width/2;return{x:i,y:t}},s.prototype.getLeft=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX();return{x:i,y:t}},s.prototype.getRight=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX()+this.group.getBBox().width;return{x:i,y:t}},s.prototype.render=function(){if(this.next){var t=this,i=this.getAttr("line-length");if("right"===this.next_direction){var e=this.getRight();this.next.isPositioned||(this.next.setY(e.y-this.next.height/2),this.next.shiftX(this.group.getBBox().x+this.width+i),function e(){for(var s,n=!1,h=0,r=t.chart.symbols.length;ht.next.getCenter().y&&o<=t.next.width/2){n=!0;break}}if(n){if("end"===t.next.symbolType)return;t.next.setX(s.getX()+s.width+i),e()}}(),this.next.isPositioned=!0,this.next.render())}else if("left"===this.next_direction){var s=this.getLeft();this.next.isPositioned||(this.next.setY(s.y-this.next.height/2),this.next.shiftX(-(this.group.getBBox().x+this.width+i)),function e(){for(var s,n=!1,h=0,r=t.chart.symbols.length;ht.next.getCenter().y&&o<=t.next.width/2){n=!0;break}}if(n){if("end"===t.next.symbolType)return;t.next.setX(s.getX()+s.width+i),e()}}(),this.next.isPositioned=!0,this.next.render())}else{var n=this.getBottom();this.next.isPositioned||(this.next.shiftY(this.getY()+this.height+i),this.next.setX(n.x-this.next.width/2),this.next.isPositioned=!0,this.next.render())}}},s.prototype.renderLines=function(){this.next&&(this.next_direction?this.drawLineTo(this.next,this.getAttr("arrow-text")||"",this.next_direction):this.drawLineTo(this.next,this.getAttr("arrow-text")||""))},s.prototype.drawLineTo=function(t,i,e){this.connectedTo.indexOf(t)<0&&this.connectedTo.push(t);var s,n,o=this.getCenter().x,a=this.getCenter().y,l=this.getRight(),p=this.getBottom(),x=this.getTop(),y=this.getLeft(),g=t.getCenter().x,f=t.getCenter().y,c=t.getTop(),d=t.getRight(),m=t.getLeft(),u=o===g,b=a===f,_=af||this===t,w=o>g,L=ok&&(k=c.x);else n=10*Math.max(t.topLines.length,this.bottomLines.length),s=this.leftEnd&&v?h(this.chart,p,[{x:p.x,y:p.y+B/2-n},{x:p.x+(p.x-c.x)/2,y:p.y+B/2-n},{x:p.x+(p.x-c.x)/2,y:c.y-B/2-n},{x:c.x,y:c.y-B/2-n},{x:c.x,y:c.y}],i):h(this.chart,p,[{x:p.x,y:c.y-B/2-n},{x:c.x,y:c.y-B/2-n},{x:c.x,y:c.y}],i),this.bottomLines.push(s),t.topLines.push(s),this.bottomStart=!0,t.topEnd=!0,k=p.x+(p.x-c.x)/2;else n=10*Math.max(t.topLines.length,this.rightLines.length),s=h(this.chart,l,[{x:l.x+B/2,y:l.y-n},{x:l.x+B/2,y:c.y-B/2-n},{x:c.x,y:c.y-B/2-n},{x:c.x,y:c.y}],i),this.rightLines.push(s),t.topLines.push(s),this.rightStart=!0,t.topEnd=!0,k=l.x+B/2;else n=10*Math.max(t.topLines.length,this.rightLines.length),s=h(this.chart,l,[{x:l.x+B/2,y:l.y-n},{x:l.x+B/2,y:c.y-B/2-n},{x:c.x,y:c.y-B/2-n},{x:c.x,y:c.y}],i),this.rightLines.push(s),t.topLines.push(s),this.rightStart=!0,t.topEnd=!0,k=l.x+B/2;else 0===t.rightLines.length&&0===this.leftLines.length?s=h(this.chart,y,d,i):(n=10*Math.max(t.rightLines.length,this.leftLines.length),s=h(this.chart,l,[{x:l.x,y:l.y-n},{x:l.x,y:d.y-n},{x:d.x,y:d.y-n},{x:d.x,y:d.y}],i)),this.leftLines.push(s),t.rightLines.push(s),this.leftStart=!0,t.rightEnd=!0,k=d.x;else 0===t.leftLines.length&&0===this.rightLines.length?s=h(this.chart,l,m,i):(n=10*Math.max(t.leftLines.length,this.rightLines.length),s=h(this.chart,l,[{x:l.x,y:l.y-n},{x:l.x,y:m.y-n},{x:m.x,y:m.y-n},{x:m.x,y:m.y}],i)),this.rightLines.push(s),t.leftLines.push(s),this.rightStart=!0,t.leftEnd=!0,k=m.x;else 0===t.topLines.length&&0===this.bottomLines.length?s=h(this.chart,p,c,i):(n=10*Math.max(t.topLines.length,this.bottomLines.length),s=h(this.chart,p,[{x:c.x,y:c.y-n},{x:c.x,y:c.y}],i)),this.bottomLines.push(s),t.topLines.push(s),this.bottomStart=!0,t.topEnd=!0,k=p.x;if(this.lineStyle[t.key]&&s&&s.attr(this.lineStyle[t.key]),s){for(var O=0,X=this.chart.lines.length;OW?(J=["L",q.x+2*M,I],C.splice(N+1,0,J),J=["C",q.x+2*M,I,q.x,I-4*M,q.x-2*M,I],C.splice(N+2,0,J),s.attr("path",C)):(J=["L",q.x-2*M,I],C.splice(N+1,0,J),J=["C",q.x-2*M,I,q.x,I-4*M,q.x+2*M,I],C.splice(N+2,0,J),s.attr("path",C)):I>Q?(J=["L",G,q.y+2*M],C.splice(N+1,0,J),J=["C",G,q.y+2*M,G+4*M,q.y,G,q.y-2*M],C.splice(N+2,0,J),s.attr("path",C)):(J=["L",G,q.y-2*M],C.splice(N+1,0,J),J=["C",G,q.y-2*M,G+4*M,q.y,G,q.y+2*M],C.splice(N+2,0,J),s.attr("path",C)),N+=2}}}this.chart.lines.push(s),(void 0===this.chart.minXFromSymbols||this.chart.minXFromSymbols>y.x)&&(this.chart.minXFromSymbols=y.x)}(!this.chart.maxXFromLine||this.chart.maxXFromLine&&k>this.chart.maxXFromLine)&&(this.chart.maxXFromLine=k)},t.exports=s},function(t,i){function e(t,i,e){var s,n,h="M{0},{1}";for(s=2,n=2*e.length+2;sd.x?i.x-(i.x-d.x)/2:d.x-(d.x-i.x)/2,u=i.y>d.y?i.y-(i.y-d.y)/2:d.y-(d.y-i.y)/2,c?(m-=g.getBBox().width/2,u-=t.options["text-margin"]):(m+=t.options["text-margin"],u-=g.getBBox().height/2)):(m=i.x,u=i.y,c?(i.x>d.x?(m-=t.options["text-margin"]/2,f="end"):m+=t.options["text-margin"]/2,u-=t.options["text-margin"]):(m+=t.options["text-margin"]/2,u+=t.options["text-margin"],i.y>d.y&&(u-=2*t.options["text-margin"]))),g.attr({"text-anchor":f,"font-size":t.options["font-size"],fill:t.options["font-color"],x:m,y:u}),l&&g.attr({font:l}),p&&g.attr({"font-family":p}),x&&g.attr({"font-weight":x})}return a}function n(t,i,e,s,n,h,r,o){var a,l,p,x,y,g={x:null,y:null,onLine1:!1,onLine2:!1};return a=(o-h)*(e-t)-(r-n)*(s-i),0===a?g:(l=i-h,p=t-n,x=(r-n)*l-(o-h)*p,y=(e-t)*l-(s-i)*p,l=x/a,p=y/a,g.x=t+l*(e-t),g.y=i+l*(s-i),l>0&&l<1&&(g.onLine1=!0),p>0&&p<1&&(g.onLine2=!0),g)}t.exports={drawPath:e,drawLine:s,checkLineIntersection:n}},function(t,i,e){function s(t){function i(t){var i=t.indexOf("(")+1,e=t.indexOf(")");return i>=0&&e>=0?t.substring(i,e):"{}"}function e(t){var i=t.indexOf("(")+1,e=t.indexOf(")");return i>=0&&e>=0?t.substring(i,e):""}function s(t){var i=t.indexOf("(")+1,e=t.indexOf(")");return i>=0&&e>=0?d.symbols[t.substring(0,i-1)]:d.symbols[t]}function f(t){var i="next",e=t.indexOf("(")+1,s=t.indexOf(")");return e>=0&&s>=0&&(i=N.substring(e,s),i.indexOf(",")<0&&"yes"!==i&&"no"!==i&&(i="next, "+i)),i}function c(t){var i=t.indexOf("(")+1,e=t.indexOf(")"),s=t.substring(i,e);s.indexOf(",")>0&&(s=s.substring(0,s.indexOf(",")));var n=s.split("@");if(n.length>1)return i>=0&&e>=0?n[1]:""}t=t||"",t=t.trim();for(var d={symbols:{},start:null,drawSVG:function(t,i){function e(t){if(c[t.key])return c[t.key];switch(t.symbolType){case"start":c[t.key]=new h(f,t);break;case"end":c[t.key]=new r(f,t);break;case"operation":c[t.key]=new o(f,t);break;case"inputoutput":c[t.key]=new a(f,t);break;case"input":c[t.key]=new l(f,t);break;case"output":c[t.key]=new p(f,t);break;case"subroutine":c[t.key]=new x(f,t);break;case"condition":c[t.key]=new y(f,t);break;case"parallel":c[t.key]=new g(f,t);break;default:return new Error("Wrong symbol type!")}return c[t.key]}var s=this;this.diagram&&this.diagram.clean();var f=new n(t,i);this.diagram=f;var c={};!function t(i,n,h){var r=e(i);return s.start===i?f.startWith(r):n&&h&&!n.pathOk&&(n instanceof y?(h.yes===i&&n.yes(r),h.no===i&&n.no(r)):n instanceof g?(h.path1===i&&n.path1(r),h.path2===i&&n.path2(r),h.path3===i&&n.path3(r)):n.then(r)),r.pathOk?r:(r instanceof y?(i.yes&&t(i.yes,r,i),i.no&&t(i.no,r,i)):r instanceof g?(i.path1&&t(i.path1,r,i),i.path2&&t(i.path2,r,i),i.path3&&t(i.path3,r,i)):i.next&&t(i.next,r,i),r)}(this.start),f.render()},clean:function(){this.diagram.clean()},options:function(){return this.diagram.options}},m=[],u=0,b=1,_=t.length;b<_;b++)if("\n"===t[b]&&"\\"!==t[b-1]){var v=t.substring(u,b);u=b+1,m.push(v.replace(/\\\n/g,"\n"))}u")<0&&k.indexOf("=>")<0&&k.indexOf("@>")<0?(m[w-1]+="\n"+k,m.splice(w,1),L--):w++}for(;m.length>0;){var B=m.splice(0,1)[0].trim();if(B.indexOf("=>")>=0){var M=B.split("=>"),A={key:M[0].replace(/\(.*\)/,""),symbolType:M[1],text:null,link:null,target:null,flowstate:null,function:null,lineStyle:{},params:{}},O=M[0].match(/\((.*)\)/);if(O&&O.length>1)for(var X=O[1].split(","),T=0;T=0&&(C=A.symbolType.split(": "),A.symbolType=C.shift(),A.text=C.join(": ")),A.text&&A.text.indexOf(":$")>=0?(C=A.text.split(":$"),A.text=C.shift(),A.function=C.join(":$")):A.symbolType.indexOf(":$")>=0?(C=A.symbolType.split(":$"),A.symbolType=C.shift(),A.function=C.join(":$")):A.text&&A.text.indexOf(":>")>=0?(C=A.text.split(":>"),A.text=C.shift(),A.link=C.join(":>")):A.symbolType.indexOf(":>")>=0&&(C=A.symbolType.split(":>"),A.symbolType=C.shift(),A.link=C.join(":>")),A.symbolType.indexOf("\n")>=0&&(A.symbolType=A.symbolType.split("\n")[0]),A.link){var Y=A.link.indexOf("[")+1,P=A.link.indexOf("]");Y>=0&&P>=0&&(A.target=A.link.substring(Y,P),A.link=A.link.substring(0,Y-1))}if(A.text&&A.text.indexOf("|")>=0){var j=A.text.split("|");A.flowstate=j.pop().trim(),A.text=j.join("|")}d.symbols[A.key]=A}else if(B.indexOf("->")>=0){var E=c(B);E&&(B=B.replace("@"+E,""));for(var z=B.split("->"),R=0,F=z.length;R=0){var W=V.split(",");V=W[0],I=W[1].trim()}if(E&&("condition"===G.symbolType?"yes"===V||"true"===V?G.yes_annotation=E:G.no_annotation=E:"parallel"===G.symbolType&&("path1"===V?G.path1_annotation=E:"path2"===V?G.path2_annotation=E:"path3"===V&&(G.path3_annotation=E)),E=null),d.start||(d.start=G),R+1")>=0)for(var q=B.split("@>"),J=0,D=q.length;Jt.right_symbol.getCenter().y&&o<=t.right_symbol.width/2){n=!0;break}}if(n){if("end"===t.right_symbol.symbolType)return;t.right_symbol.setX(s.getX()+s.width+i),e()}}(),this.right_symbol.isPositioned=!0,this.right_symbol.render())}if(this.left_symbol){var n=this.getLeft();this.left_symbol.isPositioned||(this.left_symbol.setY(n.y-this.left_symbol.height/2),this.left_symbol.shiftX(-(this.group.getBBox().x+this.width+i)),function e(){for(var s,n=!1,h=0,r=t.chart.symbols.length;ht.left_symbol.getCenter().y&&o<=t.left_symbol.width/2){n=!0;break}}if(n){if("end"===t.left_symbol.symbolType)return;t.left_symbol.setX(s.getX()+s.width+i),e()}}(),this.left_symbol.isPositioned=!0,this.left_symbol.render())}},s.prototype.renderLines=function(){this.yes_symbol&&this.drawLineTo(this.yes_symbol,this.yes_annotation?this.yes_annotation:this.getAttr("yes-text"),this.yes_direction),this.no_symbol&&this.drawLineTo(this.no_symbol,this.no_annotation?this.no_annotation:this.getAttr("no-text"),this.no_direction)},t.exports=s},function(t,i,e){function s(t,i){var e=t.paper.rect(0,0,0,0);i=i||{},n.call(this,t,i,e),this.path1_annotation=i.path1_annotation||"",this.path2_annotation=i.path2_annotation||"",this.path3_annotation=i.path3_annotation||"",this.textMargin=this.getAttr("text-margin"),this.path1_direction="bottom",this.path2_direction="right",this.path3_direction="top",this.params=i.params,"path1"===i.direction_next&&!i[i.direction_next]&&i.next&&(i[i.direction_next]=i.next),"path2"===i.direction_next&&!i[i.direction_next]&&i.next&&(i[i.direction_next]=i.next),"path3"===i.direction_next&&!i[i.direction_next]&&i.next&&(i[i.direction_next]=i.next),i.path1&&i.direction_path1&&i.path2&&!i.direction_path2&&i.path3&&!i.direction_path3?"right"===i.direction_path1?(this.path2_direction="bottom",this.path1_direction="right",this.path3_direction="top"):"top"===i.direction_path1?(this.path2_direction="right",this.path1_direction="top",this.path3_direction="bottom"):"left"===i.direction_path1?(this.path2_direction="right",this.path1_direction="left",this.path3_direction="bottom"):(this.path2_direction="right",this.path1_direction="bottom",this.path3_direction="top"):i.path1&&!i.direction_path1&&i.path2&&i.direction_path2&&i.path3&&!i.direction_path3?"right"===i.direction_path2?(this.path1_direction="bottom",this.path2_direction="right",this.path3_direction="top"):"left"===i.direction_path2?(this.path1_direction="bottom",this.path2_direction="left",this.path3_direction="right"):(this.path1_direction="right",this.path2_direction="bottom",this.path3_direction="top"):i.path1&&!i.direction_path1&&i.path2&&!i.direction_path2&&i.path3&&i.direction_path3?"right"===i.direction_path2?(this.path1_direction="bottom",this.path2_direction="top",this.path3_direction="right"):"left"===i.direction_path2?(this.path1_direction="bottom",this.path2_direction="right",this.path3_direction="left"):(this.path1_direction="right",this.path2_direction="bottom",this.path3_direction="top"):(this.path1_direction=i.direction_path1,this.path2_direction=i.direction_path2,this.path3_direction=i.direction_path3),this.path1_direction=this.path1_direction||"bottom",this.path2_direction=this.path2_direction||"right",this.path3_direction=this.path3_direction||"top",this.initialize()}var n=e(2),h=e(1).inherits;h(s,n),s.prototype.render=function(){this.path1_direction&&(this[this.path1_direction+"_symbol"]=this.path1_symbol),this.path2_direction&&(this[this.path2_direction+"_symbol"]=this.path2_symbol),this.path3_direction&&(this[this.path3_direction+"_symbol"]=this.path3_symbol);var t=this.getAttr("line-length");if(this.bottom_symbol){var i=this.getBottom();this.bottom_symbol.isPositioned||(this.bottom_symbol.shiftY(this.getY()+this.height+t),this.bottom_symbol.setX(i.x-this.bottom_symbol.width/2),this.bottom_symbol.isPositioned=!0,this.bottom_symbol.render())}if(this.top_symbol){var e=this.getTop();this.top_symbol.isPositioned||(this.top_symbol.shiftY(this.getY()-this.top_symbol.height-t),this.top_symbol.setX(e.x+this.top_symbol.width),this.top_symbol.isPositioned=!0,this.top_symbol.render())}var s=this;if(this.left_symbol){var n=this.getLeft();this.left_symbol.isPositioned||(this.left_symbol.setY(n.y-this.left_symbol.height/2),this.left_symbol.shiftX(-(this.group.getBBox().x+this.width+t)),function i(){for(var e,n=!1,h=0,r=s.chart.symbols.length;hs.left_symbol.getCenter().y&&o<=s.left_symbol.width/2){n=!0;break}}if(n){if("end"===s.left_symbol.symbolType)return;s.left_symbol.setX(e.getX()+e.width+t),i()}}(),this.left_symbol.isPositioned=!0,this.left_symbol.render())}if(this.right_symbol){var h=this.getRight();this.right_symbol.isPositioned||(this.right_symbol.setY(h.y-this.right_symbol.height/2),this.right_symbol.shiftX(this.group.getBBox().x+this.width+t),function i(){for(var e,n=!1,h=0,r=s.chart.symbols.length;hs.right_symbol.getCenter().y&&o<=s.right_symbol.width/2){n=!0;break}}if(n){if("end"===s.right_symbol.symbolType)return;s.right_symbol.setX(e.getX()+e.width+t),i()}}(),this.right_symbol.isPositioned=!0,this.right_symbol.render())}},s.prototype.renderLines=function(){this.path1_symbol&&this.drawLineTo(this.path1_symbol,this.path1_annotation,this.path1_direction),this.path2_symbol&&this.drawLineTo(this.path2_symbol,this.path2_annotation,this.path2_direction),this.path3_symbol&&this.drawLineTo(this.path3_symbol,this.path3_annotation,this.path3_direction)},t.exports=s},function(t,i,e){function s(t,i){i=i||{},this.paper=new n(t),this.options=h(i,r),this.symbols=[],this.lines=[],this.start=null}var n=e(18),h=e(1).defaults,r=e(8),o=e(5),a=e(6);s.prototype.handle=function(t){this.symbols.indexOf(t)<=-1&&this.symbols.push(t);var i=this;return t instanceof o?(t.yes=function(e){return t.yes_symbol=e,t.no_symbol&&(t.pathOk=!0),i.handle(e)},t.no=function(e){return t.no_symbol=e,t.yes_symbol&&(t.pathOk=!0),i.handle(e)}):t instanceof a?(t.path1=function(e){return t.path1_symbol=e,t.path2_symbol&&(t.pathOk=!0),i.handle(e)},t.path2=function(e){return t.path2_symbol=e,t.path3_symbol&&(t.pathOk=!0),i.handle(e)},t.path3=function(e){return t.path3_symbol=e,t.path1_symbol&&(t.pathOk=!0),i.handle(e)}):t.then=function(e){return t.next=e,t.pathOk=!0,i.handle(e)},t},s.prototype.startWith=function(t){return this.start=t,this.handle(t)},s.prototype.render=function(){var t,i,e=0,s=0,n=0,h=0,r=0,o=0,a=0,l=0;for(n=0,h=this.symbols.length;ne&&(e=t.width),t.height>s&&(s=t.height);for(n=0,h=this.symbols.length;nr&&(r=p),x>o&&(o=x)}for(n=0,h=this.lines.length;nr&&(r=g),f>o&&(o=f)}var c=this.options.scale,d=this.options["line-width"];this.minXFromSymbols>>0;if(0===e)return-1;var s=0;if(arguments.length>0&&(s=Number(arguments[1]),s!=s?s=0:0!==s&&s!=1/0&&s!=-(1/0)&&(s=(s>0||-1)*Math.floor(Math.abs(s)))),s>=e)return-1;for(var n=s>=0?s:Math.max(e-Math.abs(s),0);n>>0;if(0===e)return-1;var s=e;arguments.length>1&&(s=Number(arguments[1]),s!=s?s=0:0!==s&&s!=1/0&&s!=-(1/0)&&(s=(s>0||-1)*Math.floor(Math.abs(s))));for(var n=s>=0?Math.min(s,e-1):e-Math.abs(s);n>=0;n--)if(n in i&&i[n]===t)return n;return-1}),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,"")})},function(t,i,e){function s(t,i){var e=t.paper.rect(0,0,0,0,20);i=i||{},i.text=i.text||"End",n.call(this,t,i,e)}var n=e(2),h=e(1).inherits;h(s,n),t.exports=s},function(t,i,e){function s(t,i){i=i||{},n.call(this,t,i),this.textMargin=this.getAttr("text-margin"),this.text.attr({x:3*this.textMargin});var e=this.text.getBBox().width+4*this.textMargin,s=this.text.getBBox().height+2*this.textMargin,h=this.textMargin,r=s/2,a={x:h,y:r},l=[{x:h-this.textMargin+2*this.textMargin,y:s},{x:h-this.textMargin+e,y:s},{x:h-this.textMargin+e+2*this.textMargin,y:0},{x:h-this.textMargin,y:0},{x:h,y:r}],p=o(t,a,l);p.attr({stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),fill:this.getAttr("fill")}),i.link&&p.attr("href",i.link),i.target&&p.attr("target",i.target),i.key&&(p.node.id=i.key),p.node.setAttribute("class",this.getAttr("class")),this.text.attr({y:p.getBBox().height/2}),this.group.push(p),p.insertBefore(this.text),this.symbol=p,this.initialize()}var n=e(2),h=e(1).inherits,r=e(3),o=r.drawPath;h(s,n),s.prototype.getLeft=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX()+this.textMargin;return{x:i,y:t}},s.prototype.getRight=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX()+this.group.getBBox().width-this.textMargin;return{x:i,y:t}},t.exports=s},function(t,i,e){function s(t,i){i=i||{},n.call(this,t,i),this.textMargin=this.getAttr("text-margin"),this.text.attr({x:3*this.textMargin});var e=this.text.getBBox().width+4*this.textMargin,s=this.text.getBBox().height+2*this.textMargin,h=this.textMargin,r=s/2,a={x:h,y:r},l=[{x:h-this.textMargin,y:s},{x:h-this.textMargin+e,y:s},{x:h-this.textMargin+e+2*this.textMargin,y:0},{x:h-this.textMargin+2*this.textMargin,y:0},{x:h,y:r}],p=o(t,a,l);p.attr({stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),fill:this.getAttr("fill")}),i.link&&p.attr("href",i.link),i.target&&p.attr("target",i.target),i.key&&(p.node.id=i.key),p.node.setAttribute("class",this.getAttr("class")),this.text.attr({y:p.getBBox().height/2}),this.group.push(p),p.insertBefore(this.text),this.symbol=p,this.initialize()}var n=e(2),h=e(1).inherits,r=e(3),o=r.drawPath;h(s,n),s.prototype.getLeft=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX()+this.textMargin;return{x:i,y:t}},s.prototype.getRight=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX()+this.group.getBBox().width-this.textMargin;return{x:i,y:t}},t.exports=s},function(t,i,e){function s(t,i){var e=t.paper.rect(0,0,0,0);i=i||{},n.call(this,t,i,e)}var n=e(2),h=e(1).inherits;
+h(s,n),t.exports=s},function(t,i,e){function s(t,i){i=i||{},n.call(this,t,i),this.textMargin=this.getAttr("text-margin"),this.text.attr({x:3*this.textMargin});var e=this.text.getBBox().width+4*this.textMargin,s=this.text.getBBox().height+2*this.textMargin,h=this.textMargin,r=s/2,a={x:h,y:r},l=[{x:h-this.textMargin,y:s},{x:h-this.textMargin+e+2*this.textMargin,y:s},{x:h-this.textMargin+e,y:0},{x:h-this.textMargin+2*this.textMargin,y:0},{x:h,y:r}],p=o(t,a,l);p.attr({stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),fill:this.getAttr("fill")}),i.link&&p.attr("href",i.link),i.target&&p.attr("target",i.target),i.key&&(p.node.id=i.key),p.node.setAttribute("class",this.getAttr("class")),this.text.attr({y:p.getBBox().height/2}),this.group.push(p),p.insertBefore(this.text),this.symbol=p,this.initialize()}var n=e(2),h=e(1).inherits,r=e(3),o=r.drawPath;h(s,n),s.prototype.getLeft=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX()+this.textMargin;return{x:i,y:t}},s.prototype.getRight=function(){var t=this.getY()+this.group.getBBox().height/2,i=this.getX()+this.group.getBBox().width-this.textMargin;return{x:i,y:t}},t.exports=s},function(t,i,e){function s(t,i){var e=t.paper.rect(0,0,0,0,20);i=i||{},i.text=i.text||"Start",n.call(this,t,i,e)}var n=e(2),h=e(1).inherits;h(s,n),t.exports=s},function(t,i,e){function s(t,i){var e=t.paper.rect(0,0,0,0);i=i||{},n.call(this,t,i,e),e.attr({width:this.text.getBBox().width+4*this.getAttr("text-margin")}),this.text.attr({x:2*this.getAttr("text-margin")});var s=t.paper.rect(0,0,0,0);s.attr({x:this.getAttr("text-margin"),stroke:this.getAttr("element-color"),"stroke-width":this.getAttr("line-width"),width:this.text.getBBox().width+2*this.getAttr("text-margin"),height:this.text.getBBox().height+2*this.getAttr("text-margin"),fill:this.getAttr("fill")}),i.key&&(s.node.id=i.key+"i");var h=this.getAttr("font"),r=this.getAttr("font-family"),o=this.getAttr("font-weight");h&&s.attr({font:h}),r&&s.attr({"font-family":r}),o&&s.attr({"font-weight":o}),i.link&&s.attr("href",i.link),i.target&&s.attr("target",i.target),this.group.push(s),s.insertBefore(this.text),this.initialize()}var n=e(2),h=e(1).inherits;h(s,n),t.exports=s},function(t,i,e){if("undefined"!=typeof jQuery){var s=e(4);!function(t){function i(t,i){return t==i||Array.isArray(i)&&(i.includes(t)||i.includes(Number(t)))}var e={init:function(i){return this.each(function(){var e=t(this);this.chart=s(e.text()),e.html(""),this.chart.drawSVG(this,i)})},setFlowStateByParam:function(t,e,s){return this.each(function(){var n=this.chart,h=["next","yes","no","path1","path2","path3"];for(var r in n.symbols)if(n.symbols.hasOwnProperty(r)){var o=n.symbols[r],a=o.params[t];if(i(a,e)){o.flowstate=s;for(var l=0;l maxWidth) {\n\t tempText += \"\\n\" + word;\n\t } else {\n\t tempText += \" \" + word;\n\t }\n\t }\n\t this.text.attr(\"text\", tempText.substring(1));\n\t }\n\t\n\t this.group.push(this.text);\n\t\n\t if (symbol) {\n\t var tmpMargin = this.getAttr('text-margin');\n\t\n\t symbol.attr({\n\t 'fill' : this.getAttr('fill'),\n\t 'stroke' : this.getAttr('element-color'),\n\t 'stroke-width' : this.getAttr('line-width'),\n\t 'width' : this.text.getBBox().width + 2 * tmpMargin,\n\t 'height' : this.text.getBBox().height + 2 * tmpMargin\n\t });\n\t\n\t symbol.node.setAttribute('class', this.getAttr('class'));\n\t var roundness = this.getAttr('roundness');\n\t if (!isNaN(roundness)) {\n\t symbol.node.setAttribute('ry', roundness);\n\t symbol.node.setAttribute('rx', roundness);\n\t }\n\t\n\t if (options.link) { symbol.attr('href', options.link); }\n\t if (options.target) { symbol.attr('target', options.target); }\n\t\n\t //ndrqu Add click function with event and options params\n\t if (options.function) { \n\t symbol.node.addEventListener(\"click\", function(evt) {\n\t window[options.function](evt,options);\n\t }, false);\n\t symbol.attr({ 'cursor' : 'pointer' });\n\t }\n\t if (options.key) { symbol.node.id = options.key; }\n\t\n\t this.group.push(symbol);\n\t symbol.insertBefore(this.text);\n\t\n\t this.text.attr({\n\t 'y': symbol.getBBox().height/2\n\t });\n\t\n\t this.initialize();\n\t }\n\t\n\t}\n\t\n\t/* Gets the attribute based on Flowstate, Symbol-Name and default, first found wins */\n\tSymbol.prototype.getAttr = function(attName) {\n\t if (!this.chart) {\n\t return undefined;\n\t }\n\t var opt3 = (this.chart.options) ? this.chart.options[attName] : undefined;\n\t var opt2 = (this.chart.options.symbols) ? this.chart.options.symbols[this.symbolType][attName] : undefined;\n\t var opt1;\n\t if (this.chart.options.flowstate && this.chart.options.flowstate[this.flowstate]) {\n\t opt1 = this.chart.options.flowstate[this.flowstate][attName];\n\t }\n\t return (opt1 || opt2 || opt3);\n\t};\n\t\n\tSymbol.prototype.initialize = function() {\n\t this.group.transform('t' + this.getAttr('line-width') + ',' + this.getAttr('line-width'));\n\t\n\t this.width = this.group.getBBox().width;\n\t this.height = this.group.getBBox().height;\n\t};\n\t\n\tSymbol.prototype.getCenter = function() {\n\t return {x: this.getX() + this.width/2,\n\t y: this.getY() + this.height/2};\n\t};\n\t\n\tSymbol.prototype.getX = function() {\n\t return this.group.getBBox().x;\n\t};\n\t\n\tSymbol.prototype.getY = function() {\n\t return this.group.getBBox().y;\n\t};\n\t\n\tSymbol.prototype.shiftX = function(x) {\n\t this.group.transform('t' + (this.getX() + x) + ',' + this.getY());\n\t};\n\t\n\tSymbol.prototype.setX = function(x) {\n\t this.group.transform('t' + x + ',' + this.getY());\n\t};\n\t\n\tSymbol.prototype.shiftY = function(y) {\n\t this.group.transform('t' + this.getX() + ',' + (this.getY() + y));\n\t};\n\t\n\tSymbol.prototype.setY = function(y) {\n\t this.group.transform('t' + this.getX() + ',' + y);\n\t};\n\t\n\tSymbol.prototype.getTop = function() {\n\t var y = this.getY();\n\t var x = this.getX() + this.width/2;\n\t return {x: x, y: y};\n\t};\n\t\n\tSymbol.prototype.getBottom = function() {\n\t var y = this.getY() + this.height;\n\t var x = this.getX() + this.width/2;\n\t return {x: x, y: y};\n\t};\n\t\n\tSymbol.prototype.getLeft = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX();\n\t return {x: x, y: y};\n\t};\n\t\n\tSymbol.prototype.getRight = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX() + this.group.getBBox().width;\n\t return {x: x, y: y};\n\t};\n\t\n\tSymbol.prototype.render = function() {\n\t if (this.next) {\n\t\n\t var self = this;\n\t var lineLength = this.getAttr('line-length');\n\t\n\t if (this.next_direction === 'right') {\n\t\n\t var rightPoint = this.getRight();\n\t\n\t if (!this.next.isPositioned) {\n\t this.next.setY(rightPoint.y - this.next.height/2);\n\t this.next.shiftX(this.group.getBBox().x + this.width + lineLength);\n\t\n\t (function shift() {\n\t var hasSymbolUnder = false;\n\t var symb;\n\t for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n\t symb = self.chart.symbols[i];\n\t\n\t var diff = Math.abs(symb.getCenter().x - self.next.getCenter().x);\n\t if (symb.getCenter().y > self.next.getCenter().y && diff <= self.next.width/2) {\n\t hasSymbolUnder = true;\n\t break;\n\t }\n\t }\n\t\n\t if (hasSymbolUnder) {\n\t if (self.next.symbolType === 'end') return;\n\t self.next.setX(symb.getX() + symb.width + lineLength);\n\t shift();\n\t }\n\t })();\n\t\n\t this.next.isPositioned = true;\n\t\n\t this.next.render();\n\t }\n\t } else if (this.next_direction === 'left') {\n\t\n\t var leftPoint = this.getLeft();\n\t\n\t if (!this.next.isPositioned) {\n\t this.next.setY(leftPoint.y - this.next.height/2);\n\t this.next.shiftX(-(this.group.getBBox().x + this.width + lineLength));\n\t\n\t (function shift() {\n\t var hasSymbolUnder = false;\n\t var symb;\n\t for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n\t symb = self.chart.symbols[i];\n\t\n\t var diff = Math.abs(symb.getCenter().x - self.next.getCenter().x);\n\t if (symb.getCenter().y > self.next.getCenter().y && diff <= self.next.width/2) {\n\t hasSymbolUnder = true;\n\t break;\n\t }\n\t }\n\t\n\t if (hasSymbolUnder) {\n\t if (self.next.symbolType === 'end') return;\n\t self.next.setX(symb.getX() + symb.width + lineLength);\n\t shift();\n\t }\n\t })();\n\t\n\t this.next.isPositioned = true;\n\t\n\t this.next.render();\n\t }\n\t } else {\n\t var bottomPoint = this.getBottom();\n\t\n\t if (!this.next.isPositioned) {\n\t this.next.shiftY(this.getY() + this.height + lineLength);\n\t this.next.setX(bottomPoint.x - this.next.width/2);\n\t this.next.isPositioned = true;\n\t\n\t this.next.render();\n\t }\n\t }\n\t }\n\t};\n\t\n\tSymbol.prototype.renderLines = function() {\n\t if (this.next) {\n\t if (this.next_direction) {\n\t this.drawLineTo(this.next, this.getAttr('arrow-text') || '', this.next_direction);\n\t } else {\n\t this.drawLineTo(this.next, this.getAttr('arrow-text') || '');\n\t }\n\t }\n\t};\n\t\n\tSymbol.prototype.drawLineTo = function(symbol, text, origin) {\n\t if (this.connectedTo.indexOf(symbol) < 0) {\n\t this.connectedTo.push(symbol);\n\t }\n\t\n\t var x = this.getCenter().x,\n\t y = this.getCenter().y,\n\t right = this.getRight(),\n\t bottom = this.getBottom(),\n\t top = this.getTop(),\n\t left = this.getLeft();\n\t\n\t var symbolX = symbol.getCenter().x,\n\t symbolY = symbol.getCenter().y,\n\t symbolTop = symbol.getTop(),\n\t symbolRight = symbol.getRight(),\n\t symbolLeft = symbol.getLeft();\n\t\n\t var isOnSameColumn = x === symbolX,\n\t isOnSameLine = y === symbolY,\n\t isUnder = y < symbolY,\n\t isUpper = y > symbolY || this === symbol,\n\t isLeft = x > symbolX,\n\t isRight = x < symbolX;\n\t\n\t var maxX = 0,\n\t line,\n\t yOffset,\n\t lineLength = this.getAttr('line-length'),\n\t lineWith = this.getAttr('line-width');\n\t\n\t if ((!origin || origin === 'bottom') && isOnSameColumn && isUnder) {\n\t if (symbol.topLines.length === 0 && this.bottomLines.length === 0) {\n\t line = drawLine(this.chart, bottom, symbolTop, text);\n\t } else {\n\t yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n\t line = drawLine(this.chart, bottom, [\n\t {x: symbolTop.x, y: symbolTop.y - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t }\n\t this.bottomLines.push(line);\n\t symbol.topLines.push(line);\n\t this.bottomStart = true;\n\t symbol.topEnd = true;\n\t maxX = bottom.x;\n\t } else if ((!origin || origin === 'right') && isOnSameLine && isRight) {\n\t if (symbol.leftLines.length === 0 && this.rightLines.length === 0) {\n\t line = drawLine(this.chart, right, symbolLeft, text);\n\t } else {\n\t yOffset = Math.max(symbol.leftLines.length, this.rightLines.length) * 10;\n\t line = drawLine(this.chart, right, [\n\t {x: right.x, y: right.y - yOffset},\n\t {x: right.x, y: symbolLeft.y - yOffset},\n\t {x: symbolLeft.x, y: symbolLeft.y - yOffset},\n\t {x: symbolLeft.x, y: symbolLeft.y}\n\t ], text);\n\t }\n\t this.rightLines.push(line);\n\t symbol.leftLines.push(line);\n\t this.rightStart = true;\n\t symbol.leftEnd = true;\n\t maxX = symbolLeft.x;\n\t } else if ((!origin || origin === 'left') && isOnSameLine && isLeft) {\n\t if (symbol.rightLines.length === 0 && this.leftLines.length === 0) {\n\t line = drawLine(this.chart, left, symbolRight, text);\n\t } else {\n\t yOffset = Math.max(symbol.rightLines.length, this.leftLines.length) * 10;\n\t line = drawLine(this.chart, right, [\n\t {x: right.x, y: right.y - yOffset},\n\t {x: right.x, y: symbolRight.y - yOffset},\n\t {x: symbolRight.x, y: symbolRight.y - yOffset},\n\t {x: symbolRight.x, y: symbolRight.y}\n\t ], text);\n\t }\n\t this.leftLines.push(line);\n\t symbol.rightLines.push(line);\n\t this.leftStart = true;\n\t symbol.rightEnd = true;\n\t maxX = symbolRight.x;\n\t } else if ((!origin || origin === 'right') && isOnSameColumn && isUpper) {\n\t yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n\t line = drawLine(this.chart, right, [\n\t {x: right.x + lineLength/2, y: right.y - yOffset},\n\t {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.rightLines.push(line);\n\t symbol.topLines.push(line);\n\t this.rightStart = true;\n\t symbol.topEnd = true;\n\t maxX = right.x + lineLength/2;\n\t } else if ((!origin || origin === 'right') && isOnSameColumn && isUnder) {\n\t yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n\t line = drawLine(this.chart, right, [\n\t {x: right.x + lineLength/2, y: right.y - yOffset},\n\t {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.rightLines.push(line);\n\t symbol.topLines.push(line);\n\t this.rightStart = true;\n\t symbol.topEnd = true;\n\t maxX = right.x + lineLength/2;\n\t } else if ((!origin || origin === 'bottom') && isLeft) {\n\t yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n\t if (this.leftEnd && isUpper) {\n\t line = drawLine(this.chart, bottom, [\n\t {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},\n\t {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2 - yOffset},\n\t {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t } else {\n\t line = drawLine(this.chart, bottom, [\n\t {x: bottom.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t }\n\t this.bottomLines.push(line);\n\t symbol.topLines.push(line);\n\t this.bottomStart = true;\n\t symbol.topEnd = true;\n\t maxX = bottom.x + (bottom.x - symbolTop.x)/2;\n\t } else if ((!origin || origin === 'bottom') && isRight && isUnder) {\n\t yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n\t line = drawLine(this.chart, bottom, [\n\t {x: bottom.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.bottomLines.push(line);\n\t symbol.topLines.push(line);\n\t this.bottomStart = true;\n\t symbol.topEnd = true;\n\t maxX = bottom.x;\n\t if (symbolTop.x > maxX) maxX = symbolTop.x;\n\t } else if ((!origin || origin === 'bottom') && isRight) {\n\t yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n\t line = drawLine(this.chart, bottom, [\n\t {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},\n\t {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2 - yOffset},\n\t {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.bottomLines.push(line);\n\t symbol.topLines.push(line);\n\t this.bottomStart = true;\n\t symbol.topEnd = true;\n\t maxX = bottom.x + (bottom.x - symbolTop.x)/2;\n\t } else if ((origin && origin === 'right') && isLeft) {\n\t yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n\t line = drawLine(this.chart, right, [\n\t {x: right.x + lineLength/2, y: right.y},\n\t {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.rightLines.push(line);\n\t symbol.topLines.push(line);\n\t this.rightStart = true;\n\t symbol.topEnd = true;\n\t maxX = right.x + lineLength/2;\n\t } else if ((origin && origin === 'right') && isRight) {\n\t yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n\t line = drawLine(this.chart, right, [\n\t {x: symbolTop.x, y: right.y - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - yOffset}\n\t ], text);\n\t this.rightLines.push(line);\n\t symbol.topLines.push(line);\n\t this.rightStart = true;\n\t symbol.topEnd = true;\n\t maxX = right.x + lineLength/2;\n\t } else if ((origin && origin === 'bottom') && isOnSameColumn && isUpper) {\n\t yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n\t line = drawLine(this.chart, bottom, [\n\t {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},\n\t {x: right.x + lineLength/2, y: bottom.y + lineLength/2 - yOffset},\n\t {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.bottomLines.push(line);\n\t symbol.topLines.push(line);\n\t this.bottomStart = true;\n\t symbol.topEnd = true;\n\t maxX = bottom.x + lineLength/2;\n\t } else if ((origin === 'left') && isOnSameColumn && isUpper) {\n\t var diffX = left.x - lineLength/2;\n\t if (symbolLeft.x < left.x) {\n\t diffX = symbolLeft.x - lineLength/2;\n\t }\n\t yOffset = Math.max(symbol.topLines.length, this.leftLines.length) * 10;\n\t line = drawLine(this.chart, left, [\n\t {x: diffX, y: left.y - yOffset},\n\t {x: diffX, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.leftLines.push(line);\n\t symbol.topLines.push(line);\n\t this.leftStart = true;\n\t symbol.topEnd = true;\n\t maxX = left.x;\n\t } else if ((origin === 'left')) {\n\t yOffset = Math.max(symbol.topLines.length, this.leftLines.length) * 10;\n\t line = drawLine(this.chart, left, [\n\t {x: symbolTop.x + (left.x - symbolTop.x)/2, y: left.y},\n\t {x: symbolTop.x + (left.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.leftLines.push(line);\n\t symbol.topLines.push(line);\n\t this.leftStart = true;\n\t symbol.topEnd = true;\n\t maxX = left.x;\n\t } else if ((origin === 'top')) {\n\t yOffset = Math.max(symbol.topLines.length, this.topLines.length) * 10;\n\t line = drawLine(this.chart, top, [\n\t {x: top.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n\t {x: symbolTop.x, y: symbolTop.y}\n\t ], text);\n\t this.topLines.push(line);\n\t symbol.topLines.push(line);\n\t this.topStart = true;\n\t symbol.topEnd = true;\n\t maxX = top.x;\n\t }\n\t\n\t //update line style\n\t if (this.lineStyle[symbol.key] && line){\n\t line.attr(this.lineStyle[symbol.key]);\n\t }\n\t\n\t if (line) {\n\t for (var l = 0, llen = this.chart.lines.length; l < llen; l++) {\n\t var otherLine = this.chart.lines[l];\n\t\n\t var ePath = otherLine.attr('path'),\n\t lPath = line.attr('path');\n\t\n\t for (var iP = 0, lenP = ePath.length - 1; iP < lenP; iP++) {\n\t var newPath = [];\n\t newPath.push(['M', ePath[iP][1], ePath[iP][2]]);\n\t newPath.push(['L', ePath[iP + 1][1], ePath[iP + 1][2]]);\n\t\n\t var line1_from_x = newPath[0][1];\n\t var line1_from_y = newPath[0][2];\n\t var line1_to_x = newPath[1][1];\n\t var line1_to_y = newPath[1][2];\n\t\n\t for (var lP = 0, lenlP = lPath.length - 1; lP < lenlP; lP++) {\n\t var newLinePath = [];\n\t newLinePath.push(['M', lPath[lP][1], lPath[lP][2]]);\n\t newLinePath.push(['L', lPath[lP + 1][1], lPath[lP + 1][2]]);\n\t\n\t var line2_from_x = newLinePath[0][1];\n\t var line2_from_y = newLinePath[0][2];\n\t var line2_to_x = newLinePath[1][1];\n\t var line2_to_y = newLinePath[1][2];\n\t\n\t var res = checkLineIntersection(line1_from_x, line1_from_y, line1_to_x, line1_to_y, line2_from_x, line2_from_y, line2_to_x, line2_to_y);\n\t if (res.onLine1 && res.onLine2) {\n\t\n\t var newSegment;\n\t if (line2_from_y === line2_to_y) {\n\t if (line2_from_x > line2_to_x) {\n\t newSegment = ['L', res.x + lineWith * 2, line2_from_y];\n\t lPath.splice(lP + 1, 0, newSegment);\n\t newSegment = ['C', res.x + lineWith * 2, line2_from_y, res.x, line2_from_y - lineWith * 4, res.x - lineWith * 2, line2_from_y];\n\t lPath.splice(lP + 2, 0, newSegment);\n\t line.attr('path', lPath);\n\t } else {\n\t newSegment = ['L', res.x - lineWith * 2, line2_from_y];\n\t lPath.splice(lP + 1, 0, newSegment);\n\t newSegment = ['C', res.x - lineWith * 2, line2_from_y, res.x, line2_from_y - lineWith * 4, res.x + lineWith * 2, line2_from_y];\n\t lPath.splice(lP + 2, 0, newSegment);\n\t line.attr('path', lPath);\n\t }\n\t } else {\n\t if (line2_from_y > line2_to_y) {\n\t newSegment = ['L', line2_from_x, res.y + lineWith * 2];\n\t lPath.splice(lP + 1, 0, newSegment);\n\t newSegment = ['C', line2_from_x, res.y + lineWith * 2, line2_from_x + lineWith * 4, res.y, line2_from_x, res.y - lineWith * 2];\n\t lPath.splice(lP + 2, 0, newSegment);\n\t line.attr('path', lPath);\n\t } else {\n\t newSegment = ['L', line2_from_x, res.y - lineWith * 2];\n\t lPath.splice(lP + 1, 0, newSegment);\n\t newSegment = ['C', line2_from_x, res.y - lineWith * 2, line2_from_x + lineWith * 4, res.y, line2_from_x, res.y + lineWith * 2];\n\t lPath.splice(lP + 2, 0, newSegment);\n\t line.attr('path', lPath);\n\t }\n\t }\n\t\n\t lP += 2;\n\t }\n\t }\n\t }\n\t }\n\t\n\t this.chart.lines.push(line);\n\t if (this.chart.minXFromSymbols === undefined || this.chart.minXFromSymbols > left.x) {\n\t this.chart.minXFromSymbols = left.x;\n\t }\n\t }\n\t\n\t if (!this.chart.maxXFromLine || (this.chart.maxXFromLine && maxX > this.chart.maxXFromLine)) {\n\t this.chart.maxXFromLine = maxX;\n\t }\n\t};\n\t\n\tmodule.exports = Symbol;\n\n\n/***/ }),\n/* 3 */\n/*!************************************!*\\\n !*** ./src/flowchart.functions.js ***!\n \\************************************/\n/***/ (function(module, exports) {\n\n\tfunction drawPath(chart, location, points) {\n\t var i, len;\n\t var path = 'M{0},{1}';\n\t for (i = 2, len = 2 * points.length + 2; i < len; i+=2) {\n\t path += ' L{' + i + '},{' + (i + 1) + '}';\n\t }\n\t var pathValues = [location.x, location.y];\n\t for (i = 0, len = points.length; i < len; i++) {\n\t pathValues.push(points[i].x);\n\t pathValues.push(points[i].y);\n\t }\n\t var symbol = chart.paper.path(path, pathValues);\n\t symbol.attr('stroke', chart.options['element-color']);\n\t symbol.attr('stroke-width', chart.options['line-width']);\n\t\n\t var font = chart.options.font;\n\t var fontF = chart.options['font-family'];\n\t var fontW = chart.options['font-weight'];\n\t\n\t if (font) symbol.attr({ 'font': font });\n\t if (fontF) symbol.attr({ 'font-family': fontF });\n\t if (fontW) symbol.attr({ 'font-weight': fontW });\n\t\n\t return symbol;\n\t}\n\t\n\tfunction drawLine(chart, from, to, text) {\n\t var i, len;\n\t\n\t if (Object.prototype.toString.call(to) !== '[object Array]') {\n\t to = [to];\n\t }\n\t\n\t var path = 'M{0},{1}';\n\t for (i = 2, len = 2 * to.length + 2; i < len; i+=2) {\n\t path += ' L{' + i + '},{' + (i + 1) + '}';\n\t }\n\t var pathValues = [from.x, from.y];\n\t for (i = 0, len = to.length; i < len; i++) {\n\t pathValues.push(to[i].x);\n\t pathValues.push(to[i].y);\n\t }\n\t\n\t var line = chart.paper.path(path, pathValues);\n\t line.attr({\n\t stroke: chart.options['line-color'],\n\t 'stroke-width': chart.options['line-width'],\n\t 'arrow-end': chart.options['arrow-end']\n\t });\n\t\n\t var font = chart.options.font;\n\t var fontF = chart.options['font-family'];\n\t var fontW = chart.options['font-weight'];\n\t\n\t if (font) line.attr({ 'font': font });\n\t if (fontF) line.attr({ 'font-family': fontF });\n\t if (fontW) line.attr({ 'font-weight': fontW });\n\t\n\t if (text) {\n\t\n\t var centerText = false;\n\t\n\t var textPath = chart.paper.text(0, 0, text);\n\t var textAnchor = 'start';\n\t\n\t var isHorizontal = false;\n\t var firstTo = to[0];\n\t\n\t if (from.y === firstTo.y) {\n\t isHorizontal = true;\n\t }\n\t\n\t var x = 0,\n\t y = 0;\n\t\n\t if (centerText) {\n\t if (from.x > firstTo.x) {\n\t x = from.x - (from.x - firstTo.x)/2;\n\t } else {\n\t x = firstTo.x - (firstTo.x - from.x)/2;\n\t }\n\t\n\t if (from.y > firstTo.y) {\n\t y = from.y - (from.y - firstTo.y)/2;\n\t } else {\n\t y = firstTo.y - (firstTo.y - from.y)/2;\n\t }\n\t\n\t if (isHorizontal) {\n\t x -= textPath.getBBox().width/2;\n\t y -= chart.options['text-margin'];\n\t } else {\n\t x += chart.options['text-margin'];\n\t y -= textPath.getBBox().height/2;\n\t }\n\t } else {\n\t x = from.x;\n\t y = from.y;\n\t\n\t if (isHorizontal) {\n\t if (from.x > firstTo.x) {\n\t x -= chart.options['text-margin']/2;\n\t textAnchor = 'end';\n\t } else {\n\t x += chart.options['text-margin']/2;\n\t }\n\t y -= chart.options['text-margin'];\n\t } else {\n\t x += chart.options['text-margin']/2;\n\t y += chart.options['text-margin'];\n\t if (from.y > firstTo.y) {\n\t y -= chart.options['text-margin']*2;\n\t }\n\t }\n\t }\n\t\n\t textPath.attr({\n\t 'text-anchor': textAnchor,\n\t 'font-size': chart.options['font-size'],\n\t 'fill': chart.options['font-color'],\n\t x: x,\n\t y: y\n\t });\n\t\n\t if (font) textPath.attr({ 'font': font });\n\t if (fontF) textPath.attr({ 'font-family': fontF });\n\t if (fontW) textPath.attr({ 'font-weight': fontW });\n\t }\n\t\n\t return line;\n\t}\n\t\n\tfunction checkLineIntersection(line1StartX, line1StartY, line1EndX, line1EndY, line2StartX, line2StartY, line2EndX, line2EndY) {\n\t // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\n\t var denominator, a, b, numerator1, numerator2, result = {\n\t x: null,\n\t y: null,\n\t onLine1: false,\n\t onLine2: false\n\t };\n\t denominator = ((line2EndY - line2StartY) * (line1EndX - line1StartX)) - ((line2EndX - line2StartX) * (line1EndY - line1StartY));\n\t if (denominator === 0) {\n\t return result;\n\t }\n\t a = line1StartY - line2StartY;\n\t b = line1StartX - line2StartX;\n\t numerator1 = ((line2EndX - line2StartX) * a) - ((line2EndY - line2StartY) * b);\n\t numerator2 = ((line1EndX - line1StartX) * a) - ((line1EndY - line1StartY) * b);\n\t a = numerator1 / denominator;\n\t b = numerator2 / denominator;\n\t\n\t // if we cast these lines infinitely in both directions, they intersect here:\n\t result.x = line1StartX + (a * (line1EndX - line1StartX));\n\t result.y = line1StartY + (a * (line1EndY - line1StartY));\n\t /*\n\t // it is worth noting that this should be the same as:\n\t x = line2StartX + (b * (line2EndX - line2StartX));\n\t y = line2StartX + (b * (line2EndY - line2StartY));\n\t */\n\t // if line1 is a segment and line2 is infinite, they intersect if:\n\t if (a > 0 && a < 1) {\n\t result.onLine1 = true;\n\t }\n\t // if line2 is a segment and line1 is infinite, they intersect if:\n\t if (b > 0 && b < 1) {\n\t result.onLine2 = true;\n\t }\n\t // if line1 and line2 are segments, they intersect if both of the above are true\n\t return result;\n\t}\n\t\n\tmodule.exports = {\n\t\tdrawPath: drawPath,\n\t\tdrawLine: drawLine,\n\t\tcheckLineIntersection: checkLineIntersection\n\t};\n\n\n/***/ }),\n/* 4 */\n/*!********************************!*\\\n !*** ./src/flowchart.parse.js ***!\n \\********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar FlowChart = __webpack_require__(/*! ./flowchart.chart */ 7);\n\tvar Start = __webpack_require__(/*! ./flowchart.symbol.start */ 15);\n\tvar End = __webpack_require__(/*! ./flowchart.symbol.end */ 10);\n\tvar Operation = __webpack_require__(/*! ./flowchart.symbol.operation */ 13);\n\tvar InputOutput = __webpack_require__(/*! ./flowchart.symbol.inputoutput */ 12);\n\tvar Input = __webpack_require__(/*! ./flowchart.symbol.input */ 11); //tds\n\tvar Output = __webpack_require__(/*! ./flowchart.symbol.output */ 14); //tds\n\tvar Subroutine = __webpack_require__(/*! ./flowchart.symbol.subroutine */ 16);\n\tvar Condition = __webpack_require__(/*! ./flowchart.symbol.condition */ 5);\n\tvar Parallel = __webpack_require__(/*! ./flowchart.symbol.parallel */ 6);\n\t\n\t\n\tfunction parse(input) {\n\t input = input || '';\n\t input = input.trim();\n\t\n\t var chart = {\n\t symbols: {},\n\t start: null,\n\t drawSVG: function(container, options) {\n\t var self = this;\n\t\n\t if (this.diagram) {\n\t this.diagram.clean();\n\t }\n\t\n\t var diagram = new FlowChart(container, options);\n\t this.diagram = diagram;\n\t var dispSymbols = {};\n\t\n\t function getDisplaySymbol(s) {\n\t if (dispSymbols[s.key]) {\n\t return dispSymbols[s.key];\n\t }\n\t\n\t switch (s.symbolType) {\n\t case 'start':\n\t dispSymbols[s.key] = new Start(diagram, s);\n\t break;\n\t case 'end':\n\t dispSymbols[s.key] = new End(diagram, s);\n\t break;\n\t case 'operation':\n\t dispSymbols[s.key] = new Operation(diagram, s);\n\t break;\n\t case 'inputoutput':\n\t dispSymbols[s.key] = new InputOutput(diagram, s);\n\t break;\n\t case 'input':\n\t dispSymbols[s.key] = new Input(diagram, s); //tds\n\t break; \n\t case 'output':\n\t dispSymbols[s.key] = new Output(diagram, s); //tds\n\t break; \n\t case 'subroutine':\n\t dispSymbols[s.key] = new Subroutine(diagram, s);\n\t break;\n\t case 'condition':\n\t dispSymbols[s.key] = new Condition(diagram, s);\n\t break;\n\t case 'parallel':\n\t dispSymbols[s.key] = new Parallel(diagram, s);\n\t break;\n\t default:\n\t return new Error('Wrong symbol type!');\n\t }\n\t\n\t return dispSymbols[s.key];\n\t }\n\t\n\t (function constructChart(s, prevDisp, prev) {\n\t var dispSymb = getDisplaySymbol(s);\n\t\n\t if (self.start === s) {\n\t diagram.startWith(dispSymb);\n\t } else if (prevDisp && prev && !prevDisp.pathOk) {\n\t if (prevDisp instanceof(Condition)) {\n\t if (prev.yes === s) {\n\t prevDisp.yes(dispSymb);\n\t }\n\t if (prev.no === s) {\n\t prevDisp.no(dispSymb);\n\t }\n\t } else if (prevDisp instanceof(Parallel)) {\n\t if (prev.path1 === s) {\n\t prevDisp.path1(dispSymb);\n\t }\n\t if (prev.path2 === s) {\n\t prevDisp.path2(dispSymb);\n\t }\n\t if (prev.path3 === s) {\n\t prevDisp.path3(dispSymb);\n\t }\n\t } else {\n\t prevDisp.then(dispSymb);\n\t }\n\t }\n\t\n\t if (dispSymb.pathOk) {\n\t return dispSymb;\n\t }\n\t\n\t if (dispSymb instanceof(Condition)) {\n\t if (s.yes) {\n\t constructChart(s.yes, dispSymb, s);\n\t }\n\t if (s.no) {\n\t constructChart(s.no, dispSymb, s);\n\t }\n\t } else if (dispSymb instanceof(Parallel)) {\n\t if (s.path1) {\n\t constructChart(s.path1, dispSymb, s);\n\t }\n\t if (s.path2) {\n\t constructChart(s.path2, dispSymb, s);\n\t }\n\t if (s.path3) {\n\t constructChart(s.path3, dispSymb, s);\n\t }\n\t } else if (s.next) {\n\t constructChart(s.next, dispSymb, s);\n\t }\n\t\n\t return dispSymb;\n\t })(this.start);\n\t\n\t diagram.render();\n\t },\n\t clean: function() {\n\t this.diagram.clean();\n\t },\n\t options: function() {\n\t return this.diagram.options;\n\t }\n\t };\n\t\n\t var lines = [];\n\t var prevBreak = 0;\n\t for (var i0 = 1, i0len = input.length; i0 < i0len; i0++) {\n\t if(input[i0] === '\\n' && input[i0 - 1] !== '\\\\') {\n\t var line0 = input.substring(prevBreak, i0);\n\t prevBreak = i0 + 1;\n\t lines.push(line0.replace(/\\\\\\n/g, '\\n'));\n\t }\n\t }\n\t\n\t if (prevBreak < input.length) {\n\t lines.push(input.substr(prevBreak));\n\t }\n\t\n\t for (var l = 1, len = lines.length; l < len;) {\n\t var currentLine = lines[l];\n\t\n\t if (currentLine.indexOf('->') < 0 && currentLine.indexOf('=>') < 0 && currentLine.indexOf('@>') < 0) {\n\t lines[l - 1] += '\\n' + currentLine;\n\t lines.splice(l, 1);\n\t len--;\n\t } else {\n\t l++;\n\t }\n\t }\n\t\n\t function getStyle(s){\n\t var startIndex = s.indexOf('(') + 1;\n\t var endIndex = s.indexOf(')');\n\t if (startIndex >= 0 && endIndex >= 0) {\n\t return s.substring(startIndex,endIndex);\n\t }\n\t return '{}';\n\t }\n\t\n\t function getSymbValue(s){\n\t var startIndex = s.indexOf('(') + 1;\n\t var endIndex = s.indexOf(')');\n\t if (startIndex >= 0 && endIndex >= 0) {\n\t return s.substring(startIndex,endIndex);\n\t }\n\t return '';\n\t }\n\t\n\t function getSymbol(s) {\n\t var startIndex = s.indexOf('(') + 1;\n\t var endIndex = s.indexOf(')');\n\t if (startIndex >= 0 && endIndex >= 0) {\n\t return chart.symbols[s.substring(0, startIndex - 1)];\n\t }\n\t return chart.symbols[s];\n\t }\n\t\n\t function getNextPath(s) {\n\t var next = 'next';\n\t var startIndex = s.indexOf('(') + 1;\n\t var endIndex = s.indexOf(')');\n\t if (startIndex >= 0 && endIndex >= 0) {\n\t next = flowSymb.substring(startIndex, endIndex);\n\t if (next.indexOf(',') < 0) {\n\t if (next !== 'yes' && next !== 'no') {\n\t next = 'next, ' + next;\n\t }\n\t }\n\t }\n\t return next;\n\t }\n\t \n\t function getAnnotation(s) {\n\t\tvar startIndex = s.indexOf(\"(\") + 1, endIndex = s.indexOf(\")\");\n\t\tvar tmp = s.substring(startIndex, endIndex);\n\t\tif(tmp.indexOf(\",\") > 0) { tmp = tmp.substring(0, tmp.indexOf(\",\")); }\n\t\tvar tmp_split = tmp.split(\"@\");\n\t\tif(tmp_split.length > 1)\n\t\t\treturn startIndex >= 0 && endIndex >= 0 ? tmp_split[1] : \"\";\n\t }\n\t\n\t while (lines.length > 0) {\n\t var line = lines.splice(0, 1)[0].trim();\n\t\n\t if (line.indexOf('=>') >= 0) {\n\t // definition\n\t var parts = line.split('=>');\n\t var symbol = {\n\t key: parts[0].replace(/\\(.*\\)/, ''),\n\t symbolType: parts[1],\n\t text: null,\n\t link: null,\n\t target: null,\n\t flowstate: null,\n\t function: null,\n\t lineStyle: {},\n\t params: {}\n\t };\n\t\n\t //parse parameters\n\t var params = parts[0].match(/\\((.*)\\)/);\n\t if (params && params.length > 1){\n\t var entries = params[1].split(',');\n\t for(var i = 0; i < entries.length; i++) {\n\t var entry = entries[i].split('=');\n\t if (entry.length == 2) {\n\t symbol.params[entry[0]] = entry[1];\n\t }\n\t }\n\t }\n\t\n\t var sub;\n\t\n\t if (symbol.symbolType.indexOf(': ') >= 0) {\n\t sub = symbol.symbolType.split(': ');\n\t symbol.symbolType = sub.shift();\n\t symbol.text = sub.join(': ');\n\t }\n\t\n\t if (symbol.text && symbol.text.indexOf(':$') >= 0) {\n\t sub = symbol.text.split(':$');\n\t symbol.text = sub.shift();\n\t symbol.function = sub.join(':$');\n\t } else if (symbol.symbolType.indexOf(':$') >= 0) {\n\t sub = symbol.symbolType.split(':$');\n\t symbol.symbolType = sub.shift();\n\t symbol.function = sub.join(':$');\n\t } else if (symbol.text && symbol.text.indexOf(':>') >= 0) {\n\t sub = symbol.text.split(':>');\n\t symbol.text = sub.shift();\n\t symbol.link = sub.join(':>');\n\t } else if (symbol.symbolType.indexOf(':>') >= 0) {\n\t sub = symbol.symbolType.split(':>');\n\t symbol.symbolType = sub.shift();\n\t symbol.link = sub.join(':>');\n\t }\n\t\n\t if (symbol.symbolType.indexOf('\\n') >= 0) {\n\t symbol.symbolType = symbol.symbolType.split('\\n')[0];\n\t }\n\t\n\t /* adding support for links */\n\t if (symbol.link) {\n\t var startIndex = symbol.link.indexOf('[') + 1;\n\t var endIndex = symbol.link.indexOf(']');\n\t if (startIndex >= 0 && endIndex >= 0) {\n\t symbol.target = symbol.link.substring(startIndex, endIndex);\n\t symbol.link = symbol.link.substring(0, startIndex - 1);\n\t }\n\t }\n\t /* end of link support */\n\t\n\t /* adding support for flowstates */\n\t if (symbol.text) {\n\t if (symbol.text.indexOf('|') >= 0) {\n\t var txtAndState = symbol.text.split('|');\n\t symbol.flowstate = txtAndState.pop().trim();\n\t symbol.text = txtAndState.join('|');\n\t }\n\t }\n\t /* end of flowstate support */\n\t\n\t chart.symbols[symbol.key] = symbol;\n\t\n\t } else if (line.indexOf('->') >= 0) {\n\t var ann = getAnnotation(line);\n\t if (ann) {\n\t line = line.replace('@' + ann, ''); \n\t }\n\t // flow\n\t var flowSymbols = line.split('->');\n\t for (var iS = 0, lenS = flowSymbols.length; iS < lenS; iS++) {\n\t var flowSymb = flowSymbols[iS];\n\t var symbVal = getSymbValue(flowSymb);\n\t\n\t if (symbVal === 'true' || symbVal === 'false') {\n\t // map true or false to yes or no respectively\n\t flowSymb = flowSymb.replace('true', 'yes');\n\t flowSymb = flowSymb.replace('false', 'no');\n\t }\n\t \n\t var next = getNextPath(flowSymb);\n\t var realSymb = getSymbol(flowSymb);\n\t\n\t var direction = null;\n\t if (next.indexOf(',') >= 0) {\n\t var condOpt = next.split(',');\n\t next = condOpt[0];\n\t direction = condOpt[1].trim();\n\t }\n\t\n\t if (ann) {\n\t if (realSymb.symbolType === 'condition') {\n\t if (next === \"yes\" || next === \"true\") {\n\t realSymb.yes_annotation = ann;\n\t } else {\n\t realSymb.no_annotation = ann;\n\t }\n\t } else if (realSymb.symbolType === 'parallel') {\n\t if (next === 'path1') {\n\t realSymb.path1_annotation = ann;\n\t } else if (next === 'path2') {\n\t realSymb.path2_annotation = ann;\n\t } else if (next === 'path3') {\n\t realSymb.path3_annotation = ann;\n\t }\n\t }\n\t ann = null;\n\t }\n\t\n\t if (!chart.start) {\n\t chart.start = realSymb;\n\t }\n\t\n\t if (iS + 1 < lenS) {\n\t var nextSymb = flowSymbols[iS + 1];\n\t realSymb[next] = getSymbol(nextSymb);\n\t realSymb['direction_' + next] = direction;\n\t direction = null;\n\t }\n\t }\n\t } else if (line.indexOf('@>') >= 0) {\n\t\n\t // line style\n\t var lineStyleSymbols = line.split('@>');\n\t for (var iSS = 0, lenSS = lineStyleSymbols.length; iSS < lenSS; iSS++) {\n\t if ((iSS + 1) !== lenSS) {\n\t var curSymb = getSymbol(lineStyleSymbols[iSS]);\n\t var nextSymbol = getSymbol(lineStyleSymbols[iSS+1]);\n\t\n\t curSymb['lineStyle'][nextSymbol.key] = JSON.parse(getStyle(lineStyleSymbols[iSS + 1]));\n\t }\n\t }\n\t }\n\t\n\t }\n\t return chart;\n\t}\n\t\n\tmodule.exports = parse;\n\n\n/***/ }),\n/* 5 */\n/*!*******************************************!*\\\n !*** ./src/flowchart.symbol.condition.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\tvar drawAPI = __webpack_require__(/*! ./flowchart.functions */ 3);\n\tvar drawPath = drawAPI.drawPath;\n\t\n\tfunction Condition(chart, options) {\n\t options = options || {};\n\t Symbol.call(this, chart, options);\n\t this.yes_annotation = options.yes_annotation;\n\t this.no_annotation = options.no_annotation;\n\t this.textMargin = this.getAttr('text-margin');\n\t this.yes_direction = options.direction_yes;\n\t this.no_direction = options.direction_no;\n\t if (!this.no_direction && this.yes_direction === 'right') {\n\t this.no_direction = 'bottom';\n\t } else if (!this.yes_direction && this.no_direction === 'bottom') {\n\t this.yes_direction = 'right'\n\t }\n\t this.yes_direction = this.yes_direction || 'bottom';\n\t this.no_direction = this.no_direction || 'right';\n\t\n\t this.text.attr({\n\t x: this.textMargin * 2\n\t });\n\t\n\t var width = this.text.getBBox().width + 3 * this.textMargin;\n\t width += width/2;\n\t var height = this.text.getBBox().height + 2 * this.textMargin;\n\t height += height/2;\n\t height = Math.max(width * 0.5, height);\n\t var startX = width/4;\n\t var startY = height/4;\n\t\n\t this.text.attr({\n\t x: startX + this.textMargin/2\n\t });\n\t\n\t var start = {x: startX, y: startY};\n\t var points = [\n\t {x: startX - width/4, y: startY + height/4},\n\t {x: startX - width/4 + width/2, y: startY + height/4 + height/2},\n\t {x: startX - width/4 + width, y: startY + height/4},\n\t {x: startX - width/4 + width/2, y: startY + height/4 - height/2},\n\t {x: startX - width/4, y: startY + height/4}\n\t ];\n\t\n\t var symbol = drawPath(chart, start, points);\n\t\n\t symbol.attr({\n\t stroke: this.getAttr('element-color'),\n\t 'stroke-width': this.getAttr('line-width'),\n\t fill: this.getAttr('fill')\n\t });\n\t if (options.link) { symbol.attr('href', options.link); }\n\t if (options.target) { symbol.attr('target', options.target); }\n\t if (options.key) { symbol.node.id = options.key; }\n\t symbol.node.setAttribute('class', this.getAttr('class'));\n\t\n\t this.text.attr({\n\t y: symbol.getBBox().height/2\n\t });\n\t\n\t this.group.push(symbol);\n\t symbol.insertBefore(this.text);\n\t this.symbol = symbol\n\t\n\t this.initialize();\n\t}\n\tinherits(Condition, Symbol);\n\t\n\tCondition.prototype.render = function() {\n\t var self = this;\n\t if (this.yes_direction) {\n\t this[this.yes_direction + '_symbol'] = this.yes_symbol;\n\t }\n\t\n\t if (this.no_direction) {\n\t this[this.no_direction + '_symbol'] = this.no_symbol;\n\t }\n\t\n\t var lineLength = this.getAttr('line-length');\n\t\n\t if (this.bottom_symbol) {\n\t var bottomPoint = this.getBottom();\n\t\n\t if (!this.bottom_symbol.isPositioned) {\n\t this.bottom_symbol.shiftY(this.getY() + this.height + lineLength);\n\t this.bottom_symbol.setX(bottomPoint.x - this.bottom_symbol.width/2);\n\t this.bottom_symbol.isPositioned = true;\n\t\n\t this.bottom_symbol.render();\n\t }\n\t }\n\t\n\t if (this.right_symbol) {\n\t var rightPoint = this.getRight();\n\t\n\t if (!this.right_symbol.isPositioned) {\n\t\n\t this.right_symbol.setY(rightPoint.y - this.right_symbol.height/2);\n\t this.right_symbol.shiftX(this.group.getBBox().x + this.width + lineLength);\n\t\n\t (function shift() {\n\t var hasSymbolUnder = false;\n\t var symb;\n\t for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n\t symb = self.chart.symbols[i];\n\t\n\t if (!self.params['align-next'] || self.params['align-next'] !== 'no') { \n\t var diff = Math.abs(symb.getCenter().x - self.right_symbol.getCenter().x);\n\t if (symb.getCenter().y > self.right_symbol.getCenter().y && diff <= self.right_symbol.width/2) {\n\t hasSymbolUnder = true;\n\t break;\n\t }\n\t }\n\t }\n\t\n\t if (hasSymbolUnder) {\n\t if (self.right_symbol.symbolType === 'end') return;\n\t self.right_symbol.setX(symb.getX() + symb.width + lineLength);\n\t shift();\n\t }\n\t })();\n\t\n\t this.right_symbol.isPositioned = true;\n\t\n\t this.right_symbol.render();\n\t }\n\t }\n\t \n\t if (this.left_symbol) {\n\t var leftPoint = this.getLeft();\n\t \n\t if (!this.left_symbol.isPositioned) {\n\t this.left_symbol.setY(leftPoint.y - this.left_symbol.height / 2);\n\t this.left_symbol.shiftX(-(this.group.getBBox().x + this.width + lineLength));\n\t\n\t (function shift() {\n\t var hasSymbolUnder = false;\n\t var symb;\n\t for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n\t symb = self.chart.symbols[i];\n\t \n\t if (!self.params['align-next'] || self.params['align-next'] !== 'no') {\n\t var diff = Math.abs(symb.getCenter().x - self.left_symbol.getCenter().x);\n\t if (symb.getCenter().y > self.left_symbol.getCenter().y && diff <= self.left_symbol.width / 2) {\n\t hasSymbolUnder = true;\n\t break;\n\t }\n\t }\n\t }\n\t \n\t if (hasSymbolUnder) {\n\t if (self.left_symbol.symbolType === 'end') return;\n\t self.left_symbol.setX(symb.getX() + symb.width + lineLength);\n\t shift();\n\t }\n\t })();\n\t \n\t this.left_symbol.isPositioned = true;\n\t \n\t this.left_symbol.render();\n\t }\n\t }\n\t};\n\t\n\tCondition.prototype.renderLines = function() {\n\t if (this.yes_symbol) {\n\t this.drawLineTo(this.yes_symbol, this.yes_annotation ? this.yes_annotation : this.getAttr('yes-text'), this.yes_direction);\n\t }\n\t\n\t if (this.no_symbol) {\n\t this.drawLineTo(this.no_symbol, this.no_annotation ? this.no_annotation : this.getAttr('no-text'), this.no_direction);\n\t }\n\t};\n\t\n\tmodule.exports = Condition;\n\n\n/***/ }),\n/* 6 */\n/*!******************************************!*\\\n !*** ./src/flowchart.symbol.parallel.js ***!\n \\******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\t\n\tfunction Parallel(chart, options) {\n\t var symbol = chart.paper.rect(0, 0, 0, 0);\n\t options = options || {};\n\t Symbol.call(this, chart, options, symbol);\n\t this.path1_annotation = options.path1_annotation || '';\n\t this.path2_annotation = options.path2_annotation || '';\n\t this.path3_annotation = options.path3_annotation || '';\n\t this.textMargin = this.getAttr('text-margin');\n\t this.path1_direction = 'bottom';\n\t this.path2_direction = 'right';\n\t this.path3_direction = 'top';\n\t this.params = options.params;\n\t if (options.direction_next === 'path1' && !options[options.direction_next] && options.next) {\n\t options[options.direction_next] = options.next;\n\t }\n\t if (options.direction_next === 'path2' && !options[options.direction_next] && options.next) {\n\t options[options.direction_next] = options.next;\n\t }\n\t if (options.direction_next === 'path3' && !options[options.direction_next] && options.next) {\n\t options[options.direction_next] = options.next;\n\t }\n\t\n\t if (options.path1 && options.direction_path1 && options.path2 && !options.direction_path2 && options.path3 && !options.direction_path3) {\n\t if (options.direction_path1 === 'right') {\n\t this.path2_direction = 'bottom';\n\t this.path1_direction = 'right';\n\t this.path3_direction = 'top';\n\t } else if (options.direction_path1 === 'top') {\n\t this.path2_direction = 'right';\n\t this.path1_direction = 'top';\n\t this.path3_direction = 'bottom';\n\t } else if (options.direction_path1 === 'left') {\n\t this.path2_direction = 'right';\n\t this.path1_direction = 'left';\n\t this.path3_direction = 'bottom';\n\t } else {\n\t this.path2_direction = 'right';\n\t this.path1_direction = 'bottom';\n\t this.path3_direction = 'top';\n\t }\n\t } else if (options.path1 && !options.direction_path1 && options.path2 && options.direction_path2 && options.path3 && !options.direction_path3) {\n\t if (options.direction_path2 === 'right') {\n\t this.path1_direction = 'bottom';\n\t this.path2_direction = 'right';\n\t this.path3_direction = 'top';\n\t } else if (options.direction_path2 === 'left') {\n\t this.path1_direction = 'bottom';\n\t this.path2_direction = 'left';\n\t this.path3_direction = 'right';\n\t } else {\n\t this.path1_direction = 'right';\n\t this.path2_direction = 'bottom';\n\t this.path3_direction = 'top';\n\t }\n\t } else if (options.path1 && !options.direction_path1 && options.path2 && !options.direction_path2 && options.path3 && options.direction_path3) {\n\t if (options.direction_path2 === 'right') {\n\t this.path1_direction = 'bottom';\n\t this.path2_direction = 'top';\n\t this.path3_direction = 'right';\n\t } else if (options.direction_path2 === 'left') {\n\t this.path1_direction = 'bottom';\n\t this.path2_direction = 'right';\n\t this.path3_direction = 'left';\n\t } else {\n\t this.path1_direction = 'right';\n\t this.path2_direction = 'bottom';\n\t this.path3_direction = 'top';\n\t }\n\t } else {\n\t this.path1_direction = options.direction_path1;\n\t this.path2_direction = options.direction_path2;\n\t this.path3_direction = options.direction_path3;\n\t }\n\t\n\t this.path1_direction = this.path1_direction || 'bottom';\n\t this.path2_direction = this.path2_direction || 'right';\n\t this.path3_direction = this.path3_direction || 'top';\n\t\n\t this.initialize();\n\t}\n\tinherits(Parallel, Symbol);\n\t\n\tParallel.prototype.render = function() {\n\t if (this.path1_direction) {\n\t this[this.path1_direction + '_symbol'] = this.path1_symbol;\n\t }\n\t\n\t if (this.path2_direction) {\n\t this[this.path2_direction + '_symbol'] = this.path2_symbol;\n\t }\n\t\n\t if (this.path3_direction) {\n\t this[this.path3_direction + '_symbol'] = this.path3_symbol;\n\t }\n\t\n\t var lineLength = this.getAttr('line-length');\n\t\n\t if (this.bottom_symbol) {\n\t var bottomPoint = this.getBottom();\n\t\n\t if (!this.bottom_symbol.isPositioned) {\n\t this.bottom_symbol.shiftY(this.getY() + this.height + lineLength);\n\t this.bottom_symbol.setX(bottomPoint.x - this.bottom_symbol.width / 2);\n\t this.bottom_symbol.isPositioned = true;\n\t\n\t this.bottom_symbol.render();\n\t }\n\t }\n\t\n\t if (this.top_symbol) {\n\t var topPoint = this.getTop();\n\t\n\t if (!this.top_symbol.isPositioned) {\n\t this.top_symbol.shiftY(this.getY() - this.top_symbol.height - lineLength);\n\t this.top_symbol.setX(topPoint.x + this.top_symbol.width);\n\t this.top_symbol.isPositioned = true;\n\t\n\t this.top_symbol.render();\n\t }\n\t }\n\t\n\t var self = this;\n\t\n\t if (this.left_symbol) {\n\t var leftPoint = this.getLeft();\n\t\n\t if (!this.left_symbol.isPositioned) {\n\t this.left_symbol.setY(leftPoint.y - this.left_symbol.height / 2);\n\t this.left_symbol.shiftX(-(this.group.getBBox().x + this.width + lineLength));\n\t (function shift() {\n\t var hasSymbolUnder = false;\n\t var symb;\n\t for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n\t symb = self.chart.symbols[i];\n\t\n\t if (!self.params['align-next'] || self.params['align-next'] !== 'no') {\n\t var diff = Math.abs(symb.getCenter().x - self.left_symbol.getCenter().x);\n\t if (symb.getCenter().y > self.left_symbol.getCenter().y && diff <= self.left_symbol.width / 2) {\n\t hasSymbolUnder = true;\n\t break;\n\t }\n\t }\n\t }\n\t\n\t if (hasSymbolUnder) {\n\t if (self.left_symbol.symbolType === 'end') return;\n\t self.left_symbol.setX(symb.getX() + symb.width + lineLength);\n\t shift();\n\t }\n\t })();\n\t\n\t this.left_symbol.isPositioned = true;\n\t\n\t this.left_symbol.render();\n\t }\n\t }\n\t\n\t if (this.right_symbol) {\n\t var rightPoint = this.getRight();\n\t\n\t if (!this.right_symbol.isPositioned) {\n\t this.right_symbol.setY(rightPoint.y - this.right_symbol.height / 2);\n\t this.right_symbol.shiftX(this.group.getBBox().x + this.width + lineLength);\n\t (function shift() {\n\t var hasSymbolUnder = false;\n\t var symb;\n\t for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n\t symb = self.chart.symbols[i];\n\t\n\t if (!self.params['align-next'] || self.params['align-next'] !== 'no') {\n\t var diff = Math.abs(symb.getCenter().x - self.right_symbol.getCenter().x);\n\t if (symb.getCenter().y > self.right_symbol.getCenter().y && diff <= self.right_symbol.width / 2) {\n\t hasSymbolUnder = true;\n\t break;\n\t }\n\t }\n\t }\n\t\n\t if (hasSymbolUnder) {\n\t if (self.right_symbol.symbolType === 'end') return;\n\t self.right_symbol.setX(symb.getX() + symb.width + lineLength);\n\t shift();\n\t }\n\t })();\n\t\n\t this.right_symbol.isPositioned = true;\n\t\n\t this.right_symbol.render();\n\t }\n\t }\n\t};\n\t\n\tParallel.prototype.renderLines = function() {\n\t if (this.path1_symbol) {\n\t this.drawLineTo(this.path1_symbol, this.path1_annotation, this.path1_direction);\n\t }\n\t\n\t if (this.path2_symbol) {\n\t this.drawLineTo(this.path2_symbol, this.path2_annotation, this.path2_direction);\n\t }\n\t\n\t if (this.path3_symbol) {\n\t this.drawLineTo(this.path3_symbol, this.path3_annotation, this.path3_direction);\n\t }\n\t};\n\t\n\tmodule.exports = Parallel;\n\n/***/ }),\n/* 7 */\n/*!********************************!*\\\n !*** ./src/flowchart.chart.js ***!\n \\********************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Raphael = __webpack_require__(/*! raphael */ 18);\n\tvar defaults = __webpack_require__(/*! ./flowchart.helpers */ 1).defaults;\n\tvar defaultOptions = __webpack_require__(/*! ./flowchart.defaults */ 8);\n\tvar Condition = __webpack_require__(/*! ./flowchart.symbol.condition */ 5);\n\tvar Parallel = __webpack_require__(/*! ./flowchart.symbol.parallel */ 6);\n\t\n\tfunction FlowChart(container, options) {\n\t options = options || {};\n\t\n\t this.paper = new Raphael(container);\n\t\n\t this.options = defaults(options, defaultOptions);\n\t\n\t this.symbols = [];\n\t this.lines = [];\n\t this.start = null;\n\t}\n\t\n\tFlowChart.prototype.handle = function(symbol) {\n\t if (this.symbols.indexOf(symbol) <= -1) {\n\t this.symbols.push(symbol);\n\t }\n\t\n\t var flowChart = this;\n\t\n\t if (symbol instanceof(Condition)) {\n\t symbol.yes = function(nextSymbol) {\n\t symbol.yes_symbol = nextSymbol;\n\t if(symbol.no_symbol) {\n\t symbol.pathOk = true;\n\t }\n\t return flowChart.handle(nextSymbol);\n\t };\n\t symbol.no = function(nextSymbol) {\n\t symbol.no_symbol = nextSymbol;\n\t if (symbol.yes_symbol) {\n\t symbol.pathOk = true;\n\t }\n\t return flowChart.handle(nextSymbol);\n\t };\n\t } else if (symbol instanceof(Parallel)) {\n\t symbol.path1 = function(nextSymbol) {\n\t symbol.path1_symbol = nextSymbol;\n\t if (symbol.path2_symbol) {\n\t symbol.pathOk = true;\n\t }\n\t return flowChart.handle(nextSymbol);\n\t };\n\t symbol.path2 = function(nextSymbol) {\n\t symbol.path2_symbol = nextSymbol;\n\t if (symbol.path3_symbol) {\n\t symbol.pathOk = true;\n\t }\n\t return flowChart.handle(nextSymbol);\n\t };\n\t symbol.path3 = function(nextSymbol) {\n\t symbol.path3_symbol = nextSymbol;\n\t if (symbol.path1_symbol) {\n\t symbol.pathOk = true;\n\t }\n\t return flowChart.handle(nextSymbol);\n\t };\n\t } else {\n\t symbol.then = function(nextSymbol) {\n\t symbol.next = nextSymbol;\n\t symbol.pathOk = true;\n\t return flowChart.handle(nextSymbol);\n\t };\n\t }\n\t\n\t return symbol;\n\t};\n\t\n\tFlowChart.prototype.startWith = function(symbol) {\n\t this.start = symbol;\n\t return this.handle(symbol);\n\t};\n\t\n\tFlowChart.prototype.render = function() {\n\t var maxWidth = 0,\n\t maxHeight = 0,\n\t i = 0,\n\t len = 0,\n\t maxX = 0,\n\t maxY = 0,\n\t minX = 0,\n\t minY = 0,\n\t symbol,\n\t line;\n\t\n\t for (i = 0, len = this.symbols.length; i < len; i++) {\n\t symbol = this.symbols[i];\n\t if (symbol.width > maxWidth) {\n\t maxWidth = symbol.width;\n\t }\n\t if (symbol.height > maxHeight) {\n\t maxHeight = symbol.height;\n\t }\n\t }\n\t\n\t for (i = 0, len = this.symbols.length; i < len; i++) {\n\t symbol = this.symbols[i];\n\t symbol.shiftX(this.options.x + (maxWidth - symbol.width)/2 + this.options['line-width']);\n\t symbol.shiftY(this.options.y + (maxHeight - symbol.height)/2 + this.options['line-width']);\n\t }\n\t\n\t this.start.render();\n\t // for (i = 0, len = this.symbols.length; i < len; i++) {\n\t // symbol = this.symbols[i];\n\t // symbol.render();\n\t // }\n\t\n\t for (i = 0, len = this.symbols.length; i < len; i++) {\n\t symbol = this.symbols[i];\n\t symbol.renderLines();\n\t }\n\t\n\t maxX = this.maxXFromLine;\n\t\n\t var x;\n\t var y;\n\t\n\t for (i = 0, len = this.symbols.length; i < len; i++) {\n\t symbol = this.symbols[i];\n\t var leftX = symbol.getX()\n\t x = leftX + symbol.width;\n\t y = symbol.getY() + symbol.height;\n\t if (leftX < minX) {\n\t minX = leftX;\n\t }\n\t if (x > maxX) {\n\t maxX = x;\n\t }\n\t if (y > maxY) {\n\t maxY = y;\n\t }\n\t }\n\t\n\t for (i = 0, len = this.lines.length; i < len; i++) {\n\t line = this.lines[i].getBBox();\n\t x = line.x;\n\t y = line.y;\n\t var x2 = line.x2;\n\t var y2 = line.y2;\n\t if (x < minX) {\n\t minX = x;\n\t }\n\t if (y < minY) {\n\t minY = y;\n\t }\n\t if (x2 > maxX) {\n\t maxX = x2;\n\t }\n\t if (y2 > maxY) {\n\t maxY = y2;\n\t }\n\t }\n\t\n\t var scale = this.options['scale'];\n\t var lineWidth = this.options['line-width'];\n\t\n\t if (this.minXFromSymbols < minX) minX = this.minXFromSymbols;\n\t\n\t if (minX < 0) minX -= lineWidth;\n\t if (minY < 0) minY -= lineWidth;\n\t\n\t var width = maxX + lineWidth - minX;\n\t var height = maxY + lineWidth - minY;\n\t\n\t this.paper.setSize(width * scale, height * scale);\n\t this.paper.setViewBox(minX, minY, width, height, true);\n\t};\n\t\n\tFlowChart.prototype.clean = function() {\n\t if (this.paper) {\n\t var paperDom = this.paper.canvas;\n\t paperDom.parentNode && paperDom.parentNode.removeChild(paperDom);\n\t }\n\t};\n\t\n\tmodule.exports = FlowChart;\n\n/***/ }),\n/* 8 */\n/*!***********************************!*\\\n !*** ./src/flowchart.defaults.js ***!\n \\***********************************/\n/***/ (function(module, exports) {\n\n\t// defaults\n\tmodule.exports = {\n\t 'x': 0,\n\t 'y': 0,\n\t // 'roundness': 0,\n\t 'line-width': 3,\n\t 'line-length': 50,\n\t 'text-margin': 10,\n\t 'font-size': 14,\n\t 'font-color': 'black',\n\t // 'font': 'normal',\n\t // 'font-family': 'calibri',\n\t // 'font-weight': 'normal',\n\t 'line-color': 'black',\n\t 'element-color': 'black',\n\t 'fill': 'white',\n\t 'yes-text': 'yes',\n\t 'no-text': 'no',\n\t 'arrow-end': 'block',\n\t 'class': 'flowchart',\n\t 'scale': 1,\n\t 'symbols': {\n\t 'start': {},\n\t 'end': {},\n\t 'condition': {},\n\t 'inputoutput': {},\n\t 'input': {}, //tds\n\t 'output': {}, //tds \n\t 'operation': {},\n\t 'subroutine': {},\n\t 'parallel': {}\n\t } //,\n\t // 'flowstate' : {\n\t // 'past' : { 'fill': '#CCCCCC', 'font-size': 12},\n\t // 'current' : {'fill': 'yellow', 'font-color': 'red', 'font-weight': 'bold'},\n\t // 'future' : { 'fill': '#FFFF99'},\n\t // 'invalid': {'fill': '#444444'}\n\t // }\n\t};\n\n/***/ }),\n/* 9 */\n/*!*******************************!*\\\n !*** ./src/flowchart.shim.js ***!\n \\*******************************/\n/***/ (function(module, exports) {\n\n\t// add indexOf to non ECMA-262 standard compliant browsers\n\tif (!Array.prototype.indexOf) {\n\t Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\n\t \"use strict\";\n\t if (this === null) {\n\t throw new TypeError();\n\t }\n\t var t = Object(this);\n\t var len = t.length >>> 0;\n\t if (len === 0) {\n\t return -1;\n\t }\n\t var n = 0;\n\t if (arguments.length > 0) {\n\t n = Number(arguments[1]);\n\t if (n != n) { // shortcut for verifying if it's NaN\n\t n = 0;\n\t } else if (n !== 0 && n != Infinity && n != -Infinity) {\n\t n = (n > 0 || -1) * Math.floor(Math.abs(n));\n\t }\n\t }\n\t if (n >= len) {\n\t return -1;\n\t }\n\t var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n\t for (; k < len; k++) {\n\t if (k in t && t[k] === searchElement) {\n\t return k;\n\t }\n\t }\n\t return -1;\n\t };\n\t}\n\t\n\t// add lastIndexOf to non ECMA-262 standard compliant browsers\n\tif (!Array.prototype.lastIndexOf) {\n\t Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {\n\t \"use strict\";\n\t if (this === null) {\n\t throw new TypeError();\n\t }\n\t var t = Object(this);\n\t var len = t.length >>> 0;\n\t if (len === 0) {\n\t return -1;\n\t }\n\t var n = len;\n\t if (arguments.length > 1) {\n\t n = Number(arguments[1]);\n\t if (n != n) {\n\t n = 0;\n\t } else if (n !== 0 && n != (1 / 0) && n != -(1 / 0)) {\n\t n = (n > 0 || -1) * Math.floor(Math.abs(n));\n\t }\n\t }\n\t var k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n);\n\t for (; k >= 0; k--) {\n\t if (k in t && t[k] === searchElement) {\n\t return k;\n\t }\n\t }\n\t return -1;\n\t };\n\t}\n\t\n\tif (!String.prototype.trim) {\n\t String.prototype.trim = function() {\n\t return this.replace(/^\\s+|\\s+$/g, '');\n\t };\n\t}\n\n/***/ }),\n/* 10 */\n/*!*************************************!*\\\n !*** ./src/flowchart.symbol.end.js ***!\n \\*************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\t\n\tfunction End(chart, options) {\n\t var symbol = chart.paper.rect(0, 0, 0, 0, 20);\n\t options = options || {};\n\t options.text = options.text || 'End';\n\t Symbol.call(this, chart, options, symbol);\n\t}\n\tinherits(End, Symbol);\n\t\n\tmodule.exports = End;\n\n\n/***/ }),\n/* 11 */\n/*!***************************************!*\\\n !*** ./src/flowchart.symbol.input.js ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\tvar drawAPI = __webpack_require__(/*! ./flowchart.functions */ 3);\n\tvar drawPath = drawAPI.drawPath;\n\t\n\tfunction Input(chart, options) {\n\t options = options || {};\n\t Symbol.call(this, chart, options);\n\t this.textMargin = this.getAttr('text-margin');\n\t\n\t this.text.attr({\n\t x: this.textMargin * 3\n\t });\n\t\n\t var width = this.text.getBBox().width + 4 * this.textMargin;\n\t var height = this.text.getBBox().height + 2 * this.textMargin;\n\t var startX = this.textMargin;\n\t var startY = height/2;\n\t\n\t var start = {x: startX, y: startY};\n\t var points = [\n\t {x: startX - this.textMargin + 2 * this.textMargin, y: height},\n\t {x: startX - this.textMargin + width, y: height},\n\t {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},\n\t {x: startX - this.textMargin, y: 0},\n\t {x: startX, y: startY}\n\t ];\n\t\n\t var symbol = drawPath(chart, start, points);\n\t\n\t symbol.attr({\n\t stroke: this.getAttr('element-color'),\n\t 'stroke-width': this.getAttr('line-width'),\n\t fill: this.getAttr('fill')\n\t });\n\t if (options.link) { symbol.attr('href', options.link); }\n\t if (options.target) { symbol.attr('target', options.target); }\n\t if (options.key) { symbol.node.id = options.key; }\n\t symbol.node.setAttribute('class', this.getAttr('class'));\n\t\n\t this.text.attr({\n\t y: symbol.getBBox().height/2\n\t });\n\t\n\t this.group.push(symbol);\n\t symbol.insertBefore(this.text);\n\t this.symbol = symbol\n\t\n\t this.initialize();\n\t}\n\tinherits(Input, Symbol);\n\t\n\tInput.prototype.getLeft = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX() + this.textMargin;\n\t return {x: x, y: y};\n\t};\n\t\n\tInput.prototype.getRight = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX() + this.group.getBBox().width - this.textMargin;\n\t return {x: x, y: y};\n\t};\n\t\n\tmodule.exports = Input;\n\t\n\t\n\n\n/***/ }),\n/* 12 */\n/*!*********************************************!*\\\n !*** ./src/flowchart.symbol.inputoutput.js ***!\n \\*********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\tvar drawAPI = __webpack_require__(/*! ./flowchart.functions */ 3);\n\tvar drawPath = drawAPI.drawPath;\n\t\n\tfunction InputOutput(chart, options) {\n\t options = options || {};\n\t Symbol.call(this, chart, options);\n\t this.textMargin = this.getAttr('text-margin');\n\t\n\t this.text.attr({\n\t x: this.textMargin * 3\n\t });\n\t\n\t var width = this.text.getBBox().width + 4 * this.textMargin;\n\t var height = this.text.getBBox().height + 2 * this.textMargin;\n\t var startX = this.textMargin;\n\t var startY = height/2;\n\t\n\t var start = {x: startX, y: startY};\n\t var points = [\n\t {x: startX - this.textMargin, y: height},\n\t {x: startX - this.textMargin + width, y: height},\n\t {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},\n\t {x: startX - this.textMargin + 2 * this.textMargin, y: 0},\n\t {x: startX, y: startY}\n\t ];\n\t\n\t var symbol = drawPath(chart, start, points);\n\t\n\t symbol.attr({\n\t stroke: this.getAttr('element-color'),\n\t 'stroke-width': this.getAttr('line-width'),\n\t fill: this.getAttr('fill')\n\t });\n\t if (options.link) { symbol.attr('href', options.link); }\n\t if (options.target) { symbol.attr('target', options.target); }\n\t if (options.key) { symbol.node.id = options.key; }\n\t symbol.node.setAttribute('class', this.getAttr('class'));\n\t\n\t this.text.attr({\n\t y: symbol.getBBox().height/2\n\t });\n\t\n\t this.group.push(symbol);\n\t symbol.insertBefore(this.text);\n\t this.symbol = symbol\n\t\n\t this.initialize();\n\t}\n\tinherits(InputOutput, Symbol);\n\t\n\tInputOutput.prototype.getLeft = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX() + this.textMargin;\n\t return {x: x, y: y};\n\t};\n\t\n\tInputOutput.prototype.getRight = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX() + this.group.getBBox().width - this.textMargin;\n\t return {x: x, y: y};\n\t};\n\t\n\tmodule.exports = InputOutput;\n\n\n/***/ }),\n/* 13 */\n/*!*******************************************!*\\\n !*** ./src/flowchart.symbol.operation.js ***!\n \\*******************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\t\n\tfunction Operation(chart, options) {\n\t var symbol = chart.paper.rect(0, 0, 0, 0);\n\t options = options || {};\n\t Symbol.call(this, chart, options, symbol);\n\t}\n\tinherits(Operation, Symbol);\n\t\n\tmodule.exports = Operation;\n\n\n/***/ }),\n/* 14 */\n/*!****************************************!*\\\n !*** ./src/flowchart.symbol.output.js ***!\n \\****************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\tvar drawAPI = __webpack_require__(/*! ./flowchart.functions */ 3);\n\tvar drawPath = drawAPI.drawPath;\n\t\n\tfunction Output(chart, options) {\n\t options = options || {};\n\t Symbol.call(this, chart, options);\n\t this.textMargin = this.getAttr('text-margin');\n\t\n\t this.text.attr({\n\t x: this.textMargin * 3\n\t });\n\t\n\t var width = this.text.getBBox().width + 4 * this.textMargin;\n\t var height = this.text.getBBox().height + 2 * this.textMargin;\n\t var startX = this.textMargin;\n\t var startY = height/2;\n\t\n\t var start = {x: startX, y: startY};\n\t var points = [\n\t {x: startX - this.textMargin, y: height},\n\t {x: startX - this.textMargin + width + 2 * this.textMargin, y: height},\n\t {x: startX - this.textMargin + width, y: 0},\n\t {x: startX - this.textMargin + 2 * this.textMargin, y: 0},\n\t {x: startX, y: startY}\n\t ];\n\t\n\t var symbol = drawPath(chart, start, points);\n\t\n\t symbol.attr({\n\t stroke: this.getAttr('element-color'),\n\t 'stroke-width': this.getAttr('line-width'),\n\t fill: this.getAttr('fill')\n\t });\n\t if (options.link) { symbol.attr('href', options.link); }\n\t if (options.target) { symbol.attr('target', options.target); }\n\t if (options.key) { symbol.node.id = options.key; }\n\t symbol.node.setAttribute('class', this.getAttr('class'));\n\t\n\t this.text.attr({\n\t y: symbol.getBBox().height/2\n\t });\n\t\n\t this.group.push(symbol);\n\t symbol.insertBefore(this.text);\n\t this.symbol = symbol\n\t\n\t this.initialize();\n\t}\n\tinherits(Output, Symbol);\n\t\n\tOutput.prototype.getLeft = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX() + this.textMargin;\n\t return {x: x, y: y};\n\t};\n\t\n\tOutput.prototype.getRight = function() {\n\t var y = this.getY() + this.group.getBBox().height/2;\n\t var x = this.getX() + this.group.getBBox().width - this.textMargin;\n\t return {x: x, y: y};\n\t};\n\t\n\tmodule.exports = Output;\n\t\n\t\n\t\n\t/*\n\t//var Symbol = require('./flowchart.symbol');\n\tvar inherits = require('./flowchart.helpers').inherits;\n\tvar drawAPI = require('./flowchart.functions');\n\tvar InputOutput = require('./flowchart.symbol.inputoutput');\n\tvar drawPath = drawAPI.drawPath;\n\t\n\tfunction Output(chart, options) {\n\t options = options || {};\n\t InputOutput.call(this, chart, options);\n\t\n\t var width = this.text.getBBox().width + 4 * this.textMargin;\n\t var height = this.text.getBBox().height + 2 * this.textMargin;\n\t var startX = this.textMargin;\n\t var startY = height/2;\n\t\n\t var start = {x: startX, y: startY};\n\t var points = [\n\t {x: startX - this.textMargin + 2 * this.textMargin, y: height},\n\t {x: startX - this.textMargin + width, y: height},\n\t {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},\n\t {x: startX - this.textMargin, y: 0},\n\t {x: startX, y: startY}\n\t ];\n\t\n\t var symbol = drawPath(chart, start, points);\n\t\n\t symbol.attr({\n\t stroke: this.getAttr('element-color'),\n\t 'stroke-width': this.getAttr('line-width'),\n\t fill: this.getAttr('fill')\n\t });\n\t if (options.link) { symbol.attr('href', options.link); }\n\t if (options.target) { symbol.attr('target', options.target); }\n\t if (options.key) { symbol.node.id = options.key; }\n\t symbol.node.setAttribute('class', this.getAttr('class'));\n\t\n\t this.text.attr({\n\t y: symbol.getBBox().height/2\n\t });\n\t\n\t this.group.push(symbol);\n\t symbol.insertBefore(this.text);\n\t \n\t if (this.symbol){\n\t this.group.remove(this.symbol); //tds\n\t this.symbol.parentNode.removeChild(this.symbol); //tds\n\t }\n\t this.symbol = symbol\n\t\n\t this.initialize();\n\t}\n\tinherits(Output, InputOutput);\n\t\n\tmodule.exports = Output;\n\t*/\n\n\n/***/ }),\n/* 15 */\n/*!***************************************!*\\\n !*** ./src/flowchart.symbol.start.js ***!\n \\***************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\t\n\tfunction Start(chart, options) {\n\t var symbol = chart.paper.rect(0, 0, 0, 0, 20);\n\t options = options || {};\n\t options.text = options.text || 'Start';\n\t Symbol.call(this, chart, options, symbol);\n\t}\n\tinherits(Start, Symbol);\n\t\n\tmodule.exports = Start;\n\t\n\t// Start.prototype.render = function() {\n\t// if (this.next) {\n\t// var lineLength = this.chart.options.symbols[this.symbolType]['line-length'] || this.chart.options['line-length'];\n\t\n\t// var bottomPoint = this.getBottom();\n\t// var topPoint = this.next.getTop();\n\t\n\t// if (!this.next.isPositioned) {\n\t// this.next.shiftY(this.getY() + this.height + lineLength);\n\t// this.next.setX(bottomPoint.x - this.next.width/2);\n\t// this.next.isPositioned = true;\n\t\n\t// this.next.render();\n\t// }\n\t// }\n\t// };\n\t\n\t// Start.prototype.renderLines = function() {\n\t// if (this.next) {\n\t// this.drawLineTo(this.next);\n\t// }\n\t// };\n\n\n/***/ }),\n/* 16 */\n/*!********************************************!*\\\n !*** ./src/flowchart.symbol.subroutine.js ***!\n \\********************************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tvar Symbol = __webpack_require__(/*! ./flowchart.symbol */ 2);\n\tvar inherits = __webpack_require__(/*! ./flowchart.helpers */ 1).inherits;\n\t\n\tfunction Subroutine(chart, options) {\n\t var symbol = chart.paper.rect(0, 0, 0, 0);\n\t options = options || {};\n\t Symbol.call(this, chart, options, symbol);\n\t\n\t symbol.attr({\n\t width: this.text.getBBox().width + 4 * this.getAttr('text-margin')\n\t });\n\t\n\t this.text.attr({\n\t 'x': 2 * this.getAttr('text-margin')\n\t });\n\t\n\t var innerWrap = chart.paper.rect(0, 0, 0, 0);\n\t innerWrap.attr({\n\t x: this.getAttr('text-margin'),\n\t stroke: this.getAttr('element-color'),\n\t 'stroke-width': this.getAttr('line-width'),\n\t width: this.text.getBBox().width + 2 * this.getAttr('text-margin'),\n\t height: this.text.getBBox().height + 2 * this.getAttr('text-margin'),\n\t fill: this.getAttr('fill')\n\t });\n\t if (options.key) { innerWrap.node.id = options.key + 'i'; }\n\t\n\t var font = this.getAttr('font');\n\t var fontF = this.getAttr('font-family');\n\t var fontW = this.getAttr('font-weight');\n\t\n\t if (font) innerWrap.attr({ 'font': font });\n\t if (fontF) innerWrap.attr({ 'font-family': fontF });\n\t if (fontW) innerWrap.attr({ 'font-weight': fontW });\n\t\n\t if (options.link) { innerWrap.attr('href', options.link); }\n\t if (options.target) { innerWrap.attr('target', options.target); }\n\t this.group.push(innerWrap);\n\t innerWrap.insertBefore(this.text);\n\t\n\t this.initialize();\n\t}\n\tinherits(Subroutine, Symbol);\n\t\n\tmodule.exports = Subroutine;\n\n\n/***/ }),\n/* 17 */\n/*!******************************!*\\\n !*** ./src/jquery-plugin.js ***!\n \\******************************/\n/***/ (function(module, exports, __webpack_require__) {\n\n\tif (typeof jQuery != 'undefined') {\n\t\tvar parse = __webpack_require__(/*! ./flowchart.parse */ 4);\n\t\n\t\t(function( $ ) {\n\t\t\tfunction paramFit(needle, haystack) {\n\t\t\t\treturn needle == haystack ||\n\t\t\t\t( Array.isArray(haystack) && (haystack.includes(needle) || haystack.includes(Number(needle)) ))\n\t\t\t}\n\t\t\tvar methods = {\n\t\t\t\tinit : function(options) {\n\t\t\t\t\treturn this.each(function() {\n\t\t\t\t\t\tvar $this = $(this);\n\t\t\t\t\t\tthis.chart = parse($this.text());\n\t\t\t\t\t\t$this.html('');\n\t\t\t\t\t\tthis.chart.drawSVG(this, options);\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tsetFlowStateByParam : function(param, paramValue, newFlowState) {\n\t\t\t\t\treturn this.each(function() {\n\t\t\t\t\t\tvar chart = this.chart;\n\t\n\t\t\t\t\t\t// @todo this should be part of Symbol API\n\t\t\t\t\t\tvar nextSymbolKeys = ['next', 'yes', 'no', 'path1', 'path2', 'path3'];\n\t\n\t\t\t\t\t\tfor (var property in chart.symbols) {\n\t\t\t\t\t\t\tif (chart.symbols.hasOwnProperty(property)) {\n\t\t\t\t\t\t\t\tvar symbol = chart.symbols[property];\n\t\t\t\t\t\t\t\tvar val = symbol.params[param];\n\t\t\t\t\t\t\t\tif (paramFit(val, paramValue)) {\n\t\t\t\t\t\t\t\t\tsymbol.flowstate = newFlowState;\n\t\t\t\t\t\t\t\t\tfor (var nski = 0; nski < nextSymbolKeys.length; nski++) {\n\t\t\t\t\t\t\t\t\t\tvar nextSymbolKey = nextSymbolKeys[nski];\n\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\tsymbol[nextSymbolKey] &&\n\t\t\t\t\t\t\t\t\t\t\tsymbol[nextSymbolKey]['params'] &&\n\t\t\t\t\t\t\t\t\t\t\tsymbol[nextSymbolKey]['params'][param] &&\n\t\t\t\t\t\t\t\t\t\t\tparamFit(symbol[nextSymbolKey]['params'][param], paramValue)\n\t\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\t\tsymbol.lineStyle[symbol[nextSymbolKey]['key']] = {stroke: chart.options()['flowstate'][newFlowState]['fill']};\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tchart.clean();\n\t\t\t\t\t\tchart.drawSVG(this);\n\t\t\t\t\t});\n\t\n\t\t\t\t},\n\t\t\t\tclearFlowState: function () {\n\t\t\t\t\treturn this.each(function() {\n\t\t\t\t\t\tvar chart = this.chart;\n\t\n\t\t\t\t\t\tfor (var property in chart.symbols) {\n\t\t\t\t\t\t\tif (chart.symbols.hasOwnProperty(property)) {\n\t\t\t\t\t\t\t\tvar node = chart.symbols[property];\n\t\t\t\t\t\t\t\tnode.flowstate = '';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\n\t\t\t\t\t\tchart.clean();\n\t\t\t\t\t\tchart.drawSVG(this);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t\t$.fn.flowChart = function(methodOrOptions) {\n\t\t\t\tif ( methods[methodOrOptions] ) {\n\t\t\t\t\treturn methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\n\t\t\t\t} else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\n\t\t\t\t\t// Default to \"init\"\n\t\t\t\t\treturn methods.init.apply( this, arguments );\n\t\t\t\t} else {\n\t\t\t\t\t$.error( 'Method ' + methodOrOptions + ' does not exist on jQuery.flowChart' );\n\t\t\t\t}\n\t\t\t};\n\t\n\t\t})(jQuery); // eslint-disable-line\n\t}\n\n\n/***/ }),\n/* 18 */\n/*!**************************!*\\\n !*** external \"Raphael\" ***!\n \\**************************/\n/***/ (function(module, exports) {\n\n\tmodule.exports = __WEBPACK_EXTERNAL_MODULE_18__;\n\n/***/ })\n/******/ ])\n});\n;\n\n\n// WEBPACK FOOTER //\n// flowchart.min.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId])\n \t\t\treturn installedModules[moduleId].exports;\n\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\texports: {},\n \t\t\tid: moduleId,\n \t\t\tloaded: false\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.loaded = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0c167881307e9f1b2ebf","require('./src/flowchart.shim');\nvar parse = require('./src/flowchart.parse');\nrequire('./src/jquery-plugin');\n\nvar FlowChart = {\n\tparse: parse\n};\n\nif (typeof window !== 'undefined') {\n\twindow.flowchart = FlowChart;\n}\n\nmodule.exports = FlowChart;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./index.js\n// module id = 0\n// module chunks = 0","function _defaults(options, defaultOptions) {\n if (!options || typeof options === 'function') {\n return defaultOptions;\n }\n\n var merged = {};\n for (var attrname in defaultOptions) {\n merged[attrname] = defaultOptions[attrname];\n }\n\n for (attrname in options) {\n if (options[attrname]) {\n if (typeof merged[attrname] === 'object') {\n merged[attrname] = _defaults(merged[attrname], options[attrname]);\n } else {\n merged[attrname] = options[attrname];\n }\n }\n }\n return merged;\n}\n\nfunction _inherits(ctor, superCtor) {\n if (typeof(Object.create) === 'function') {\n // implementation from standard node.js 'util' module\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n } else {\n // old school shim for old browsers\n ctor.super_ = superCtor;\n var TempCtor = function () {};\n TempCtor.prototype = superCtor.prototype;\n ctor.prototype = new TempCtor();\n ctor.prototype.constructor = ctor;\n }\n}\n\n// move dependent functions to a container so that\n// they can be overriden easier in no jquery environment (node.js)\nmodule.exports = {\n defaults: _defaults,\n inherits: _inherits\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.helpers.js\n// module id = 1\n// module chunks = 0","var drawAPI = require('./flowchart.functions');\nvar drawLine = drawAPI.drawLine;\nvar checkLineIntersection = drawAPI.checkLineIntersection;\n\nfunction Symbol(chart, options, symbol) {\n this.chart = chart;\n this.group = this.chart.paper.set();\n this.symbol = symbol;\n this.connectedTo = [];\n this.symbolType = options.symbolType;\n this.flowstate = (options.flowstate || 'future');\n this.lineStyle = (options.lineStyle || {});\n this.key = (options.key || '');\n this.leftLines = [];\n this.rightLines = [];\n this.topLines = [];\n this.bottomLines = [];\n this.params = options.params;\n\n this.next_direction = options.next && options['direction_next'] ? options['direction_next'] : undefined;\n\n this.text = this.chart.paper.text(0, 0, options.text);\n //Raphael does not support the svg group tag so setting the text node id to the symbol node id plus t\n if (options.key) { this.text.node.id = options.key + 't'; }\n this.text.node.setAttribute('class', this.getAttr('class') + 't');\n\n this.text.attr({\n 'text-anchor': 'start',\n 'x' : this.getAttr('text-margin'),\n 'fill' : this.getAttr('font-color'),\n 'font-size' : this.getAttr('font-size')\n });\n\n var font = this.getAttr('font');\n var fontF = this.getAttr('font-family');\n var fontW = this.getAttr('font-weight');\n\n if (font) this.text.attr({ 'font': font });\n if (fontF) this.text.attr({ 'font-family': fontF });\n if (fontW) this.text.attr({ 'font-weight': fontW });\n\n if (options.link) { this.text.attr('href', options.link); }\n \n //ndrqu Add click function with event and options params\n if (options.function) { \n this.text.attr({ 'cursor' : 'pointer' });\n\n this.text.node.addEventListener(\"click\", function(evt) {\n window[options.function](evt,options);\n }, false);\n }\n\n if (options.target) { this.text.attr('target', options.target); }\n\n var maxWidth = this.getAttr('maxWidth');\n if (maxWidth) {\n // using this approach: http://stackoverflow.com/a/3153457/22466\n var words = options.text.split(' ');\n var tempText = \"\";\n for (var i=0, ii=words.length; i maxWidth) {\n tempText += \"\\n\" + word;\n } else {\n tempText += \" \" + word;\n }\n }\n this.text.attr(\"text\", tempText.substring(1));\n }\n\n this.group.push(this.text);\n\n if (symbol) {\n var tmpMargin = this.getAttr('text-margin');\n\n symbol.attr({\n 'fill' : this.getAttr('fill'),\n 'stroke' : this.getAttr('element-color'),\n 'stroke-width' : this.getAttr('line-width'),\n 'width' : this.text.getBBox().width + 2 * tmpMargin,\n 'height' : this.text.getBBox().height + 2 * tmpMargin\n });\n\n symbol.node.setAttribute('class', this.getAttr('class'));\n var roundness = this.getAttr('roundness');\n if (!isNaN(roundness)) {\n symbol.node.setAttribute('ry', roundness);\n symbol.node.setAttribute('rx', roundness);\n }\n\n if (options.link) { symbol.attr('href', options.link); }\n if (options.target) { symbol.attr('target', options.target); }\n\n //ndrqu Add click function with event and options params\n if (options.function) { \n symbol.node.addEventListener(\"click\", function(evt) {\n window[options.function](evt,options);\n }, false);\n symbol.attr({ 'cursor' : 'pointer' });\n }\n if (options.key) { symbol.node.id = options.key; }\n\n this.group.push(symbol);\n symbol.insertBefore(this.text);\n\n this.text.attr({\n 'y': symbol.getBBox().height/2\n });\n\n this.initialize();\n }\n\n}\n\n/* Gets the attribute based on Flowstate, Symbol-Name and default, first found wins */\nSymbol.prototype.getAttr = function(attName) {\n if (!this.chart) {\n return undefined;\n }\n var opt3 = (this.chart.options) ? this.chart.options[attName] : undefined;\n var opt2 = (this.chart.options.symbols) ? this.chart.options.symbols[this.symbolType][attName] : undefined;\n var opt1;\n if (this.chart.options.flowstate && this.chart.options.flowstate[this.flowstate]) {\n opt1 = this.chart.options.flowstate[this.flowstate][attName];\n }\n return (opt1 || opt2 || opt3);\n};\n\nSymbol.prototype.initialize = function() {\n this.group.transform('t' + this.getAttr('line-width') + ',' + this.getAttr('line-width'));\n\n this.width = this.group.getBBox().width;\n this.height = this.group.getBBox().height;\n};\n\nSymbol.prototype.getCenter = function() {\n return {x: this.getX() + this.width/2,\n y: this.getY() + this.height/2};\n};\n\nSymbol.prototype.getX = function() {\n return this.group.getBBox().x;\n};\n\nSymbol.prototype.getY = function() {\n return this.group.getBBox().y;\n};\n\nSymbol.prototype.shiftX = function(x) {\n this.group.transform('t' + (this.getX() + x) + ',' + this.getY());\n};\n\nSymbol.prototype.setX = function(x) {\n this.group.transform('t' + x + ',' + this.getY());\n};\n\nSymbol.prototype.shiftY = function(y) {\n this.group.transform('t' + this.getX() + ',' + (this.getY() + y));\n};\n\nSymbol.prototype.setY = function(y) {\n this.group.transform('t' + this.getX() + ',' + y);\n};\n\nSymbol.prototype.getTop = function() {\n var y = this.getY();\n var x = this.getX() + this.width/2;\n return {x: x, y: y};\n};\n\nSymbol.prototype.getBottom = function() {\n var y = this.getY() + this.height;\n var x = this.getX() + this.width/2;\n return {x: x, y: y};\n};\n\nSymbol.prototype.getLeft = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX();\n return {x: x, y: y};\n};\n\nSymbol.prototype.getRight = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX() + this.group.getBBox().width;\n return {x: x, y: y};\n};\n\nSymbol.prototype.render = function() {\n if (this.next) {\n\n var self = this;\n var lineLength = this.getAttr('line-length');\n\n if (this.next_direction === 'right') {\n\n var rightPoint = this.getRight();\n\n if (!this.next.isPositioned) {\n this.next.setY(rightPoint.y - this.next.height/2);\n this.next.shiftX(this.group.getBBox().x + this.width + lineLength);\n\n (function shift() {\n var hasSymbolUnder = false;\n var symb;\n for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n symb = self.chart.symbols[i];\n\n var diff = Math.abs(symb.getCenter().x - self.next.getCenter().x);\n if (symb.getCenter().y > self.next.getCenter().y && diff <= self.next.width/2) {\n hasSymbolUnder = true;\n break;\n }\n }\n\n if (hasSymbolUnder) {\n if (self.next.symbolType === 'end') return;\n self.next.setX(symb.getX() + symb.width + lineLength);\n shift();\n }\n })();\n\n this.next.isPositioned = true;\n\n this.next.render();\n }\n } else if (this.next_direction === 'left') {\n\n var leftPoint = this.getLeft();\n\n if (!this.next.isPositioned) {\n this.next.setY(leftPoint.y - this.next.height/2);\n this.next.shiftX(-(this.group.getBBox().x + this.width + lineLength));\n\n (function shift() {\n var hasSymbolUnder = false;\n var symb;\n for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n symb = self.chart.symbols[i];\n\n var diff = Math.abs(symb.getCenter().x - self.next.getCenter().x);\n if (symb.getCenter().y > self.next.getCenter().y && diff <= self.next.width/2) {\n hasSymbolUnder = true;\n break;\n }\n }\n\n if (hasSymbolUnder) {\n if (self.next.symbolType === 'end') return;\n self.next.setX(symb.getX() + symb.width + lineLength);\n shift();\n }\n })();\n\n this.next.isPositioned = true;\n\n this.next.render();\n }\n } else {\n var bottomPoint = this.getBottom();\n\n if (!this.next.isPositioned) {\n this.next.shiftY(this.getY() + this.height + lineLength);\n this.next.setX(bottomPoint.x - this.next.width/2);\n this.next.isPositioned = true;\n\n this.next.render();\n }\n }\n }\n};\n\nSymbol.prototype.renderLines = function() {\n if (this.next) {\n if (this.next_direction) {\n this.drawLineTo(this.next, this.getAttr('arrow-text') || '', this.next_direction);\n } else {\n this.drawLineTo(this.next, this.getAttr('arrow-text') || '');\n }\n }\n};\n\nSymbol.prototype.drawLineTo = function(symbol, text, origin) {\n if (this.connectedTo.indexOf(symbol) < 0) {\n this.connectedTo.push(symbol);\n }\n\n var x = this.getCenter().x,\n y = this.getCenter().y,\n right = this.getRight(),\n bottom = this.getBottom(),\n top = this.getTop(),\n left = this.getLeft();\n\n var symbolX = symbol.getCenter().x,\n symbolY = symbol.getCenter().y,\n symbolTop = symbol.getTop(),\n symbolRight = symbol.getRight(),\n symbolLeft = symbol.getLeft();\n\n var isOnSameColumn = x === symbolX,\n isOnSameLine = y === symbolY,\n isUnder = y < symbolY,\n isUpper = y > symbolY || this === symbol,\n isLeft = x > symbolX,\n isRight = x < symbolX;\n\n var maxX = 0,\n line,\n yOffset,\n lineLength = this.getAttr('line-length'),\n lineWith = this.getAttr('line-width');\n\n if ((!origin || origin === 'bottom') && isOnSameColumn && isUnder) {\n if (symbol.topLines.length === 0 && this.bottomLines.length === 0) {\n line = drawLine(this.chart, bottom, symbolTop, text);\n } else {\n yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n line = drawLine(this.chart, bottom, [\n {x: symbolTop.x, y: symbolTop.y - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n }\n this.bottomLines.push(line);\n symbol.topLines.push(line);\n this.bottomStart = true;\n symbol.topEnd = true;\n maxX = bottom.x;\n } else if ((!origin || origin === 'right') && isOnSameLine && isRight) {\n if (symbol.leftLines.length === 0 && this.rightLines.length === 0) {\n line = drawLine(this.chart, right, symbolLeft, text);\n } else {\n yOffset = Math.max(symbol.leftLines.length, this.rightLines.length) * 10;\n line = drawLine(this.chart, right, [\n {x: right.x, y: right.y - yOffset},\n {x: right.x, y: symbolLeft.y - yOffset},\n {x: symbolLeft.x, y: symbolLeft.y - yOffset},\n {x: symbolLeft.x, y: symbolLeft.y}\n ], text);\n }\n this.rightLines.push(line);\n symbol.leftLines.push(line);\n this.rightStart = true;\n symbol.leftEnd = true;\n maxX = symbolLeft.x;\n } else if ((!origin || origin === 'left') && isOnSameLine && isLeft) {\n if (symbol.rightLines.length === 0 && this.leftLines.length === 0) {\n line = drawLine(this.chart, left, symbolRight, text);\n } else {\n yOffset = Math.max(symbol.rightLines.length, this.leftLines.length) * 10;\n line = drawLine(this.chart, right, [\n {x: right.x, y: right.y - yOffset},\n {x: right.x, y: symbolRight.y - yOffset},\n {x: symbolRight.x, y: symbolRight.y - yOffset},\n {x: symbolRight.x, y: symbolRight.y}\n ], text);\n }\n this.leftLines.push(line);\n symbol.rightLines.push(line);\n this.leftStart = true;\n symbol.rightEnd = true;\n maxX = symbolRight.x;\n } else if ((!origin || origin === 'right') && isOnSameColumn && isUpper) {\n yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n line = drawLine(this.chart, right, [\n {x: right.x + lineLength/2, y: right.y - yOffset},\n {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.rightLines.push(line);\n symbol.topLines.push(line);\n this.rightStart = true;\n symbol.topEnd = true;\n maxX = right.x + lineLength/2;\n } else if ((!origin || origin === 'right') && isOnSameColumn && isUnder) {\n yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n line = drawLine(this.chart, right, [\n {x: right.x + lineLength/2, y: right.y - yOffset},\n {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.rightLines.push(line);\n symbol.topLines.push(line);\n this.rightStart = true;\n symbol.topEnd = true;\n maxX = right.x + lineLength/2;\n } else if ((!origin || origin === 'bottom') && isLeft) {\n yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n if (this.leftEnd && isUpper) {\n line = drawLine(this.chart, bottom, [\n {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},\n {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2 - yOffset},\n {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n } else {\n line = drawLine(this.chart, bottom, [\n {x: bottom.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n }\n this.bottomLines.push(line);\n symbol.topLines.push(line);\n this.bottomStart = true;\n symbol.topEnd = true;\n maxX = bottom.x + (bottom.x - symbolTop.x)/2;\n } else if ((!origin || origin === 'bottom') && isRight && isUnder) {\n yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n line = drawLine(this.chart, bottom, [\n {x: bottom.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.bottomLines.push(line);\n symbol.topLines.push(line);\n this.bottomStart = true;\n symbol.topEnd = true;\n maxX = bottom.x;\n if (symbolTop.x > maxX) maxX = symbolTop.x;\n } else if ((!origin || origin === 'bottom') && isRight) {\n yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n line = drawLine(this.chart, bottom, [\n {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},\n {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2 - yOffset},\n {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.bottomLines.push(line);\n symbol.topLines.push(line);\n this.bottomStart = true;\n symbol.topEnd = true;\n maxX = bottom.x + (bottom.x - symbolTop.x)/2;\n } else if ((origin && origin === 'right') && isLeft) {\n yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n line = drawLine(this.chart, right, [\n {x: right.x + lineLength/2, y: right.y},\n {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.rightLines.push(line);\n symbol.topLines.push(line);\n this.rightStart = true;\n symbol.topEnd = true;\n maxX = right.x + lineLength/2;\n } else if ((origin && origin === 'right') && isRight) {\n yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;\n line = drawLine(this.chart, right, [\n {x: symbolTop.x, y: right.y - yOffset},\n {x: symbolTop.x, y: symbolTop.y - yOffset}\n ], text);\n this.rightLines.push(line);\n symbol.topLines.push(line);\n this.rightStart = true;\n symbol.topEnd = true;\n maxX = right.x + lineLength/2;\n } else if ((origin && origin === 'bottom') && isOnSameColumn && isUpper) {\n yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;\n line = drawLine(this.chart, bottom, [\n {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},\n {x: right.x + lineLength/2, y: bottom.y + lineLength/2 - yOffset},\n {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.bottomLines.push(line);\n symbol.topLines.push(line);\n this.bottomStart = true;\n symbol.topEnd = true;\n maxX = bottom.x + lineLength/2;\n } else if ((origin === 'left') && isOnSameColumn && isUpper) {\n var diffX = left.x - lineLength/2;\n if (symbolLeft.x < left.x) {\n diffX = symbolLeft.x - lineLength/2;\n }\n yOffset = Math.max(symbol.topLines.length, this.leftLines.length) * 10;\n line = drawLine(this.chart, left, [\n {x: diffX, y: left.y - yOffset},\n {x: diffX, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.leftLines.push(line);\n symbol.topLines.push(line);\n this.leftStart = true;\n symbol.topEnd = true;\n maxX = left.x;\n } else if ((origin === 'left')) {\n yOffset = Math.max(symbol.topLines.length, this.leftLines.length) * 10;\n line = drawLine(this.chart, left, [\n {x: symbolTop.x + (left.x - symbolTop.x)/2, y: left.y},\n {x: symbolTop.x + (left.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.leftLines.push(line);\n symbol.topLines.push(line);\n this.leftStart = true;\n symbol.topEnd = true;\n maxX = left.x;\n } else if ((origin === 'top')) {\n yOffset = Math.max(symbol.topLines.length, this.topLines.length) * 10;\n line = drawLine(this.chart, top, [\n {x: top.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},\n {x: symbolTop.x, y: symbolTop.y}\n ], text);\n this.topLines.push(line);\n symbol.topLines.push(line);\n this.topStart = true;\n symbol.topEnd = true;\n maxX = top.x;\n }\n\n //update line style\n if (this.lineStyle[symbol.key] && line){\n line.attr(this.lineStyle[symbol.key]);\n }\n\n if (line) {\n for (var l = 0, llen = this.chart.lines.length; l < llen; l++) {\n var otherLine = this.chart.lines[l];\n\n var ePath = otherLine.attr('path'),\n lPath = line.attr('path');\n\n for (var iP = 0, lenP = ePath.length - 1; iP < lenP; iP++) {\n var newPath = [];\n newPath.push(['M', ePath[iP][1], ePath[iP][2]]);\n newPath.push(['L', ePath[iP + 1][1], ePath[iP + 1][2]]);\n\n var line1_from_x = newPath[0][1];\n var line1_from_y = newPath[0][2];\n var line1_to_x = newPath[1][1];\n var line1_to_y = newPath[1][2];\n\n for (var lP = 0, lenlP = lPath.length - 1; lP < lenlP; lP++) {\n var newLinePath = [];\n newLinePath.push(['M', lPath[lP][1], lPath[lP][2]]);\n newLinePath.push(['L', lPath[lP + 1][1], lPath[lP + 1][2]]);\n\n var line2_from_x = newLinePath[0][1];\n var line2_from_y = newLinePath[0][2];\n var line2_to_x = newLinePath[1][1];\n var line2_to_y = newLinePath[1][2];\n\n var res = checkLineIntersection(line1_from_x, line1_from_y, line1_to_x, line1_to_y, line2_from_x, line2_from_y, line2_to_x, line2_to_y);\n if (res.onLine1 && res.onLine2) {\n\n var newSegment;\n if (line2_from_y === line2_to_y) {\n if (line2_from_x > line2_to_x) {\n newSegment = ['L', res.x + lineWith * 2, line2_from_y];\n lPath.splice(lP + 1, 0, newSegment);\n newSegment = ['C', res.x + lineWith * 2, line2_from_y, res.x, line2_from_y - lineWith * 4, res.x - lineWith * 2, line2_from_y];\n lPath.splice(lP + 2, 0, newSegment);\n line.attr('path', lPath);\n } else {\n newSegment = ['L', res.x - lineWith * 2, line2_from_y];\n lPath.splice(lP + 1, 0, newSegment);\n newSegment = ['C', res.x - lineWith * 2, line2_from_y, res.x, line2_from_y - lineWith * 4, res.x + lineWith * 2, line2_from_y];\n lPath.splice(lP + 2, 0, newSegment);\n line.attr('path', lPath);\n }\n } else {\n if (line2_from_y > line2_to_y) {\n newSegment = ['L', line2_from_x, res.y + lineWith * 2];\n lPath.splice(lP + 1, 0, newSegment);\n newSegment = ['C', line2_from_x, res.y + lineWith * 2, line2_from_x + lineWith * 4, res.y, line2_from_x, res.y - lineWith * 2];\n lPath.splice(lP + 2, 0, newSegment);\n line.attr('path', lPath);\n } else {\n newSegment = ['L', line2_from_x, res.y - lineWith * 2];\n lPath.splice(lP + 1, 0, newSegment);\n newSegment = ['C', line2_from_x, res.y - lineWith * 2, line2_from_x + lineWith * 4, res.y, line2_from_x, res.y + lineWith * 2];\n lPath.splice(lP + 2, 0, newSegment);\n line.attr('path', lPath);\n }\n }\n\n lP += 2;\n }\n }\n }\n }\n\n this.chart.lines.push(line);\n if (this.chart.minXFromSymbols === undefined || this.chart.minXFromSymbols > left.x) {\n this.chart.minXFromSymbols = left.x;\n }\n }\n\n if (!this.chart.maxXFromLine || (this.chart.maxXFromLine && maxX > this.chart.maxXFromLine)) {\n this.chart.maxXFromLine = maxX;\n }\n};\n\nmodule.exports = Symbol;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.js\n// module id = 2\n// module chunks = 0","function drawPath(chart, location, points) {\n var i, len;\n var path = 'M{0},{1}';\n for (i = 2, len = 2 * points.length + 2; i < len; i+=2) {\n path += ' L{' + i + '},{' + (i + 1) + '}';\n }\n var pathValues = [location.x, location.y];\n for (i = 0, len = points.length; i < len; i++) {\n pathValues.push(points[i].x);\n pathValues.push(points[i].y);\n }\n var symbol = chart.paper.path(path, pathValues);\n symbol.attr('stroke', chart.options['element-color']);\n symbol.attr('stroke-width', chart.options['line-width']);\n\n var font = chart.options.font;\n var fontF = chart.options['font-family'];\n var fontW = chart.options['font-weight'];\n\n if (font) symbol.attr({ 'font': font });\n if (fontF) symbol.attr({ 'font-family': fontF });\n if (fontW) symbol.attr({ 'font-weight': fontW });\n\n return symbol;\n}\n\nfunction drawLine(chart, from, to, text) {\n var i, len;\n\n if (Object.prototype.toString.call(to) !== '[object Array]') {\n to = [to];\n }\n\n var path = 'M{0},{1}';\n for (i = 2, len = 2 * to.length + 2; i < len; i+=2) {\n path += ' L{' + i + '},{' + (i + 1) + '}';\n }\n var pathValues = [from.x, from.y];\n for (i = 0, len = to.length; i < len; i++) {\n pathValues.push(to[i].x);\n pathValues.push(to[i].y);\n }\n\n var line = chart.paper.path(path, pathValues);\n line.attr({\n stroke: chart.options['line-color'],\n 'stroke-width': chart.options['line-width'],\n 'arrow-end': chart.options['arrow-end']\n });\n\n var font = chart.options.font;\n var fontF = chart.options['font-family'];\n var fontW = chart.options['font-weight'];\n\n if (font) line.attr({ 'font': font });\n if (fontF) line.attr({ 'font-family': fontF });\n if (fontW) line.attr({ 'font-weight': fontW });\n\n if (text) {\n\n var centerText = false;\n\n var textPath = chart.paper.text(0, 0, text);\n var textAnchor = 'start';\n\n var isHorizontal = false;\n var firstTo = to[0];\n\n if (from.y === firstTo.y) {\n isHorizontal = true;\n }\n\n var x = 0,\n y = 0;\n\n if (centerText) {\n if (from.x > firstTo.x) {\n x = from.x - (from.x - firstTo.x)/2;\n } else {\n x = firstTo.x - (firstTo.x - from.x)/2;\n }\n\n if (from.y > firstTo.y) {\n y = from.y - (from.y - firstTo.y)/2;\n } else {\n y = firstTo.y - (firstTo.y - from.y)/2;\n }\n\n if (isHorizontal) {\n x -= textPath.getBBox().width/2;\n y -= chart.options['text-margin'];\n } else {\n x += chart.options['text-margin'];\n y -= textPath.getBBox().height/2;\n }\n } else {\n x = from.x;\n y = from.y;\n\n if (isHorizontal) {\n if (from.x > firstTo.x) {\n x -= chart.options['text-margin']/2;\n textAnchor = 'end';\n } else {\n x += chart.options['text-margin']/2;\n }\n y -= chart.options['text-margin'];\n } else {\n x += chart.options['text-margin']/2;\n y += chart.options['text-margin'];\n if (from.y > firstTo.y) {\n y -= chart.options['text-margin']*2;\n }\n }\n }\n\n textPath.attr({\n 'text-anchor': textAnchor,\n 'font-size': chart.options['font-size'],\n 'fill': chart.options['font-color'],\n x: x,\n y: y\n });\n\n if (font) textPath.attr({ 'font': font });\n if (fontF) textPath.attr({ 'font-family': fontF });\n if (fontW) textPath.attr({ 'font-weight': fontW });\n }\n\n return line;\n}\n\nfunction checkLineIntersection(line1StartX, line1StartY, line1EndX, line1EndY, line2StartX, line2StartY, line2EndX, line2EndY) {\n // if the lines intersect, the result contains the x and y of the intersection (treating the lines as infinite) and booleans for whether line segment 1 or line segment 2 contain the point\n var denominator, a, b, numerator1, numerator2, result = {\n x: null,\n y: null,\n onLine1: false,\n onLine2: false\n };\n denominator = ((line2EndY - line2StartY) * (line1EndX - line1StartX)) - ((line2EndX - line2StartX) * (line1EndY - line1StartY));\n if (denominator === 0) {\n return result;\n }\n a = line1StartY - line2StartY;\n b = line1StartX - line2StartX;\n numerator1 = ((line2EndX - line2StartX) * a) - ((line2EndY - line2StartY) * b);\n numerator2 = ((line1EndX - line1StartX) * a) - ((line1EndY - line1StartY) * b);\n a = numerator1 / denominator;\n b = numerator2 / denominator;\n\n // if we cast these lines infinitely in both directions, they intersect here:\n result.x = line1StartX + (a * (line1EndX - line1StartX));\n result.y = line1StartY + (a * (line1EndY - line1StartY));\n /*\n // it is worth noting that this should be the same as:\n x = line2StartX + (b * (line2EndX - line2StartX));\n y = line2StartX + (b * (line2EndY - line2StartY));\n */\n // if line1 is a segment and line2 is infinite, they intersect if:\n if (a > 0 && a < 1) {\n result.onLine1 = true;\n }\n // if line2 is a segment and line1 is infinite, they intersect if:\n if (b > 0 && b < 1) {\n result.onLine2 = true;\n }\n // if line1 and line2 are segments, they intersect if both of the above are true\n return result;\n}\n\nmodule.exports = {\n\tdrawPath: drawPath,\n\tdrawLine: drawLine,\n\tcheckLineIntersection: checkLineIntersection\n};\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.functions.js\n// module id = 3\n// module chunks = 0","var FlowChart = require('./flowchart.chart');\nvar Start = require('./flowchart.symbol.start');\nvar End = require('./flowchart.symbol.end');\nvar Operation = require('./flowchart.symbol.operation');\nvar InputOutput = require('./flowchart.symbol.inputoutput');\nvar Input = require('./flowchart.symbol.input'); //tds\nvar Output = require('./flowchart.symbol.output'); //tds\nvar Subroutine = require('./flowchart.symbol.subroutine');\nvar Condition = require('./flowchart.symbol.condition');\nvar Parallel = require('./flowchart.symbol.parallel');\n\n\nfunction parse(input) {\n input = input || '';\n input = input.trim();\n\n var chart = {\n symbols: {},\n start: null,\n drawSVG: function(container, options) {\n var self = this;\n\n if (this.diagram) {\n this.diagram.clean();\n }\n\n var diagram = new FlowChart(container, options);\n this.diagram = diagram;\n var dispSymbols = {};\n\n function getDisplaySymbol(s) {\n if (dispSymbols[s.key]) {\n return dispSymbols[s.key];\n }\n\n switch (s.symbolType) {\n case 'start':\n dispSymbols[s.key] = new Start(diagram, s);\n break;\n case 'end':\n dispSymbols[s.key] = new End(diagram, s);\n break;\n case 'operation':\n dispSymbols[s.key] = new Operation(diagram, s);\n break;\n case 'inputoutput':\n dispSymbols[s.key] = new InputOutput(diagram, s);\n break;\n case 'input':\n dispSymbols[s.key] = new Input(diagram, s); //tds\n break; \n case 'output':\n dispSymbols[s.key] = new Output(diagram, s); //tds\n break; \n case 'subroutine':\n dispSymbols[s.key] = new Subroutine(diagram, s);\n break;\n case 'condition':\n dispSymbols[s.key] = new Condition(diagram, s);\n break;\n case 'parallel':\n dispSymbols[s.key] = new Parallel(diagram, s);\n break;\n default:\n return new Error('Wrong symbol type!');\n }\n\n return dispSymbols[s.key];\n }\n\n (function constructChart(s, prevDisp, prev) {\n var dispSymb = getDisplaySymbol(s);\n\n if (self.start === s) {\n diagram.startWith(dispSymb);\n } else if (prevDisp && prev && !prevDisp.pathOk) {\n if (prevDisp instanceof(Condition)) {\n if (prev.yes === s) {\n prevDisp.yes(dispSymb);\n }\n if (prev.no === s) {\n prevDisp.no(dispSymb);\n }\n } else if (prevDisp instanceof(Parallel)) {\n if (prev.path1 === s) {\n prevDisp.path1(dispSymb);\n }\n if (prev.path2 === s) {\n prevDisp.path2(dispSymb);\n }\n if (prev.path3 === s) {\n prevDisp.path3(dispSymb);\n }\n } else {\n prevDisp.then(dispSymb);\n }\n }\n\n if (dispSymb.pathOk) {\n return dispSymb;\n }\n\n if (dispSymb instanceof(Condition)) {\n if (s.yes) {\n constructChart(s.yes, dispSymb, s);\n }\n if (s.no) {\n constructChart(s.no, dispSymb, s);\n }\n } else if (dispSymb instanceof(Parallel)) {\n if (s.path1) {\n constructChart(s.path1, dispSymb, s);\n }\n if (s.path2) {\n constructChart(s.path2, dispSymb, s);\n }\n if (s.path3) {\n constructChart(s.path3, dispSymb, s);\n }\n } else if (s.next) {\n constructChart(s.next, dispSymb, s);\n }\n\n return dispSymb;\n })(this.start);\n\n diagram.render();\n },\n clean: function() {\n this.diagram.clean();\n },\n options: function() {\n return this.diagram.options;\n }\n };\n\n var lines = [];\n var prevBreak = 0;\n for (var i0 = 1, i0len = input.length; i0 < i0len; i0++) {\n if(input[i0] === '\\n' && input[i0 - 1] !== '\\\\') {\n var line0 = input.substring(prevBreak, i0);\n prevBreak = i0 + 1;\n lines.push(line0.replace(/\\\\\\n/g, '\\n'));\n }\n }\n\n if (prevBreak < input.length) {\n lines.push(input.substr(prevBreak));\n }\n\n for (var l = 1, len = lines.length; l < len;) {\n var currentLine = lines[l];\n\n if (currentLine.indexOf('->') < 0 && currentLine.indexOf('=>') < 0 && currentLine.indexOf('@>') < 0) {\n lines[l - 1] += '\\n' + currentLine;\n lines.splice(l, 1);\n len--;\n } else {\n l++;\n }\n }\n\n function getStyle(s){\n var startIndex = s.indexOf('(') + 1;\n var endIndex = s.indexOf(')');\n if (startIndex >= 0 && endIndex >= 0) {\n return s.substring(startIndex,endIndex);\n }\n return '{}';\n }\n\n function getSymbValue(s){\n var startIndex = s.indexOf('(') + 1;\n var endIndex = s.indexOf(')');\n if (startIndex >= 0 && endIndex >= 0) {\n return s.substring(startIndex,endIndex);\n }\n return '';\n }\n\n function getSymbol(s) {\n var startIndex = s.indexOf('(') + 1;\n var endIndex = s.indexOf(')');\n if (startIndex >= 0 && endIndex >= 0) {\n return chart.symbols[s.substring(0, startIndex - 1)];\n }\n return chart.symbols[s];\n }\n\n function getNextPath(s) {\n var next = 'next';\n var startIndex = s.indexOf('(') + 1;\n var endIndex = s.indexOf(')');\n if (startIndex >= 0 && endIndex >= 0) {\n next = flowSymb.substring(startIndex, endIndex);\n if (next.indexOf(',') < 0) {\n if (next !== 'yes' && next !== 'no') {\n next = 'next, ' + next;\n }\n }\n }\n return next;\n }\n \n function getAnnotation(s) {\n\tvar startIndex = s.indexOf(\"(\") + 1, endIndex = s.indexOf(\")\");\n\tvar tmp = s.substring(startIndex, endIndex);\n\tif(tmp.indexOf(\",\") > 0) { tmp = tmp.substring(0, tmp.indexOf(\",\")); }\n\tvar tmp_split = tmp.split(\"@\");\n\tif(tmp_split.length > 1)\n\t\treturn startIndex >= 0 && endIndex >= 0 ? tmp_split[1] : \"\";\n }\n\n while (lines.length > 0) {\n var line = lines.splice(0, 1)[0].trim();\n\n if (line.indexOf('=>') >= 0) {\n // definition\n var parts = line.split('=>');\n var symbol = {\n key: parts[0].replace(/\\(.*\\)/, ''),\n symbolType: parts[1],\n text: null,\n link: null,\n target: null,\n flowstate: null,\n function: null,\n lineStyle: {},\n params: {}\n };\n\n //parse parameters\n var params = parts[0].match(/\\((.*)\\)/);\n if (params && params.length > 1){\n var entries = params[1].split(',');\n for(var i = 0; i < entries.length; i++) {\n var entry = entries[i].split('=');\n if (entry.length == 2) {\n symbol.params[entry[0]] = entry[1];\n }\n }\n }\n\n var sub;\n\n if (symbol.symbolType.indexOf(': ') >= 0) {\n sub = symbol.symbolType.split(': ');\n symbol.symbolType = sub.shift();\n symbol.text = sub.join(': ');\n }\n\n if (symbol.text && symbol.text.indexOf(':$') >= 0) {\n sub = symbol.text.split(':$');\n symbol.text = sub.shift();\n symbol.function = sub.join(':$');\n } else if (symbol.symbolType.indexOf(':$') >= 0) {\n sub = symbol.symbolType.split(':$');\n symbol.symbolType = sub.shift();\n symbol.function = sub.join(':$');\n } else if (symbol.text && symbol.text.indexOf(':>') >= 0) {\n sub = symbol.text.split(':>');\n symbol.text = sub.shift();\n symbol.link = sub.join(':>');\n } else if (symbol.symbolType.indexOf(':>') >= 0) {\n sub = symbol.symbolType.split(':>');\n symbol.symbolType = sub.shift();\n symbol.link = sub.join(':>');\n }\n\n if (symbol.symbolType.indexOf('\\n') >= 0) {\n symbol.symbolType = symbol.symbolType.split('\\n')[0];\n }\n\n /* adding support for links */\n if (symbol.link) {\n var startIndex = symbol.link.indexOf('[') + 1;\n var endIndex = symbol.link.indexOf(']');\n if (startIndex >= 0 && endIndex >= 0) {\n symbol.target = symbol.link.substring(startIndex, endIndex);\n symbol.link = symbol.link.substring(0, startIndex - 1);\n }\n }\n /* end of link support */\n\n /* adding support for flowstates */\n if (symbol.text) {\n if (symbol.text.indexOf('|') >= 0) {\n var txtAndState = symbol.text.split('|');\n symbol.flowstate = txtAndState.pop().trim();\n symbol.text = txtAndState.join('|');\n }\n }\n /* end of flowstate support */\n\n chart.symbols[symbol.key] = symbol;\n\n } else if (line.indexOf('->') >= 0) {\n var ann = getAnnotation(line);\n if (ann) {\n line = line.replace('@' + ann, ''); \n }\n // flow\n var flowSymbols = line.split('->');\n for (var iS = 0, lenS = flowSymbols.length; iS < lenS; iS++) {\n var flowSymb = flowSymbols[iS];\n var symbVal = getSymbValue(flowSymb);\n\n if (symbVal === 'true' || symbVal === 'false') {\n // map true or false to yes or no respectively\n flowSymb = flowSymb.replace('true', 'yes');\n flowSymb = flowSymb.replace('false', 'no');\n }\n \n var next = getNextPath(flowSymb);\n var realSymb = getSymbol(flowSymb);\n\n var direction = null;\n if (next.indexOf(',') >= 0) {\n var condOpt = next.split(',');\n next = condOpt[0];\n direction = condOpt[1].trim();\n }\n\n if (ann) {\n if (realSymb.symbolType === 'condition') {\n if (next === \"yes\" || next === \"true\") {\n realSymb.yes_annotation = ann;\n } else {\n realSymb.no_annotation = ann;\n }\n } else if (realSymb.symbolType === 'parallel') {\n if (next === 'path1') {\n realSymb.path1_annotation = ann;\n } else if (next === 'path2') {\n realSymb.path2_annotation = ann;\n } else if (next === 'path3') {\n realSymb.path3_annotation = ann;\n }\n }\n ann = null;\n }\n\n if (!chart.start) {\n chart.start = realSymb;\n }\n\n if (iS + 1 < lenS) {\n var nextSymb = flowSymbols[iS + 1];\n realSymb[next] = getSymbol(nextSymb);\n realSymb['direction_' + next] = direction;\n direction = null;\n }\n }\n } else if (line.indexOf('@>') >= 0) {\n\n // line style\n var lineStyleSymbols = line.split('@>');\n for (var iSS = 0, lenSS = lineStyleSymbols.length; iSS < lenSS; iSS++) {\n if ((iSS + 1) !== lenSS) {\n var curSymb = getSymbol(lineStyleSymbols[iSS]);\n var nextSymbol = getSymbol(lineStyleSymbols[iSS+1]);\n\n curSymb['lineStyle'][nextSymbol.key] = JSON.parse(getStyle(lineStyleSymbols[iSS + 1]));\n }\n }\n }\n\n }\n return chart;\n}\n\nmodule.exports = parse;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.parse.js\n// module id = 4\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\nvar drawAPI = require('./flowchart.functions');\nvar drawPath = drawAPI.drawPath;\n\nfunction Condition(chart, options) {\n options = options || {};\n Symbol.call(this, chart, options);\n this.yes_annotation = options.yes_annotation;\n this.no_annotation = options.no_annotation;\n this.textMargin = this.getAttr('text-margin');\n this.yes_direction = options.direction_yes;\n this.no_direction = options.direction_no;\n if (!this.no_direction && this.yes_direction === 'right') {\n this.no_direction = 'bottom';\n } else if (!this.yes_direction && this.no_direction === 'bottom') {\n this.yes_direction = 'right'\n }\n this.yes_direction = this.yes_direction || 'bottom';\n this.no_direction = this.no_direction || 'right';\n\n this.text.attr({\n x: this.textMargin * 2\n });\n\n var width = this.text.getBBox().width + 3 * this.textMargin;\n width += width/2;\n var height = this.text.getBBox().height + 2 * this.textMargin;\n height += height/2;\n height = Math.max(width * 0.5, height);\n var startX = width/4;\n var startY = height/4;\n\n this.text.attr({\n x: startX + this.textMargin/2\n });\n\n var start = {x: startX, y: startY};\n var points = [\n {x: startX - width/4, y: startY + height/4},\n {x: startX - width/4 + width/2, y: startY + height/4 + height/2},\n {x: startX - width/4 + width, y: startY + height/4},\n {x: startX - width/4 + width/2, y: startY + height/4 - height/2},\n {x: startX - width/4, y: startY + height/4}\n ];\n\n var symbol = drawPath(chart, start, points);\n\n symbol.attr({\n stroke: this.getAttr('element-color'),\n 'stroke-width': this.getAttr('line-width'),\n fill: this.getAttr('fill')\n });\n if (options.link) { symbol.attr('href', options.link); }\n if (options.target) { symbol.attr('target', options.target); }\n if (options.key) { symbol.node.id = options.key; }\n symbol.node.setAttribute('class', this.getAttr('class'));\n\n this.text.attr({\n y: symbol.getBBox().height/2\n });\n\n this.group.push(symbol);\n symbol.insertBefore(this.text);\n this.symbol = symbol\n\n this.initialize();\n}\ninherits(Condition, Symbol);\n\nCondition.prototype.render = function() {\n var self = this;\n if (this.yes_direction) {\n this[this.yes_direction + '_symbol'] = this.yes_symbol;\n }\n\n if (this.no_direction) {\n this[this.no_direction + '_symbol'] = this.no_symbol;\n }\n\n var lineLength = this.getAttr('line-length');\n\n if (this.bottom_symbol) {\n var bottomPoint = this.getBottom();\n\n if (!this.bottom_symbol.isPositioned) {\n this.bottom_symbol.shiftY(this.getY() + this.height + lineLength);\n this.bottom_symbol.setX(bottomPoint.x - this.bottom_symbol.width/2);\n this.bottom_symbol.isPositioned = true;\n\n this.bottom_symbol.render();\n }\n }\n\n if (this.right_symbol) {\n var rightPoint = this.getRight();\n\n if (!this.right_symbol.isPositioned) {\n\n this.right_symbol.setY(rightPoint.y - this.right_symbol.height/2);\n this.right_symbol.shiftX(this.group.getBBox().x + this.width + lineLength);\n\n (function shift() {\n var hasSymbolUnder = false;\n var symb;\n for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n symb = self.chart.symbols[i];\n\n if (!self.params['align-next'] || self.params['align-next'] !== 'no') { \n var diff = Math.abs(symb.getCenter().x - self.right_symbol.getCenter().x);\n if (symb.getCenter().y > self.right_symbol.getCenter().y && diff <= self.right_symbol.width/2) {\n hasSymbolUnder = true;\n break;\n }\n }\n }\n\n if (hasSymbolUnder) {\n if (self.right_symbol.symbolType === 'end') return;\n self.right_symbol.setX(symb.getX() + symb.width + lineLength);\n shift();\n }\n })();\n\n this.right_symbol.isPositioned = true;\n\n this.right_symbol.render();\n }\n }\n \n if (this.left_symbol) {\n var leftPoint = this.getLeft();\n \n if (!this.left_symbol.isPositioned) {\n this.left_symbol.setY(leftPoint.y - this.left_symbol.height / 2);\n this.left_symbol.shiftX(-(this.group.getBBox().x + this.width + lineLength));\n\n (function shift() {\n var hasSymbolUnder = false;\n var symb;\n for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n symb = self.chart.symbols[i];\n \n if (!self.params['align-next'] || self.params['align-next'] !== 'no') {\n var diff = Math.abs(symb.getCenter().x - self.left_symbol.getCenter().x);\n if (symb.getCenter().y > self.left_symbol.getCenter().y && diff <= self.left_symbol.width / 2) {\n hasSymbolUnder = true;\n break;\n }\n }\n }\n \n if (hasSymbolUnder) {\n if (self.left_symbol.symbolType === 'end') return;\n self.left_symbol.setX(symb.getX() + symb.width + lineLength);\n shift();\n }\n })();\n \n this.left_symbol.isPositioned = true;\n \n this.left_symbol.render();\n }\n }\n};\n\nCondition.prototype.renderLines = function() {\n if (this.yes_symbol) {\n this.drawLineTo(this.yes_symbol, this.yes_annotation ? this.yes_annotation : this.getAttr('yes-text'), this.yes_direction);\n }\n\n if (this.no_symbol) {\n this.drawLineTo(this.no_symbol, this.no_annotation ? this.no_annotation : this.getAttr('no-text'), this.no_direction);\n }\n};\n\nmodule.exports = Condition;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.condition.js\n// module id = 5\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\n\nfunction Parallel(chart, options) {\n var symbol = chart.paper.rect(0, 0, 0, 0);\n options = options || {};\n Symbol.call(this, chart, options, symbol);\n this.path1_annotation = options.path1_annotation || '';\n this.path2_annotation = options.path2_annotation || '';\n this.path3_annotation = options.path3_annotation || '';\n this.textMargin = this.getAttr('text-margin');\n this.path1_direction = 'bottom';\n this.path2_direction = 'right';\n this.path3_direction = 'top';\n this.params = options.params;\n if (options.direction_next === 'path1' && !options[options.direction_next] && options.next) {\n options[options.direction_next] = options.next;\n }\n if (options.direction_next === 'path2' && !options[options.direction_next] && options.next) {\n options[options.direction_next] = options.next;\n }\n if (options.direction_next === 'path3' && !options[options.direction_next] && options.next) {\n options[options.direction_next] = options.next;\n }\n\n if (options.path1 && options.direction_path1 && options.path2 && !options.direction_path2 && options.path3 && !options.direction_path3) {\n if (options.direction_path1 === 'right') {\n this.path2_direction = 'bottom';\n this.path1_direction = 'right';\n this.path3_direction = 'top';\n } else if (options.direction_path1 === 'top') {\n this.path2_direction = 'right';\n this.path1_direction = 'top';\n this.path3_direction = 'bottom';\n } else if (options.direction_path1 === 'left') {\n this.path2_direction = 'right';\n this.path1_direction = 'left';\n this.path3_direction = 'bottom';\n } else {\n this.path2_direction = 'right';\n this.path1_direction = 'bottom';\n this.path3_direction = 'top';\n }\n } else if (options.path1 && !options.direction_path1 && options.path2 && options.direction_path2 && options.path3 && !options.direction_path3) {\n if (options.direction_path2 === 'right') {\n this.path1_direction = 'bottom';\n this.path2_direction = 'right';\n this.path3_direction = 'top';\n } else if (options.direction_path2 === 'left') {\n this.path1_direction = 'bottom';\n this.path2_direction = 'left';\n this.path3_direction = 'right';\n } else {\n this.path1_direction = 'right';\n this.path2_direction = 'bottom';\n this.path3_direction = 'top';\n }\n } else if (options.path1 && !options.direction_path1 && options.path2 && !options.direction_path2 && options.path3 && options.direction_path3) {\n if (options.direction_path2 === 'right') {\n this.path1_direction = 'bottom';\n this.path2_direction = 'top';\n this.path3_direction = 'right';\n } else if (options.direction_path2 === 'left') {\n this.path1_direction = 'bottom';\n this.path2_direction = 'right';\n this.path3_direction = 'left';\n } else {\n this.path1_direction = 'right';\n this.path2_direction = 'bottom';\n this.path3_direction = 'top';\n }\n } else {\n this.path1_direction = options.direction_path1;\n this.path2_direction = options.direction_path2;\n this.path3_direction = options.direction_path3;\n }\n\n this.path1_direction = this.path1_direction || 'bottom';\n this.path2_direction = this.path2_direction || 'right';\n this.path3_direction = this.path3_direction || 'top';\n\n this.initialize();\n}\ninherits(Parallel, Symbol);\n\nParallel.prototype.render = function() {\n if (this.path1_direction) {\n this[this.path1_direction + '_symbol'] = this.path1_symbol;\n }\n\n if (this.path2_direction) {\n this[this.path2_direction + '_symbol'] = this.path2_symbol;\n }\n\n if (this.path3_direction) {\n this[this.path3_direction + '_symbol'] = this.path3_symbol;\n }\n\n var lineLength = this.getAttr('line-length');\n\n if (this.bottom_symbol) {\n var bottomPoint = this.getBottom();\n\n if (!this.bottom_symbol.isPositioned) {\n this.bottom_symbol.shiftY(this.getY() + this.height + lineLength);\n this.bottom_symbol.setX(bottomPoint.x - this.bottom_symbol.width / 2);\n this.bottom_symbol.isPositioned = true;\n\n this.bottom_symbol.render();\n }\n }\n\n if (this.top_symbol) {\n var topPoint = this.getTop();\n\n if (!this.top_symbol.isPositioned) {\n this.top_symbol.shiftY(this.getY() - this.top_symbol.height - lineLength);\n this.top_symbol.setX(topPoint.x + this.top_symbol.width);\n this.top_symbol.isPositioned = true;\n\n this.top_symbol.render();\n }\n }\n\n var self = this;\n\n if (this.left_symbol) {\n var leftPoint = this.getLeft();\n\n if (!this.left_symbol.isPositioned) {\n this.left_symbol.setY(leftPoint.y - this.left_symbol.height / 2);\n this.left_symbol.shiftX(-(this.group.getBBox().x + this.width + lineLength));\n (function shift() {\n var hasSymbolUnder = false;\n var symb;\n for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n symb = self.chart.symbols[i];\n\n if (!self.params['align-next'] || self.params['align-next'] !== 'no') {\n var diff = Math.abs(symb.getCenter().x - self.left_symbol.getCenter().x);\n if (symb.getCenter().y > self.left_symbol.getCenter().y && diff <= self.left_symbol.width / 2) {\n hasSymbolUnder = true;\n break;\n }\n }\n }\n\n if (hasSymbolUnder) {\n if (self.left_symbol.symbolType === 'end') return;\n self.left_symbol.setX(symb.getX() + symb.width + lineLength);\n shift();\n }\n })();\n\n this.left_symbol.isPositioned = true;\n\n this.left_symbol.render();\n }\n }\n\n if (this.right_symbol) {\n var rightPoint = this.getRight();\n\n if (!this.right_symbol.isPositioned) {\n this.right_symbol.setY(rightPoint.y - this.right_symbol.height / 2);\n this.right_symbol.shiftX(this.group.getBBox().x + this.width + lineLength);\n (function shift() {\n var hasSymbolUnder = false;\n var symb;\n for (var i = 0, len = self.chart.symbols.length; i < len; i++) {\n symb = self.chart.symbols[i];\n\n if (!self.params['align-next'] || self.params['align-next'] !== 'no') {\n var diff = Math.abs(symb.getCenter().x - self.right_symbol.getCenter().x);\n if (symb.getCenter().y > self.right_symbol.getCenter().y && diff <= self.right_symbol.width / 2) {\n hasSymbolUnder = true;\n break;\n }\n }\n }\n\n if (hasSymbolUnder) {\n if (self.right_symbol.symbolType === 'end') return;\n self.right_symbol.setX(symb.getX() + symb.width + lineLength);\n shift();\n }\n })();\n\n this.right_symbol.isPositioned = true;\n\n this.right_symbol.render();\n }\n }\n};\n\nParallel.prototype.renderLines = function() {\n if (this.path1_symbol) {\n this.drawLineTo(this.path1_symbol, this.path1_annotation, this.path1_direction);\n }\n\n if (this.path2_symbol) {\n this.drawLineTo(this.path2_symbol, this.path2_annotation, this.path2_direction);\n }\n\n if (this.path3_symbol) {\n this.drawLineTo(this.path3_symbol, this.path3_annotation, this.path3_direction);\n }\n};\n\nmodule.exports = Parallel;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.parallel.js\n// module id = 6\n// module chunks = 0","var Raphael = require('raphael');\nvar defaults = require('./flowchart.helpers').defaults;\nvar defaultOptions = require('./flowchart.defaults');\nvar Condition = require('./flowchart.symbol.condition');\nvar Parallel = require('./flowchart.symbol.parallel');\n\nfunction FlowChart(container, options) {\n options = options || {};\n\n this.paper = new Raphael(container);\n\n this.options = defaults(options, defaultOptions);\n\n this.symbols = [];\n this.lines = [];\n this.start = null;\n}\n\nFlowChart.prototype.handle = function(symbol) {\n if (this.symbols.indexOf(symbol) <= -1) {\n this.symbols.push(symbol);\n }\n\n var flowChart = this;\n\n if (symbol instanceof(Condition)) {\n symbol.yes = function(nextSymbol) {\n symbol.yes_symbol = nextSymbol;\n if(symbol.no_symbol) {\n symbol.pathOk = true;\n }\n return flowChart.handle(nextSymbol);\n };\n symbol.no = function(nextSymbol) {\n symbol.no_symbol = nextSymbol;\n if (symbol.yes_symbol) {\n symbol.pathOk = true;\n }\n return flowChart.handle(nextSymbol);\n };\n } else if (symbol instanceof(Parallel)) {\n symbol.path1 = function(nextSymbol) {\n symbol.path1_symbol = nextSymbol;\n if (symbol.path2_symbol) {\n symbol.pathOk = true;\n }\n return flowChart.handle(nextSymbol);\n };\n symbol.path2 = function(nextSymbol) {\n symbol.path2_symbol = nextSymbol;\n if (symbol.path3_symbol) {\n symbol.pathOk = true;\n }\n return flowChart.handle(nextSymbol);\n };\n symbol.path3 = function(nextSymbol) {\n symbol.path3_symbol = nextSymbol;\n if (symbol.path1_symbol) {\n symbol.pathOk = true;\n }\n return flowChart.handle(nextSymbol);\n };\n } else {\n symbol.then = function(nextSymbol) {\n symbol.next = nextSymbol;\n symbol.pathOk = true;\n return flowChart.handle(nextSymbol);\n };\n }\n\n return symbol;\n};\n\nFlowChart.prototype.startWith = function(symbol) {\n this.start = symbol;\n return this.handle(symbol);\n};\n\nFlowChart.prototype.render = function() {\n var maxWidth = 0,\n maxHeight = 0,\n i = 0,\n len = 0,\n maxX = 0,\n maxY = 0,\n minX = 0,\n minY = 0,\n symbol,\n line;\n\n for (i = 0, len = this.symbols.length; i < len; i++) {\n symbol = this.symbols[i];\n if (symbol.width > maxWidth) {\n maxWidth = symbol.width;\n }\n if (symbol.height > maxHeight) {\n maxHeight = symbol.height;\n }\n }\n\n for (i = 0, len = this.symbols.length; i < len; i++) {\n symbol = this.symbols[i];\n symbol.shiftX(this.options.x + (maxWidth - symbol.width)/2 + this.options['line-width']);\n symbol.shiftY(this.options.y + (maxHeight - symbol.height)/2 + this.options['line-width']);\n }\n\n this.start.render();\n // for (i = 0, len = this.symbols.length; i < len; i++) {\n // symbol = this.symbols[i];\n // symbol.render();\n // }\n\n for (i = 0, len = this.symbols.length; i < len; i++) {\n symbol = this.symbols[i];\n symbol.renderLines();\n }\n\n maxX = this.maxXFromLine;\n\n var x;\n var y;\n\n for (i = 0, len = this.symbols.length; i < len; i++) {\n symbol = this.symbols[i];\n var leftX = symbol.getX()\n x = leftX + symbol.width;\n y = symbol.getY() + symbol.height;\n if (leftX < minX) {\n minX = leftX;\n }\n if (x > maxX) {\n maxX = x;\n }\n if (y > maxY) {\n maxY = y;\n }\n }\n\n for (i = 0, len = this.lines.length; i < len; i++) {\n line = this.lines[i].getBBox();\n x = line.x;\n y = line.y;\n var x2 = line.x2;\n var y2 = line.y2;\n if (x < minX) {\n minX = x;\n }\n if (y < minY) {\n minY = y;\n }\n if (x2 > maxX) {\n maxX = x2;\n }\n if (y2 > maxY) {\n maxY = y2;\n }\n }\n\n var scale = this.options['scale'];\n var lineWidth = this.options['line-width'];\n\n if (this.minXFromSymbols < minX) minX = this.minXFromSymbols;\n\n if (minX < 0) minX -= lineWidth;\n if (minY < 0) minY -= lineWidth;\n\n var width = maxX + lineWidth - minX;\n var height = maxY + lineWidth - minY;\n\n this.paper.setSize(width * scale, height * scale);\n this.paper.setViewBox(minX, minY, width, height, true);\n};\n\nFlowChart.prototype.clean = function() {\n if (this.paper) {\n var paperDom = this.paper.canvas;\n paperDom.parentNode && paperDom.parentNode.removeChild(paperDom);\n }\n};\n\nmodule.exports = FlowChart;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.chart.js\n// module id = 7\n// module chunks = 0","// defaults\nmodule.exports = {\n 'x': 0,\n 'y': 0,\n // 'roundness': 0,\n 'line-width': 3,\n 'line-length': 50,\n 'text-margin': 10,\n 'font-size': 14,\n 'font-color': 'black',\n // 'font': 'normal',\n // 'font-family': 'calibri',\n // 'font-weight': 'normal',\n 'line-color': 'black',\n 'element-color': 'black',\n 'fill': 'white',\n 'yes-text': 'yes',\n 'no-text': 'no',\n 'arrow-end': 'block',\n 'class': 'flowchart',\n 'scale': 1,\n 'symbols': {\n 'start': {},\n 'end': {},\n 'condition': {},\n 'inputoutput': {},\n 'input': {}, //tds\n 'output': {}, //tds \n 'operation': {},\n 'subroutine': {},\n 'parallel': {}\n } //,\n // 'flowstate' : {\n // 'past' : { 'fill': '#CCCCCC', 'font-size': 12},\n // 'current' : {'fill': 'yellow', 'font-color': 'red', 'font-weight': 'bold'},\n // 'future' : { 'fill': '#FFFF99'},\n // 'invalid': {'fill': '#444444'}\n // }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.defaults.js\n// module id = 8\n// module chunks = 0","// add indexOf to non ECMA-262 standard compliant browsers\nif (!Array.prototype.indexOf) {\n Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {\n \"use strict\";\n if (this === null) {\n throw new TypeError();\n }\n var t = Object(this);\n var len = t.length >>> 0;\n if (len === 0) {\n return -1;\n }\n var n = 0;\n if (arguments.length > 0) {\n n = Number(arguments[1]);\n if (n != n) { // shortcut for verifying if it's NaN\n n = 0;\n } else if (n !== 0 && n != Infinity && n != -Infinity) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n }\n if (n >= len) {\n return -1;\n }\n var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);\n for (; k < len; k++) {\n if (k in t && t[k] === searchElement) {\n return k;\n }\n }\n return -1;\n };\n}\n\n// add lastIndexOf to non ECMA-262 standard compliant browsers\nif (!Array.prototype.lastIndexOf) {\n Array.prototype.lastIndexOf = function(searchElement /*, fromIndex*/) {\n \"use strict\";\n if (this === null) {\n throw new TypeError();\n }\n var t = Object(this);\n var len = t.length >>> 0;\n if (len === 0) {\n return -1;\n }\n var n = len;\n if (arguments.length > 1) {\n n = Number(arguments[1]);\n if (n != n) {\n n = 0;\n } else if (n !== 0 && n != (1 / 0) && n != -(1 / 0)) {\n n = (n > 0 || -1) * Math.floor(Math.abs(n));\n }\n }\n var k = n >= 0 ? Math.min(n, len - 1) : len - Math.abs(n);\n for (; k >= 0; k--) {\n if (k in t && t[k] === searchElement) {\n return k;\n }\n }\n return -1;\n };\n}\n\nif (!String.prototype.trim) {\n String.prototype.trim = function() {\n return this.replace(/^\\s+|\\s+$/g, '');\n };\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.shim.js\n// module id = 9\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\n\nfunction End(chart, options) {\n var symbol = chart.paper.rect(0, 0, 0, 0, 20);\n options = options || {};\n options.text = options.text || 'End';\n Symbol.call(this, chart, options, symbol);\n}\ninherits(End, Symbol);\n\nmodule.exports = End;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.end.js\n// module id = 10\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\nvar drawAPI = require('./flowchart.functions');\nvar drawPath = drawAPI.drawPath;\n\nfunction Input(chart, options) {\n options = options || {};\n Symbol.call(this, chart, options);\n this.textMargin = this.getAttr('text-margin');\n\n this.text.attr({\n x: this.textMargin * 3\n });\n\n var width = this.text.getBBox().width + 4 * this.textMargin;\n var height = this.text.getBBox().height + 2 * this.textMargin;\n var startX = this.textMargin;\n var startY = height/2;\n\n var start = {x: startX, y: startY};\n var points = [\n {x: startX - this.textMargin + 2 * this.textMargin, y: height},\n {x: startX - this.textMargin + width, y: height},\n {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},\n {x: startX - this.textMargin, y: 0},\n {x: startX, y: startY}\n ];\n\n var symbol = drawPath(chart, start, points);\n\n symbol.attr({\n stroke: this.getAttr('element-color'),\n 'stroke-width': this.getAttr('line-width'),\n fill: this.getAttr('fill')\n });\n if (options.link) { symbol.attr('href', options.link); }\n if (options.target) { symbol.attr('target', options.target); }\n if (options.key) { symbol.node.id = options.key; }\n symbol.node.setAttribute('class', this.getAttr('class'));\n\n this.text.attr({\n y: symbol.getBBox().height/2\n });\n\n this.group.push(symbol);\n symbol.insertBefore(this.text);\n this.symbol = symbol\n\n this.initialize();\n}\ninherits(Input, Symbol);\n\nInput.prototype.getLeft = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX() + this.textMargin;\n return {x: x, y: y};\n};\n\nInput.prototype.getRight = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX() + this.group.getBBox().width - this.textMargin;\n return {x: x, y: y};\n};\n\nmodule.exports = Input;\n\n\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.input.js\n// module id = 11\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\nvar drawAPI = require('./flowchart.functions');\nvar drawPath = drawAPI.drawPath;\n\nfunction InputOutput(chart, options) {\n options = options || {};\n Symbol.call(this, chart, options);\n this.textMargin = this.getAttr('text-margin');\n\n this.text.attr({\n x: this.textMargin * 3\n });\n\n var width = this.text.getBBox().width + 4 * this.textMargin;\n var height = this.text.getBBox().height + 2 * this.textMargin;\n var startX = this.textMargin;\n var startY = height/2;\n\n var start = {x: startX, y: startY};\n var points = [\n {x: startX - this.textMargin, y: height},\n {x: startX - this.textMargin + width, y: height},\n {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},\n {x: startX - this.textMargin + 2 * this.textMargin, y: 0},\n {x: startX, y: startY}\n ];\n\n var symbol = drawPath(chart, start, points);\n\n symbol.attr({\n stroke: this.getAttr('element-color'),\n 'stroke-width': this.getAttr('line-width'),\n fill: this.getAttr('fill')\n });\n if (options.link) { symbol.attr('href', options.link); }\n if (options.target) { symbol.attr('target', options.target); }\n if (options.key) { symbol.node.id = options.key; }\n symbol.node.setAttribute('class', this.getAttr('class'));\n\n this.text.attr({\n y: symbol.getBBox().height/2\n });\n\n this.group.push(symbol);\n symbol.insertBefore(this.text);\n this.symbol = symbol\n\n this.initialize();\n}\ninherits(InputOutput, Symbol);\n\nInputOutput.prototype.getLeft = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX() + this.textMargin;\n return {x: x, y: y};\n};\n\nInputOutput.prototype.getRight = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX() + this.group.getBBox().width - this.textMargin;\n return {x: x, y: y};\n};\n\nmodule.exports = InputOutput;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.inputoutput.js\n// module id = 12\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\n\nfunction Operation(chart, options) {\n var symbol = chart.paper.rect(0, 0, 0, 0);\n options = options || {};\n Symbol.call(this, chart, options, symbol);\n}\ninherits(Operation, Symbol);\n\nmodule.exports = Operation;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.operation.js\n// module id = 13\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\nvar drawAPI = require('./flowchart.functions');\nvar drawPath = drawAPI.drawPath;\n\nfunction Output(chart, options) {\n options = options || {};\n Symbol.call(this, chart, options);\n this.textMargin = this.getAttr('text-margin');\n\n this.text.attr({\n x: this.textMargin * 3\n });\n\n var width = this.text.getBBox().width + 4 * this.textMargin;\n var height = this.text.getBBox().height + 2 * this.textMargin;\n var startX = this.textMargin;\n var startY = height/2;\n\n var start = {x: startX, y: startY};\n var points = [\n {x: startX - this.textMargin, y: height},\n {x: startX - this.textMargin + width + 2 * this.textMargin, y: height},\n {x: startX - this.textMargin + width, y: 0},\n {x: startX - this.textMargin + 2 * this.textMargin, y: 0},\n {x: startX, y: startY}\n ];\n\n var symbol = drawPath(chart, start, points);\n\n symbol.attr({\n stroke: this.getAttr('element-color'),\n 'stroke-width': this.getAttr('line-width'),\n fill: this.getAttr('fill')\n });\n if (options.link) { symbol.attr('href', options.link); }\n if (options.target) { symbol.attr('target', options.target); }\n if (options.key) { symbol.node.id = options.key; }\n symbol.node.setAttribute('class', this.getAttr('class'));\n\n this.text.attr({\n y: symbol.getBBox().height/2\n });\n\n this.group.push(symbol);\n symbol.insertBefore(this.text);\n this.symbol = symbol\n\n this.initialize();\n}\ninherits(Output, Symbol);\n\nOutput.prototype.getLeft = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX() + this.textMargin;\n return {x: x, y: y};\n};\n\nOutput.prototype.getRight = function() {\n var y = this.getY() + this.group.getBBox().height/2;\n var x = this.getX() + this.group.getBBox().width - this.textMargin;\n return {x: x, y: y};\n};\n\nmodule.exports = Output;\n\n\n\n/*\n//var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\nvar drawAPI = require('./flowchart.functions');\nvar InputOutput = require('./flowchart.symbol.inputoutput');\nvar drawPath = drawAPI.drawPath;\n\nfunction Output(chart, options) {\n options = options || {};\n InputOutput.call(this, chart, options);\n\n var width = this.text.getBBox().width + 4 * this.textMargin;\n var height = this.text.getBBox().height + 2 * this.textMargin;\n var startX = this.textMargin;\n var startY = height/2;\n\n var start = {x: startX, y: startY};\n var points = [\n {x: startX - this.textMargin + 2 * this.textMargin, y: height},\n {x: startX - this.textMargin + width, y: height},\n {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},\n {x: startX - this.textMargin, y: 0},\n {x: startX, y: startY}\n ];\n\n var symbol = drawPath(chart, start, points);\n\n symbol.attr({\n stroke: this.getAttr('element-color'),\n 'stroke-width': this.getAttr('line-width'),\n fill: this.getAttr('fill')\n });\n if (options.link) { symbol.attr('href', options.link); }\n if (options.target) { symbol.attr('target', options.target); }\n if (options.key) { symbol.node.id = options.key; }\n symbol.node.setAttribute('class', this.getAttr('class'));\n\n this.text.attr({\n y: symbol.getBBox().height/2\n });\n\n this.group.push(symbol);\n symbol.insertBefore(this.text);\n \n if (this.symbol){\n this.group.remove(this.symbol); //tds\n this.symbol.parentNode.removeChild(this.symbol); //tds\n }\n this.symbol = symbol\n\n this.initialize();\n}\ninherits(Output, InputOutput);\n\nmodule.exports = Output;\n*/\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.output.js\n// module id = 14\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\n\nfunction Start(chart, options) {\n var symbol = chart.paper.rect(0, 0, 0, 0, 20);\n options = options || {};\n options.text = options.text || 'Start';\n Symbol.call(this, chart, options, symbol);\n}\ninherits(Start, Symbol);\n\nmodule.exports = Start;\n\n// Start.prototype.render = function() {\n// if (this.next) {\n// var lineLength = this.chart.options.symbols[this.symbolType]['line-length'] || this.chart.options['line-length'];\n\n// var bottomPoint = this.getBottom();\n// var topPoint = this.next.getTop();\n\n// if (!this.next.isPositioned) {\n// this.next.shiftY(this.getY() + this.height + lineLength);\n// this.next.setX(bottomPoint.x - this.next.width/2);\n// this.next.isPositioned = true;\n\n// this.next.render();\n// }\n// }\n// };\n\n// Start.prototype.renderLines = function() {\n// if (this.next) {\n// this.drawLineTo(this.next);\n// }\n// };\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.start.js\n// module id = 15\n// module chunks = 0","var Symbol = require('./flowchart.symbol');\nvar inherits = require('./flowchart.helpers').inherits;\n\nfunction Subroutine(chart, options) {\n var symbol = chart.paper.rect(0, 0, 0, 0);\n options = options || {};\n Symbol.call(this, chart, options, symbol);\n\n symbol.attr({\n width: this.text.getBBox().width + 4 * this.getAttr('text-margin')\n });\n\n this.text.attr({\n 'x': 2 * this.getAttr('text-margin')\n });\n\n var innerWrap = chart.paper.rect(0, 0, 0, 0);\n innerWrap.attr({\n x: this.getAttr('text-margin'),\n stroke: this.getAttr('element-color'),\n 'stroke-width': this.getAttr('line-width'),\n width: this.text.getBBox().width + 2 * this.getAttr('text-margin'),\n height: this.text.getBBox().height + 2 * this.getAttr('text-margin'),\n fill: this.getAttr('fill')\n });\n if (options.key) { innerWrap.node.id = options.key + 'i'; }\n\n var font = this.getAttr('font');\n var fontF = this.getAttr('font-family');\n var fontW = this.getAttr('font-weight');\n\n if (font) innerWrap.attr({ 'font': font });\n if (fontF) innerWrap.attr({ 'font-family': fontF });\n if (fontW) innerWrap.attr({ 'font-weight': fontW });\n\n if (options.link) { innerWrap.attr('href', options.link); }\n if (options.target) { innerWrap.attr('target', options.target); }\n this.group.push(innerWrap);\n innerWrap.insertBefore(this.text);\n\n this.initialize();\n}\ninherits(Subroutine, Symbol);\n\nmodule.exports = Subroutine;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/flowchart.symbol.subroutine.js\n// module id = 16\n// module chunks = 0","if (typeof jQuery != 'undefined') {\n\tvar parse = require('./flowchart.parse');\n\n\t(function( $ ) {\n\t\tfunction paramFit(needle, haystack) {\n\t\t\treturn needle == haystack ||\n\t\t\t( Array.isArray(haystack) && (haystack.includes(needle) || haystack.includes(Number(needle)) ))\n\t\t}\n\t\tvar methods = {\n\t\t\tinit : function(options) {\n\t\t\t\treturn this.each(function() {\n\t\t\t\t\tvar $this = $(this);\n\t\t\t\t\tthis.chart = parse($this.text());\n\t\t\t\t\t$this.html('');\n\t\t\t\t\tthis.chart.drawSVG(this, options);\n\t\t\t\t});\n\t\t\t},\n\t\t\tsetFlowStateByParam : function(param, paramValue, newFlowState) {\n\t\t\t\treturn this.each(function() {\n\t\t\t\t\tvar chart = this.chart;\n\n\t\t\t\t\t// @todo this should be part of Symbol API\n\t\t\t\t\tvar nextSymbolKeys = ['next', 'yes', 'no', 'path1', 'path2', 'path3'];\n\n\t\t\t\t\tfor (var property in chart.symbols) {\n\t\t\t\t\t\tif (chart.symbols.hasOwnProperty(property)) {\n\t\t\t\t\t\t\tvar symbol = chart.symbols[property];\n\t\t\t\t\t\t\tvar val = symbol.params[param];\n\t\t\t\t\t\t\tif (paramFit(val, paramValue)) {\n\t\t\t\t\t\t\t\tsymbol.flowstate = newFlowState;\n\t\t\t\t\t\t\t\tfor (var nski = 0; nski < nextSymbolKeys.length; nski++) {\n\t\t\t\t\t\t\t\t\tvar nextSymbolKey = nextSymbolKeys[nski];\n\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\tsymbol[nextSymbolKey] &&\n\t\t\t\t\t\t\t\t\t\tsymbol[nextSymbolKey]['params'] &&\n\t\t\t\t\t\t\t\t\t\tsymbol[nextSymbolKey]['params'][param] &&\n\t\t\t\t\t\t\t\t\t\tparamFit(symbol[nextSymbolKey]['params'][param], paramValue)\n\t\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t\tsymbol.lineStyle[symbol[nextSymbolKey]['key']] = {stroke: chart.options()['flowstate'][newFlowState]['fill']};\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tchart.clean();\n\t\t\t\t\tchart.drawSVG(this);\n\t\t\t\t});\n\n\t\t\t},\n\t\t\tclearFlowState: function () {\n\t\t\t\treturn this.each(function() {\n\t\t\t\t\tvar chart = this.chart;\n\n\t\t\t\t\tfor (var property in chart.symbols) {\n\t\t\t\t\t\tif (chart.symbols.hasOwnProperty(property)) {\n\t\t\t\t\t\t\tvar node = chart.symbols[property];\n\t\t\t\t\t\t\tnode.flowstate = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tchart.clean();\n\t\t\t\t\tchart.drawSVG(this);\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t$.fn.flowChart = function(methodOrOptions) {\n\t\t\tif ( methods[methodOrOptions] ) {\n\t\t\t\treturn methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));\n\t\t\t} else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {\n\t\t\t\t// Default to \"init\"\n\t\t\t\treturn methods.init.apply( this, arguments );\n\t\t\t} else {\n\t\t\t\t$.error( 'Method ' + methodOrOptions + ' does not exist on jQuery.flowChart' );\n\t\t\t}\n\t\t};\n\n\t})(jQuery); // eslint-disable-line\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/jquery-plugin.js\n// module id = 17\n// module chunks = 0","module.exports = __WEBPACK_EXTERNAL_MODULE_18__;\n\n\n//////////////////\n// WEBPACK FOOTER\n// external \"Raphael\"\n// module id = 18\n// module chunks = 0"],"sourceRoot":""}
\ No newline at end of file
diff --git a/release/flowchart.min.map b/release/flowchart.min.map
deleted file mode 100644
index a29df8e7..00000000
--- a/release/flowchart.min.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"flowchart.min.js","sources":["../bin/flowchart-latest.js"],"names":["_defaults","options","defaultOptions","merged","attrname","_inherits","ctor","superCtor","Object","super_","prototype","create","constructor","value","enumerable","writable","configurable","TempCtor","drawPath","chart","location","points","i","len","path","length","pathValues","x","y","push","symbol","paper","attr","font","fontF","fontW","font-family","font-weight","drawLine","from","to","text","toString","call","line","stroke","stroke-width","arrow-end","centerText","textPath","isHorizontal","firstTo","getBBox","width","height","text-anchor","font-size","fill","checkLineIntersection","line1StartX","line1StartY","line1EndX","line1EndY","line2StartX","line2StartY","line2EndX","line2EndY","denominator","a","b","numerator1","numerator2","result","onLine1","onLine2","FlowChart","container","this","Raphael","f","defaults","o","symbols","lines","start","Symbol","group","set","connectedTo","symbolType","flowstate","next_direction","next","undefined","key","node","id","setAttribute","getAttr","link","target","maxWidth","words","split","tempText","ii","word","substring","tmpMargin","insertBefore","initialize","Start","rect","End","Operation","Subroutine","innerWrap","InputOutput","textMargin","startX","startY","Condition","yes_direction","no_direction","yes","no","Math","max","parse","input","getSymbol","s","startIndex","indexOf","endIndex","getNextPath","flowSymb","trim","drawSVG","getDisplaySymbol","dispSymbols","diagram","Error","self","clean","constructChart","prevDisp","prev","dispSymb","startWith","pathOk","then","render","prevBreak","i0","i0len","line0","replace","substr","l","currentLine","splice","sub","parts","txtAndState","flowSymbols","lenS","realSymb","direction","condOpt","nextSymb","Array","searchElement","TypeError","t","n","arguments","Number","Infinity","floor","abs","k","lastIndexOf","min","String","root","flowchart","module","exports","line-width","line-length","text-margin","font-color","line-color","element-color","yes-text","no-text","class","scale","end","condition","inputoutput","operation","subroutine","inherits","handle","flowChart","nextSymbol","yes_symbol","no_symbol","maxHeight","maxX","maxY","shiftX","shiftY","renderLines","maxXFromLine","getX","getY","lineWidth","setSize","setViewBox","paperDom","canvas","parentNode","removeChild","attName","opt1","opt3","opt2","transform","getCenter","setX","setY","getTop","getBottom","getLeft","getRight","lineLength","rightPoint","isPositioned","shift","symb","hasSymbolUnder","diff","bottomPoint","drawLineTo","origin","right","bottom","left","symbolX","symbolY","symbolTop","symbolRight","symbolLeft","isOnSameColumn","isOnSameLine","isUnder","isUpper","isLeft","isRight","lineWith","rightStart","topEnd","bottomStart","diffX","leftStart","leftEnd","rightEnd","llen","otherLine","ePath","lPath","iP","lenP","newPath","line1_from_x","line1_from_y","line1_to_x","line1_to_y","lP","lenlP","newLinePath","line2_from_x","line2_from_y","line2_to_x","line2_to_y","res","newSegment","bottom_symbol","right_symbol"],"mappings":"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"}
\ No newline at end of file
diff --git a/release/flowchart.zip b/release/flowchart.zip
deleted file mode 100644
index 0778d4d1..00000000
Binary files a/release/flowchart.zip and /dev/null differ
diff --git a/releasenotes.md b/releasenotes.md
index 38210b81..b23ca65d 100644
--- a/releasenotes.md
+++ b/releasenotes.md
@@ -1,3 +1,127 @@
+### v1.18.0
+
+- introduce input and output [#251](https://github.com/adrai/flowchart.js/pull/251)
+
+### v1.17.1
+
+- fix start and end roundness introduced in [#227](https://github.com/adrai/flowchart.js/pull/227)
+
+### v1.17.0
+
+- Styling to allow rounded corners [#227](https://github.com/adrai/flowchart.js/pull/227)
+
+### v1.16.0
+
+- Custom annotations for parallel [#225](https://github.com/adrai/flowchart.js/issues/225)
+
+### v1.15.0
+
+- Introduce types [#214](https://github.com/adrai/flowchart.js/pull/214) thanks to [Mister-Hope](https://github.com/Mister-Hope)
+
+### v1.14.3
+
+- Removed types introduced in [#212](https://github.com/adrai/flowchart.js/pull/212) again
+
+### v1.14.2
+
+- Basic types [#212](https://github.com/adrai/flowchart.js/pull/212) thanks to [DerMolly](https://github.com/DerMolly)
+
+### v1.14.1
+
+- Corrected condition behavior and fixed layout [#211](https://github.com/adrai/flowchart.js/pull/211) thanks to [AlexanderMisel](https://github.com/AlexanderMisel)
+
+### v1.14.0
+
+- Custom annotations [#209](https://github.com/adrai/flowchart.js/pull/209) thanks to [serpent-charmer](https://github.com/serpent-charmer)
+
+
+### v1.13.0
+
+- Provide low cost means of lines not colliding until they converge [#191](https://github.com/adrai/flowchart.js/pull/191) thanks to [robertleeplummerjr](https://github.com/robertleeplummerjr)
+- update raphael dependency
+
+
+### v1.12.3
+
+- Cleaning error fix, Linestyle parsing cycle fix, Dynamic flowState update [#188](https://github.com/adrai/flowchart.js/pull/188) thanks to [murich](https://github.com/murich)
+
+
+### v1.12.2
+
+- shrink npm package
+
+
+### v1.12.1
+
+- Fix params bug [#173](https://github.com/adrai/flowchart.js/pull/173) thanks to [leo108](https://github.com/leo108)
+
+
+### v1.12.0
+
+- onclick function binding to chart nodes [#172](https://github.com/adrai/flowchart.js/pull/172) thanks to [ndrqu](https://github.com/ndrqu)
+
+
+### v1.11.3
+
+- try to optimize horizontal rendering for end symbols [#155](https://github.com/adrai/flowchart.js/issues/155)
+
+### v1.11.2
+
+- try to optimize left handling [#152](https://github.com/adrai/flowchart.js/issues/152)
+
+### v1.11.1
+
+- fix direction issue for condition [#151](https://github.com/adrai/flowchart.js/issues/151)
+
+### v1.11.0
+
+- Add parallel component [#145](https://github.com/adrai/flowchart.js/pull/145) thanks to [sudhakar-sekar](https://github.com/sudhakar-sekar)
+
+### v1.9.0
+
+- Add arrow-text attribute to symbols [#141](https://github.com/adrai/flowchart.js/pull/141) thanks to [josephtocci](https://github.com/josephtocci)
+
+### v1.8.0
+
+- Allow Conditional to support 'true' or 'false' along with 'yes' and 'no' [#128](https://github.com/adrai/flowchart.js/pull/128) thanks to [bhedge](https://github.com/bhedge)
+
+### v1.7.0
+
+- add parameter to disable vertical alignment of condition symbol [#115](https://github.com/adrai/flowchart.js/pull/115) thanks to [bertrandmartel](https://github.com/bertrandmartel)
+- add line style flow support [#113](https://github.com/adrai/flowchart.js/pull/115) thanks to [bertrandmartel](https://github.com/bertrandmartel)
+
+### v1.6.6
+
+- Fix disruptive space char when parsing [#105](https://github.com/adrai/flowchart.js/pull/105)
+
+### v1.6.5
+
+- set proper engine version in package.json
+
+### v1.6.4
+
+- raphael now is an npm dependency (not the git reference anymore)
+
+### v1.6.3
+
+- Allow going to same symbol thanks to [nonylene](https://github.com/nonylene) [#83](https://github.com/adrai/flowchart.js/pull/83)
+
+### v1.6.2
+
+- Fixed not calculate viewBox and size properly thanks to [jackycute](https://github.com/jackycute) [#74](https://github.com/adrai/flowchart.js/issues/#74)
+
+### v1.6.1
+
+- Fixed lines are not included in the calculation of viewBox and size thanks to [jackycute](https://github.com/jackycute) [#72](https://github.com/adrai/flowchart.js/issues/#72) [#67](https://github.com/adrai/flowchart.js/issues/#67)
+
+### v1.6.0
+
+- changed build to use only webpack thanks to [sergeyt](https://github.com/sergeyt) [#70](https://github.com/adrai/flowchart.js/issues/70)
+
+### v1.4.2
+
+- optimized handling of special characters thanks to the advice of [Badhumvee](https://github.com/Badhumvee)
+
### v1.4.0
- Support scale option [#52](https://github.com/adrai/flowchart.js/pull/52) thanks to [hikarock](https://github.com/hikarock)
diff --git a/site b/site
index e5992caa..63921d93 160000
--- a/site
+++ b/site
@@ -1 +1 @@
-Subproject commit e5992caac6049101e6934ceab5b6d7a65483a823
+Subproject commit 63921d93a0b949df86d73f669155e188704b75b5
diff --git a/src/amd.js b/src/amd.js
deleted file mode 100644
index ab2c5b1d..00000000
--- a/src/amd.js
+++ /dev/null
@@ -1,34 +0,0 @@
-(function (root, factory) {
- if (typeof exports === 'object') {
-
- module.exports = factory();
-
- } else if (typeof define === 'function' && define.amd) {
-
- define([], factory);
-
- }
-}(this, function () {
-
- //= flowchart.shim.js
-
- var root = this,
- flowchart = {};
-
- //= flowchart.defaults.js
- //= flowchart.helpers.js
- //= flowchart.functions.js
- //= flowchart.chart.js
- //= flowchart.symbol.js
- //= flowchart.symbol.start.js
- //= flowchart.symbol.end.js
- //= flowchart.symbol.operation.js
- //= flowchart.symbol.subroutine.js
- //= flowchart.symbol.inputoutput.js
- //= flowchart.symbol.condition.js
- //= flowchart.parse.js
- //= flowchart.api.js
-
- return flowchart;
-
-}));
\ No newline at end of file
diff --git a/src/flowchart.api.js b/src/flowchart.api.js
deleted file mode 100644
index 81fc25e6..00000000
--- a/src/flowchart.api.js
+++ /dev/null
@@ -1,2 +0,0 @@
-// public api interface
-flowchart.parse = parse;
\ No newline at end of file
diff --git a/src/flowchart.chart.js b/src/flowchart.chart.js
index deb61e29..db00d821 100644
--- a/src/flowchart.chart.js
+++ b/src/flowchart.chart.js
@@ -1,9 +1,15 @@
+var Raphael = require('raphael');
+var defaults = require('./flowchart.helpers').defaults;
+var defaultOptions = require('./flowchart.defaults');
+var Condition = require('./flowchart.symbol.condition');
+var Parallel = require('./flowchart.symbol.parallel');
+
function FlowChart(container, options) {
options = options || {};
this.paper = new Raphael(container);
- this.options = f.defaults(options, o);
+ this.options = defaults(options, defaultOptions);
this.symbols = [];
this.lines = [];
@@ -27,7 +33,29 @@ FlowChart.prototype.handle = function(symbol) {
};
symbol.no = function(nextSymbol) {
symbol.no_symbol = nextSymbol;
- if(symbol.yes_symbol) {
+ if (symbol.yes_symbol) {
+ symbol.pathOk = true;
+ }
+ return flowChart.handle(nextSymbol);
+ };
+ } else if (symbol instanceof(Parallel)) {
+ symbol.path1 = function(nextSymbol) {
+ symbol.path1_symbol = nextSymbol;
+ if (symbol.path2_symbol) {
+ symbol.pathOk = true;
+ }
+ return flowChart.handle(nextSymbol);
+ };
+ symbol.path2 = function(nextSymbol) {
+ symbol.path2_symbol = nextSymbol;
+ if (symbol.path3_symbol) {
+ symbol.pathOk = true;
+ }
+ return flowChart.handle(nextSymbol);
+ };
+ symbol.path3 = function(nextSymbol) {
+ symbol.path3_symbol = nextSymbol;
+ if (symbol.path1_symbol) {
symbol.pathOk = true;
}
return flowChart.handle(nextSymbol);
@@ -50,12 +78,15 @@ FlowChart.prototype.startWith = function(symbol) {
FlowChart.prototype.render = function() {
var maxWidth = 0,
- maxHeight = 0,
- i = 0,
- len = 0,
- maxX = 0,
- maxY = 0,
- symbol;
+ maxHeight = 0,
+ i = 0,
+ len = 0,
+ maxX = 0,
+ maxY = 0,
+ minX = 0,
+ minY = 0,
+ symbol,
+ line;
for (i = 0, len = this.symbols.length; i < len; i++) {
symbol = this.symbols[i];
@@ -86,10 +117,17 @@ FlowChart.prototype.render = function() {
maxX = this.maxXFromLine;
+ var x;
+ var y;
+
for (i = 0, len = this.symbols.length; i < len; i++) {
symbol = this.symbols[i];
- var x = symbol.getX() + symbol.width;
- var y = symbol.getY() + symbol.height;
+ var leftX = symbol.getX()
+ x = leftX + symbol.width;
+ y = symbol.getY() + symbol.height;
+ if (leftX < minX) {
+ minX = leftX;
+ }
if (x > maxX) {
maxX = x;
}
@@ -98,15 +136,46 @@ FlowChart.prototype.render = function() {
}
}
+ for (i = 0, len = this.lines.length; i < len; i++) {
+ line = this.lines[i].getBBox();
+ x = line.x;
+ y = line.y;
+ var x2 = line.x2;
+ var y2 = line.y2;
+ if (x < minX) {
+ minX = x;
+ }
+ if (y < minY) {
+ minY = y;
+ }
+ if (x2 > maxX) {
+ maxX = x2;
+ }
+ if (y2 > maxY) {
+ maxY = y2;
+ }
+ }
+
var scale = this.options['scale'];
var lineWidth = this.options['line-width'];
- this.paper.setSize((maxX * scale) + (lineWidth * scale), (maxY * scale) + (lineWidth * scale));
- this.paper.setViewBox(0, 0, maxX + lineWidth, maxY + lineWidth, true);
+
+ if (this.minXFromSymbols < minX) minX = this.minXFromSymbols;
+
+ if (minX < 0) minX -= lineWidth;
+ if (minY < 0) minY -= lineWidth;
+
+ var width = maxX + lineWidth - minX;
+ var height = maxY + lineWidth - minY;
+
+ this.paper.setSize(width * scale, height * scale);
+ this.paper.setViewBox(minX, minY, width, height, true);
};
FlowChart.prototype.clean = function() {
if (this.paper) {
var paperDom = this.paper.canvas;
- paperDom.parentNode.removeChild(paperDom);
+ paperDom.parentNode && paperDom.parentNode.removeChild(paperDom);
}
};
+
+module.exports = FlowChart;
\ No newline at end of file
diff --git a/src/flowchart.defaults.js b/src/flowchart.defaults.js
index 93611489..e10dac07 100644
--- a/src/flowchart.defaults.js
+++ b/src/flowchart.defaults.js
@@ -1,7 +1,8 @@
// defaults
-var o = {
+module.exports = {
'x': 0,
'y': 0,
+ // 'roundness': 0,
'line-width': 3,
'line-length': 50,
'text-margin': 10,
@@ -23,13 +24,16 @@ var o = {
'end': {},
'condition': {},
'inputoutput': {},
+ 'input': {}, //tds
+ 'output': {}, //tds
'operation': {},
- 'subroutine': {}
- }//,
+ 'subroutine': {},
+ 'parallel': {}
+ } //,
// 'flowstate' : {
// 'past' : { 'fill': '#CCCCCC', 'font-size': 12},
// 'current' : {'fill': 'yellow', 'font-color': 'red', 'font-weight': 'bold'},
// 'future' : { 'fill': '#FFFF99'},
// 'invalid': {'fill': '#444444'}
// }
-};
+};
\ No newline at end of file
diff --git a/src/flowchart.exports.js b/src/flowchart.exports.js
deleted file mode 100644
index 49a23cf1..00000000
--- a/src/flowchart.exports.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// Export the flowchart object for **CommonJS**.
-// If we're not in CommonJS, add `flowchart` to the
-// global object or to jquery.
-if (typeof module !== 'undefined' && module.exports) {
- module.exports = flowchart;
-} else {
- root.flowchart = root.flowchart || flowchart;
-}
\ No newline at end of file
diff --git a/src/flowchart.functions.js b/src/flowchart.functions.js
index b76b0aa8..073f0d37 100644
--- a/src/flowchart.functions.js
+++ b/src/flowchart.functions.js
@@ -13,7 +13,7 @@ function drawPath(chart, location, points) {
symbol.attr('stroke', chart.options['element-color']);
symbol.attr('stroke-width', chart.options['line-width']);
- var font = chart.options['font'];
+ var font = chart.options.font;
var fontF = chart.options['font-family'];
var fontW = chart.options['font-weight'];
@@ -48,7 +48,7 @@ function drawLine(chart, from, to, text) {
'arrow-end': chart.options['arrow-end']
});
- var font = chart.options['font'];
+ var font = chart.options.font;
var fontF = chart.options['font-family'];
var fontW = chart.options['font-weight'];
@@ -61,6 +61,7 @@ function drawLine(chart, from, to, text) {
var centerText = false;
var textPath = chart.paper.text(0, 0, text);
+ var textAnchor = 'start';
var isHorizontal = false;
var firstTo = to[0];
@@ -97,16 +98,24 @@ function drawLine(chart, from, to, text) {
y = from.y;
if (isHorizontal) {
- x += chart.options['text-margin']/2;
+ if (from.x > firstTo.x) {
+ x -= chart.options['text-margin']/2;
+ textAnchor = 'end';
+ } else {
+ x += chart.options['text-margin']/2;
+ }
y -= chart.options['text-margin'];
} else {
x += chart.options['text-margin']/2;
y += chart.options['text-margin'];
+ if (from.y > firstTo.y) {
+ y -= chart.options['text-margin']*2;
+ }
}
}
textPath.attr({
- 'text-anchor': 'start',
+ 'text-anchor': textAnchor,
'font-size': chart.options['font-size'],
'fill': chart.options['font-color'],
x: x,
@@ -158,4 +167,10 @@ function checkLineIntersection(line1StartX, line1StartY, line1EndX, line1EndY, l
}
// if line1 and line2 are segments, they intersect if both of the above are true
return result;
-}
\ No newline at end of file
+}
+
+module.exports = {
+ drawPath: drawPath,
+ drawLine: drawLine,
+ checkLineIntersection: checkLineIntersection
+};
diff --git a/src/flowchart.helpers.js b/src/flowchart.helpers.js
index b8b770c5..acb17cba 100644
--- a/src/flowchart.helpers.js
+++ b/src/flowchart.helpers.js
@@ -44,7 +44,7 @@ function _inherits(ctor, superCtor) {
// move dependent functions to a container so that
// they can be overriden easier in no jquery environment (node.js)
-var f = {
+module.exports = {
defaults: _defaults,
inherits: _inherits
-};
\ No newline at end of file
+};
diff --git a/src/flowchart.js b/src/flowchart.js
deleted file mode 100644
index 91db07e7..00000000
--- a/src/flowchart.js
+++ /dev/null
@@ -1,23 +0,0 @@
-(function() {
-
- //= flowchart.shim.js
-
- var root = this,
- flowchart = {};
-
- //= flowchart.exports.js
- //= flowchart.defaults.js
- //= flowchart.helpers.js
- //= flowchart.functions.js
- //= flowchart.chart.js
- //= flowchart.symbol.js
- //= flowchart.symbol.start.js
- //= flowchart.symbol.end.js
- //= flowchart.symbol.operation.js
- //= flowchart.symbol.subroutine.js
- //= flowchart.symbol.inputoutput.js
- //= flowchart.symbol.condition.js
- //= flowchart.parse.js
- //= flowchart.api.js
-
-})();
\ No newline at end of file
diff --git a/src/flowchart.parse.js b/src/flowchart.parse.js
index 8145cb96..03e941fa 100644
--- a/src/flowchart.parse.js
+++ b/src/flowchart.parse.js
@@ -1,3 +1,15 @@
+var FlowChart = require('./flowchart.chart');
+var Start = require('./flowchart.symbol.start');
+var End = require('./flowchart.symbol.end');
+var Operation = require('./flowchart.symbol.operation');
+var InputOutput = require('./flowchart.symbol.inputoutput');
+var Input = require('./flowchart.symbol.input'); //tds
+var Output = require('./flowchart.symbol.output'); //tds
+var Subroutine = require('./flowchart.symbol.subroutine');
+var Condition = require('./flowchart.symbol.condition');
+var Parallel = require('./flowchart.symbol.parallel');
+
+
function parse(input) {
input = input || '';
input = input.trim();
@@ -34,12 +46,21 @@ function parse(input) {
case 'inputoutput':
dispSymbols[s.key] = new InputOutput(diagram, s);
break;
+ case 'input':
+ dispSymbols[s.key] = new Input(diagram, s); //tds
+ break;
+ case 'output':
+ dispSymbols[s.key] = new Output(diagram, s); //tds
+ break;
case 'subroutine':
dispSymbols[s.key] = new Subroutine(diagram, s);
break;
case 'condition':
dispSymbols[s.key] = new Condition(diagram, s);
break;
+ case 'parallel':
+ dispSymbols[s.key] = new Parallel(diagram, s);
+ break;
default:
return new Error('Wrong symbol type!');
}
@@ -60,6 +81,16 @@ function parse(input) {
if (prev.no === s) {
prevDisp.no(dispSymb);
}
+ } else if (prevDisp instanceof(Parallel)) {
+ if (prev.path1 === s) {
+ prevDisp.path1(dispSymb);
+ }
+ if (prev.path2 === s) {
+ prevDisp.path2(dispSymb);
+ }
+ if (prev.path3 === s) {
+ prevDisp.path3(dispSymb);
+ }
} else {
prevDisp.then(dispSymb);
}
@@ -76,6 +107,16 @@ function parse(input) {
if (s.no) {
constructChart(s.no, dispSymb, s);
}
+ } else if (dispSymb instanceof(Parallel)) {
+ if (s.path1) {
+ constructChart(s.path1, dispSymb, s);
+ }
+ if (s.path2) {
+ constructChart(s.path2, dispSymb, s);
+ }
+ if (s.path3) {
+ constructChart(s.path3, dispSymb, s);
+ }
} else if (s.next) {
constructChart(s.next, dispSymb, s);
}
@@ -87,6 +128,9 @@ function parse(input) {
},
clean: function() {
this.diagram.clean();
+ },
+ options: function() {
+ return this.diagram.options;
}
};
@@ -100,14 +144,14 @@ function parse(input) {
}
}
- if(prevBreak < input.length) {
+ if (prevBreak < input.length) {
lines.push(input.substr(prevBreak));
}
for (var l = 1, len = lines.length; l < len;) {
var currentLine = lines[l];
- if (currentLine.indexOf(': ') < 0 && currentLine.indexOf('(') < 0 && currentLine.indexOf(')') < 0 && currentLine.indexOf('->') < 0 && currentLine.indexOf('=>') < 0) {
+ if (currentLine.indexOf('->') < 0 && currentLine.indexOf('=>') < 0 && currentLine.indexOf('@>') < 0) {
lines[l - 1] += '\n' + currentLine;
lines.splice(l, 1);
len--;
@@ -116,6 +160,24 @@ function parse(input) {
}
}
+ function getStyle(s){
+ var startIndex = s.indexOf('(') + 1;
+ var endIndex = s.indexOf(')');
+ if (startIndex >= 0 && endIndex >= 0) {
+ return s.substring(startIndex,endIndex);
+ }
+ return '{}';
+ }
+
+ function getSymbValue(s){
+ var startIndex = s.indexOf('(') + 1;
+ var endIndex = s.indexOf(')');
+ if (startIndex >= 0 && endIndex >= 0) {
+ return s.substring(startIndex,endIndex);
+ }
+ return '';
+ }
+
function getSymbol(s) {
var startIndex = s.indexOf('(') + 1;
var endIndex = s.indexOf(')');
@@ -139,38 +201,70 @@ function parse(input) {
}
return next;
}
+
+ function getAnnotation(s) {
+ var startIndex = s.indexOf("(") + 1, endIndex = s.indexOf(")");
+ var tmp = s.substring(startIndex, endIndex);
+ if(tmp.indexOf(",") > 0) { tmp = tmp.substring(0, tmp.indexOf(",")); }
+ var tmp_split = tmp.split("@");
+ if(tmp_split.length > 1)
+ return startIndex >= 0 && endIndex >= 0 ? tmp_split[1] : "";
+ }
while (lines.length > 0) {
- var line = lines.splice(0, 1)[0];
+ var line = lines.splice(0, 1)[0].trim();
if (line.indexOf('=>') >= 0) {
// definition
var parts = line.split('=>');
var symbol = {
- key: parts[0],
+ key: parts[0].replace(/\(.*\)/, ''),
symbolType: parts[1],
text: null,
link: null,
target: null,
- flowstate: null
+ flowstate: null,
+ function: null,
+ lineStyle: {},
+ params: {}
};
+ //parse parameters
+ var params = parts[0].match(/\((.*)\)/);
+ if (params && params.length > 1){
+ var entries = params[1].split(',');
+ for(var i = 0; i < entries.length; i++) {
+ var entry = entries[i].split('=');
+ if (entry.length == 2) {
+ symbol.params[entry[0]] = entry[1];
+ }
+ }
+ }
+
var sub;
if (symbol.symbolType.indexOf(': ') >= 0) {
sub = symbol.symbolType.split(': ');
- symbol.symbolType = sub[0];
- symbol.text = sub[1];
+ symbol.symbolType = sub.shift();
+ symbol.text = sub.join(': ');
}
- if (symbol.text && symbol.text.indexOf(':>') >= 0) {
+ if (symbol.text && symbol.text.indexOf(':$') >= 0) {
+ sub = symbol.text.split(':$');
+ symbol.text = sub.shift();
+ symbol.function = sub.join(':$');
+ } else if (symbol.symbolType.indexOf(':$') >= 0) {
+ sub = symbol.symbolType.split(':$');
+ symbol.symbolType = sub.shift();
+ symbol.function = sub.join(':$');
+ } else if (symbol.text && symbol.text.indexOf(':>') >= 0) {
sub = symbol.text.split(':>');
- symbol.text = sub[0];
- symbol.link = sub[1];
+ symbol.text = sub.shift();
+ symbol.link = sub.join(':>');
} else if (symbol.symbolType.indexOf(':>') >= 0) {
sub = symbol.symbolType.split(':>');
- symbol.symbolType = sub[0];
- symbol.link = sub[1];
+ symbol.symbolType = sub.shift();
+ symbol.link = sub.join(':>');
}
if (symbol.symbolType.indexOf('\n') >= 0) {
@@ -192,8 +286,8 @@ function parse(input) {
if (symbol.text) {
if (symbol.text.indexOf('|') >= 0) {
var txtAndState = symbol.text.split('|');
- symbol.text = txtAndState[0];
- symbol.flowstate = txtAndState[1].trim();
+ symbol.flowstate = txtAndState.pop().trim();
+ symbol.text = txtAndState.join('|');
}
}
/* end of flowstate support */
@@ -201,13 +295,24 @@ function parse(input) {
chart.symbols[symbol.key] = symbol;
} else if (line.indexOf('->') >= 0) {
+ var ann = getAnnotation(line);
+ if (ann) {
+ line = line.replace('@' + ann, '');
+ }
// flow
var flowSymbols = line.split('->');
- for (var i = 0, lenS = flowSymbols.length; i < lenS; i++) {
- var flowSymb = flowSymbols[i];
-
- var realSymb = getSymbol(flowSymb);
+ for (var iS = 0, lenS = flowSymbols.length; iS < lenS; iS++) {
+ var flowSymb = flowSymbols[iS];
+ var symbVal = getSymbValue(flowSymb);
+
+ if (symbVal === 'true' || symbVal === 'false') {
+ // map true or false to yes or no respectively
+ flowSymb = flowSymb.replace('true', 'yes');
+ flowSymb = flowSymb.replace('false', 'no');
+ }
+
var next = getNextPath(flowSymb);
+ var realSymb = getSymbol(flowSymb);
var direction = null;
if (next.indexOf(',') >= 0) {
@@ -216,19 +321,52 @@ function parse(input) {
direction = condOpt[1].trim();
}
+ if (ann) {
+ if (realSymb.symbolType === 'condition') {
+ if (next === "yes" || next === "true") {
+ realSymb.yes_annotation = ann;
+ } else {
+ realSymb.no_annotation = ann;
+ }
+ } else if (realSymb.symbolType === 'parallel') {
+ if (next === 'path1') {
+ realSymb.path1_annotation = ann;
+ } else if (next === 'path2') {
+ realSymb.path2_annotation = ann;
+ } else if (next === 'path3') {
+ realSymb.path3_annotation = ann;
+ }
+ }
+ ann = null;
+ }
+
if (!chart.start) {
chart.start = realSymb;
}
- if (i + 1 < lenS) {
- var nextSymb = flowSymbols[i + 1];
+ if (iS + 1 < lenS) {
+ var nextSymb = flowSymbols[iS + 1];
realSymb[next] = getSymbol(nextSymb);
realSymb['direction_' + next] = direction;
direction = null;
}
}
+ } else if (line.indexOf('@>') >= 0) {
+
+ // line style
+ var lineStyleSymbols = line.split('@>');
+ for (var iSS = 0, lenSS = lineStyleSymbols.length; iSS < lenSS; iSS++) {
+ if ((iSS + 1) !== lenSS) {
+ var curSymb = getSymbol(lineStyleSymbols[iSS]);
+ var nextSymbol = getSymbol(lineStyleSymbols[iSS+1]);
+
+ curSymb['lineStyle'][nextSymbol.key] = JSON.parse(getStyle(lineStyleSymbols[iSS + 1]));
+ }
+ }
}
}
return chart;
}
+
+module.exports = parse;
diff --git a/src/flowchart.symbol.condition.js b/src/flowchart.symbol.condition.js
index 3c776478..e9459492 100644
--- a/src/flowchart.symbol.condition.js
+++ b/src/flowchart.symbol.condition.js
@@ -1,30 +1,21 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+var drawAPI = require('./flowchart.functions');
+var drawPath = drawAPI.drawPath;
+
function Condition(chart, options) {
options = options || {};
Symbol.call(this, chart, options);
+ this.yes_annotation = options.yes_annotation;
+ this.no_annotation = options.no_annotation;
this.textMargin = this.getAttr('text-margin');
- this.yes_direction = 'bottom';
- this.no_direction = 'right';
- if (options.yes && options['direction_yes'] && options.no && !options['direction_no']) {
- if (options['direction_yes'] === 'right') {
- this.no_direction = 'bottom';
- this.yes_direction = 'right';
- } else {
- this.no_direction = 'right';
- this.yes_direction = 'bottom';
- }
- } else if (options.yes && !options['direction_yes'] && options.no && options['direction_no']) {
- if (options['direction_no'] === 'right') {
- this.yes_direction = 'bottom';
- this.no_direction = 'right';
- } else {
- this.yes_direction = 'right';
- this.no_direction = 'bottom';
- }
- } else {
- this.yes_direction = 'bottom';
- this.no_direction = 'right';
+ this.yes_direction = options.direction_yes;
+ this.no_direction = options.direction_no;
+ if (!this.no_direction && this.yes_direction === 'right') {
+ this.no_direction = 'bottom';
+ } else if (!this.yes_direction && this.no_direction === 'bottom') {
+ this.yes_direction = 'right'
}
-
this.yes_direction = this.yes_direction || 'bottom';
this.no_direction = this.no_direction || 'right';
@@ -71,13 +62,14 @@ function Condition(chart, options) {
this.group.push(symbol);
symbol.insertBefore(this.text);
+ this.symbol = symbol
this.initialize();
}
-f.inherits(Condition, Symbol);
+inherits(Condition, Symbol);
Condition.prototype.render = function() {
-
+ var self = this;
if (this.yes_direction) {
this[this.yes_direction + '_symbol'] = this.yes_symbol;
}
@@ -90,7 +82,6 @@ Condition.prototype.render = function() {
if (this.bottom_symbol) {
var bottomPoint = this.getBottom();
- var topPoint = this.bottom_symbol.getTop();
if (!this.bottom_symbol.isPositioned) {
this.bottom_symbol.shiftY(this.getY() + this.height + lineLength);
@@ -103,28 +94,29 @@ Condition.prototype.render = function() {
if (this.right_symbol) {
var rightPoint = this.getRight();
- var leftPoint = this.right_symbol.getLeft();
if (!this.right_symbol.isPositioned) {
this.right_symbol.setY(rightPoint.y - this.right_symbol.height/2);
this.right_symbol.shiftX(this.group.getBBox().x + this.width + lineLength);
- var self = this;
(function shift() {
var hasSymbolUnder = false;
var symb;
for (var i = 0, len = self.chart.symbols.length; i < len; i++) {
symb = self.chart.symbols[i];
- var diff = Math.abs(symb.getCenter().x - self.right_symbol.getCenter().x);
- if (symb.getCenter().y > self.right_symbol.getCenter().y && diff <= self.right_symbol.width/2) {
- hasSymbolUnder = true;
- break;
+ if (!self.params['align-next'] || self.params['align-next'] !== 'no') {
+ var diff = Math.abs(symb.getCenter().x - self.right_symbol.getCenter().x);
+ if (symb.getCenter().y > self.right_symbol.getCenter().y && diff <= self.right_symbol.width/2) {
+ hasSymbolUnder = true;
+ break;
+ }
}
}
if (hasSymbolUnder) {
+ if (self.right_symbol.symbolType === 'end') return;
self.right_symbol.setX(symb.getX() + symb.width + lineLength);
shift();
}
@@ -135,14 +127,51 @@ Condition.prototype.render = function() {
this.right_symbol.render();
}
}
+
+ if (this.left_symbol) {
+ var leftPoint = this.getLeft();
+
+ if (!this.left_symbol.isPositioned) {
+ this.left_symbol.setY(leftPoint.y - this.left_symbol.height / 2);
+ this.left_symbol.shiftX(-(this.group.getBBox().x + this.width + lineLength));
+
+ (function shift() {
+ var hasSymbolUnder = false;
+ var symb;
+ for (var i = 0, len = self.chart.symbols.length; i < len; i++) {
+ symb = self.chart.symbols[i];
+
+ if (!self.params['align-next'] || self.params['align-next'] !== 'no') {
+ var diff = Math.abs(symb.getCenter().x - self.left_symbol.getCenter().x);
+ if (symb.getCenter().y > self.left_symbol.getCenter().y && diff <= self.left_symbol.width / 2) {
+ hasSymbolUnder = true;
+ break;
+ }
+ }
+ }
+
+ if (hasSymbolUnder) {
+ if (self.left_symbol.symbolType === 'end') return;
+ self.left_symbol.setX(symb.getX() + symb.width + lineLength);
+ shift();
+ }
+ })();
+
+ this.left_symbol.isPositioned = true;
+
+ this.left_symbol.render();
+ }
+ }
};
Condition.prototype.renderLines = function() {
if (this.yes_symbol) {
- this.drawLineTo(this.yes_symbol, this.getAttr('yes-text'), this.yes_direction);
+ this.drawLineTo(this.yes_symbol, this.yes_annotation ? this.yes_annotation : this.getAttr('yes-text'), this.yes_direction);
}
if (this.no_symbol) {
- this.drawLineTo(this.no_symbol, this.getAttr('no-text'), this.no_direction);
+ this.drawLineTo(this.no_symbol, this.no_annotation ? this.no_annotation : this.getAttr('no-text'), this.no_direction);
}
};
+
+module.exports = Condition;
diff --git a/src/flowchart.symbol.end.js b/src/flowchart.symbol.end.js
index 1da193db..4d8ee581 100644
--- a/src/flowchart.symbol.end.js
+++ b/src/flowchart.symbol.end.js
@@ -1,7 +1,12 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+
function End(chart, options) {
var symbol = chart.paper.rect(0, 0, 0, 0, 20);
options = options || {};
options.text = options.text || 'End';
Symbol.call(this, chart, options, symbol);
}
-f.inherits(End, Symbol);
\ No newline at end of file
+inherits(End, Symbol);
+
+module.exports = End;
diff --git a/src/flowchart.symbol.input.js b/src/flowchart.symbol.input.js
new file mode 100644
index 00000000..6f5823dc
--- /dev/null
+++ b/src/flowchart.symbol.input.js
@@ -0,0 +1,67 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+var drawAPI = require('./flowchart.functions');
+var drawPath = drawAPI.drawPath;
+
+function Input(chart, options) {
+ options = options || {};
+ Symbol.call(this, chart, options);
+ this.textMargin = this.getAttr('text-margin');
+
+ this.text.attr({
+ x: this.textMargin * 3
+ });
+
+ var width = this.text.getBBox().width + 4 * this.textMargin;
+ var height = this.text.getBBox().height + 2 * this.textMargin;
+ var startX = this.textMargin;
+ var startY = height/2;
+
+ var start = {x: startX, y: startY};
+ var points = [
+ {x: startX - this.textMargin + 2 * this.textMargin, y: height},
+ {x: startX - this.textMargin + width, y: height},
+ {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},
+ {x: startX - this.textMargin, y: 0},
+ {x: startX, y: startY}
+ ];
+
+ var symbol = drawPath(chart, start, points);
+
+ symbol.attr({
+ stroke: this.getAttr('element-color'),
+ 'stroke-width': this.getAttr('line-width'),
+ fill: this.getAttr('fill')
+ });
+ if (options.link) { symbol.attr('href', options.link); }
+ if (options.target) { symbol.attr('target', options.target); }
+ if (options.key) { symbol.node.id = options.key; }
+ symbol.node.setAttribute('class', this.getAttr('class'));
+
+ this.text.attr({
+ y: symbol.getBBox().height/2
+ });
+
+ this.group.push(symbol);
+ symbol.insertBefore(this.text);
+ this.symbol = symbol
+
+ this.initialize();
+}
+inherits(Input, Symbol);
+
+Input.prototype.getLeft = function() {
+ var y = this.getY() + this.group.getBBox().height/2;
+ var x = this.getX() + this.textMargin;
+ return {x: x, y: y};
+};
+
+Input.prototype.getRight = function() {
+ var y = this.getY() + this.group.getBBox().height/2;
+ var x = this.getX() + this.group.getBBox().width - this.textMargin;
+ return {x: x, y: y};
+};
+
+module.exports = Input;
+
+
diff --git a/src/flowchart.symbol.inputoutput.js b/src/flowchart.symbol.inputoutput.js
index cca3230b..cd8573d3 100644
--- a/src/flowchart.symbol.inputoutput.js
+++ b/src/flowchart.symbol.inputoutput.js
@@ -1,8 +1,13 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+var drawAPI = require('./flowchart.functions');
+var drawPath = drawAPI.drawPath;
+
function InputOutput(chart, options) {
options = options || {};
Symbol.call(this, chart, options);
this.textMargin = this.getAttr('text-margin');
-
+
this.text.attr({
x: this.textMargin * 3
});
@@ -39,10 +44,11 @@ function InputOutput(chart, options) {
this.group.push(symbol);
symbol.insertBefore(this.text);
+ this.symbol = symbol
this.initialize();
}
-f.inherits(InputOutput, Symbol);
+inherits(InputOutput, Symbol);
InputOutput.prototype.getLeft = function() {
var y = this.getY() + this.group.getBBox().height/2;
@@ -55,3 +61,5 @@ InputOutput.prototype.getRight = function() {
var x = this.getX() + this.group.getBBox().width - this.textMargin;
return {x: x, y: y};
};
+
+module.exports = InputOutput;
diff --git a/src/flowchart.symbol.js b/src/flowchart.symbol.js
index 507331df..7a01be98 100644
--- a/src/flowchart.symbol.js
+++ b/src/flowchart.symbol.js
@@ -1,3 +1,7 @@
+var drawAPI = require('./flowchart.functions');
+var drawLine = drawAPI.drawLine;
+var checkLineIntersection = drawAPI.checkLineIntersection;
+
function Symbol(chart, options, symbol) {
this.chart = chart;
this.group = this.chart.paper.set();
@@ -5,14 +9,21 @@ function Symbol(chart, options, symbol) {
this.connectedTo = [];
this.symbolType = options.symbolType;
this.flowstate = (options.flowstate || 'future');
+ this.lineStyle = (options.lineStyle || {});
+ this.key = (options.key || '');
+ this.leftLines = [];
+ this.rightLines = [];
+ this.topLines = [];
+ this.bottomLines = [];
+ this.params = options.params;
this.next_direction = options.next && options['direction_next'] ? options['direction_next'] : undefined;
-
+
this.text = this.chart.paper.text(0, 0, options.text);
//Raphael does not support the svg group tag so setting the text node id to the symbol node id plus t
if (options.key) { this.text.node.id = options.key + 't'; }
this.text.node.setAttribute('class', this.getAttr('class') + 't');
-
+
this.text.attr({
'text-anchor': 'start',
'x' : this.getAttr('text-margin'),
@@ -29,6 +40,16 @@ function Symbol(chart, options, symbol) {
if (fontW) this.text.attr({ 'font-weight': fontW });
if (options.link) { this.text.attr('href', options.link); }
+
+ //ndrqu Add click function with event and options params
+ if (options.function) {
+ this.text.attr({ 'cursor' : 'pointer' });
+
+ this.text.node.addEventListener("click", function(evt) {
+ window[options.function](evt,options);
+ }, false);
+ }
+
if (options.target) { this.text.attr('target', options.target); }
var maxWidth = this.getAttr('maxWidth');
@@ -47,12 +68,12 @@ function Symbol(chart, options, symbol) {
}
this.text.attr("text", tempText.substring(1));
}
-
+
this.group.push(this.text);
if (symbol) {
var tmpMargin = this.getAttr('text-margin');
-
+
symbol.attr({
'fill' : this.getAttr('fill'),
'stroke' : this.getAttr('element-color'),
@@ -62,9 +83,22 @@ function Symbol(chart, options, symbol) {
});
symbol.node.setAttribute('class', this.getAttr('class'));
+ var roundness = this.getAttr('roundness');
+ if (!isNaN(roundness)) {
+ symbol.node.setAttribute('ry', roundness);
+ symbol.node.setAttribute('rx', roundness);
+ }
if (options.link) { symbol.attr('href', options.link); }
if (options.target) { symbol.attr('target', options.target); }
+
+ //ndrqu Add click function with event and options params
+ if (options.function) {
+ symbol.node.addEventListener("click", function(evt) {
+ window[options.function](evt,options);
+ }, false);
+ symbol.attr({ 'cursor' : 'pointer' });
+ }
if (options.key) { symbol.node.id = options.key; }
this.group.push(symbol);
@@ -156,19 +190,17 @@ Symbol.prototype.getRight = function() {
Symbol.prototype.render = function() {
if (this.next) {
+ var self = this;
var lineLength = this.getAttr('line-length');
if (this.next_direction === 'right') {
var rightPoint = this.getRight();
- var leftPoint = this.next.getLeft();
if (!this.next.isPositioned) {
-
this.next.setY(rightPoint.y - this.next.height/2);
this.next.shiftX(this.group.getBBox().x + this.width + lineLength);
- var self = this;
(function shift() {
var hasSymbolUnder = false;
var symb;
@@ -183,6 +215,39 @@ Symbol.prototype.render = function() {
}
if (hasSymbolUnder) {
+ if (self.next.symbolType === 'end') return;
+ self.next.setX(symb.getX() + symb.width + lineLength);
+ shift();
+ }
+ })();
+
+ this.next.isPositioned = true;
+
+ this.next.render();
+ }
+ } else if (this.next_direction === 'left') {
+
+ var leftPoint = this.getLeft();
+
+ if (!this.next.isPositioned) {
+ this.next.setY(leftPoint.y - this.next.height/2);
+ this.next.shiftX(-(this.group.getBBox().x + this.width + lineLength));
+
+ (function shift() {
+ var hasSymbolUnder = false;
+ var symb;
+ for (var i = 0, len = self.chart.symbols.length; i < len; i++) {
+ symb = self.chart.symbols[i];
+
+ var diff = Math.abs(symb.getCenter().x - self.next.getCenter().x);
+ if (symb.getCenter().y > self.next.getCenter().y && diff <= self.next.width/2) {
+ hasSymbolUnder = true;
+ break;
+ }
+ }
+
+ if (hasSymbolUnder) {
+ if (self.next.symbolType === 'end') return;
self.next.setX(symb.getX() + symb.width + lineLength);
shift();
}
@@ -194,7 +259,6 @@ Symbol.prototype.render = function() {
}
} else {
var bottomPoint = this.getBottom();
- var topPoint = this.next.getTop();
if (!this.next.isPositioned) {
this.next.shiftY(this.getY() + this.height + lineLength);
@@ -210,9 +274,9 @@ Symbol.prototype.render = function() {
Symbol.prototype.renderLines = function() {
if (this.next) {
if (this.next_direction) {
- this.drawLineTo(this.next, '', this.next_direction);
+ this.drawLineTo(this.next, this.getAttr('arrow-text') || '', this.next_direction);
} else {
- this.drawLineTo(this.next);
+ this.drawLineTo(this.next, this.getAttr('arrow-text') || '');
}
}
};
@@ -224,121 +288,189 @@ Symbol.prototype.drawLineTo = function(symbol, text, origin) {
var x = this.getCenter().x,
y = this.getCenter().y,
- top = this.getTop(),
right = this.getRight(),
bottom = this.getBottom(),
+ top = this.getTop(),
left = this.getLeft();
var symbolX = symbol.getCenter().x,
symbolY = symbol.getCenter().y,
symbolTop = symbol.getTop(),
symbolRight = symbol.getRight(),
- symbolBottom = symbol.getBottom(),
symbolLeft = symbol.getLeft();
var isOnSameColumn = x === symbolX,
isOnSameLine = y === symbolY,
isUnder = y < symbolY,
- isUpper = y > symbolY,
+ isUpper = y > symbolY || this === symbol,
isLeft = x > symbolX,
isRight = x < symbolX;
var maxX = 0,
line,
+ yOffset,
lineLength = this.getAttr('line-length'),
lineWith = this.getAttr('line-width');
if ((!origin || origin === 'bottom') && isOnSameColumn && isUnder) {
- line = drawLine(this.chart, bottom, symbolTop, text);
+ if (symbol.topLines.length === 0 && this.bottomLines.length === 0) {
+ line = drawLine(this.chart, bottom, symbolTop, text);
+ } else {
+ yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;
+ line = drawLine(this.chart, bottom, [
+ {x: symbolTop.x, y: symbolTop.y - yOffset},
+ {x: symbolTop.x, y: symbolTop.y}
+ ], text);
+ }
+ this.bottomLines.push(line);
+ symbol.topLines.push(line);
this.bottomStart = true;
symbol.topEnd = true;
maxX = bottom.x;
} else if ((!origin || origin === 'right') && isOnSameLine && isRight) {
- line = drawLine(this.chart, right, symbolLeft, text);
+ if (symbol.leftLines.length === 0 && this.rightLines.length === 0) {
+ line = drawLine(this.chart, right, symbolLeft, text);
+ } else {
+ yOffset = Math.max(symbol.leftLines.length, this.rightLines.length) * 10;
+ line = drawLine(this.chart, right, [
+ {x: right.x, y: right.y - yOffset},
+ {x: right.x, y: symbolLeft.y - yOffset},
+ {x: symbolLeft.x, y: symbolLeft.y - yOffset},
+ {x: symbolLeft.x, y: symbolLeft.y}
+ ], text);
+ }
+ this.rightLines.push(line);
+ symbol.leftLines.push(line);
this.rightStart = true;
symbol.leftEnd = true;
maxX = symbolLeft.x;
} else if ((!origin || origin === 'left') && isOnSameLine && isLeft) {
- line = drawLine(this.chart, left, symbolRight, text);
+ if (symbol.rightLines.length === 0 && this.leftLines.length === 0) {
+ line = drawLine(this.chart, left, symbolRight, text);
+ } else {
+ yOffset = Math.max(symbol.rightLines.length, this.leftLines.length) * 10;
+ line = drawLine(this.chart, right, [
+ {x: right.x, y: right.y - yOffset},
+ {x: right.x, y: symbolRight.y - yOffset},
+ {x: symbolRight.x, y: symbolRight.y - yOffset},
+ {x: symbolRight.x, y: symbolRight.y}
+ ], text);
+ }
+ this.leftLines.push(line);
+ symbol.rightLines.push(line);
this.leftStart = true;
symbol.rightEnd = true;
maxX = symbolRight.x;
} else if ((!origin || origin === 'right') && isOnSameColumn && isUpper) {
+ yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;
line = drawLine(this.chart, right, [
- {x: right.x + lineLength/2, y: right.y},
- {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: right.x + lineLength/2, y: right.y - yOffset},
+ {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
+ this.rightLines.push(line);
+ symbol.topLines.push(line);
this.rightStart = true;
symbol.topEnd = true;
maxX = right.x + lineLength/2;
} else if ((!origin || origin === 'right') && isOnSameColumn && isUnder) {
+ yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;
line = drawLine(this.chart, right, [
- {x: right.x + lineLength/2, y: right.y},
- {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: right.x + lineLength/2, y: right.y - yOffset},
+ {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
+ this.rightLines.push(line);
+ symbol.topLines.push(line);
this.rightStart = true;
symbol.topEnd = true;
maxX = right.x + lineLength/2;
} else if ((!origin || origin === 'bottom') && isLeft) {
+ yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;
if (this.leftEnd && isUpper) {
line = drawLine(this.chart, bottom, [
- {x: bottom.x, y: bottom.y + lineLength/2},
- {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2},
- {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},
+ {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2 - yOffset},
+ {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
} else {
line = drawLine(this.chart, bottom, [
- {x: bottom.x, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: bottom.x, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
}
+ this.bottomLines.push(line);
+ symbol.topLines.push(line);
this.bottomStart = true;
symbol.topEnd = true;
maxX = bottom.x + (bottom.x - symbolTop.x)/2;
+ } else if ((!origin || origin === 'bottom') && isRight && isUnder) {
+ yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;
+ line = drawLine(this.chart, bottom, [
+ {x: bottom.x, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y}
+ ], text);
+ this.bottomLines.push(line);
+ symbol.topLines.push(line);
+ this.bottomStart = true;
+ symbol.topEnd = true;
+ maxX = bottom.x;
+ if (symbolTop.x > maxX) maxX = symbolTop.x;
} else if ((!origin || origin === 'bottom') && isRight) {
+ yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;
line = drawLine(this.chart, bottom, [
- {x: bottom.x, y: bottom.y + lineLength/2},
- {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2},
- {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},
+ {x: bottom.x + (bottom.x - symbolTop.x)/2, y: bottom.y + lineLength/2 - yOffset},
+ {x: bottom.x + (bottom.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
+ this.bottomLines.push(line);
+ symbol.topLines.push(line);
this.bottomStart = true;
symbol.topEnd = true;
maxX = bottom.x + (bottom.x - symbolTop.x)/2;
} else if ((origin && origin === 'right') && isLeft) {
+ yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;
line = drawLine(this.chart, right, [
{x: right.x + lineLength/2, y: right.y},
- {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
+ this.rightLines.push(line);
+ symbol.topLines.push(line);
this.rightStart = true;
symbol.topEnd = true;
maxX = right.x + lineLength/2;
} else if ((origin && origin === 'right') && isRight) {
+ yOffset = Math.max(symbol.topLines.length, this.rightLines.length) * 10;
line = drawLine(this.chart, right, [
- {x: symbolTop.x, y: right.y},
- {x: symbolTop.x, y: symbolTop.y}
+ {x: symbolTop.x, y: right.y - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - yOffset}
], text);
+ this.rightLines.push(line);
+ symbol.topLines.push(line);
this.rightStart = true;
symbol.topEnd = true;
maxX = right.x + lineLength/2;
} else if ((origin && origin === 'bottom') && isOnSameColumn && isUpper) {
+ yOffset = Math.max(symbol.topLines.length, this.bottomLines.length) * 10;
line = drawLine(this.chart, bottom, [
- {x: bottom.x, y: bottom.y + lineLength/2},
- {x: right.x + lineLength/2, y: bottom.y + lineLength/2},
- {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: bottom.x, y: bottom.y + lineLength/2 - yOffset},
+ {x: right.x + lineLength/2, y: bottom.y + lineLength/2 - yOffset},
+ {x: right.x + lineLength/2, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
+ this.bottomLines.push(line);
+ symbol.topLines.push(line);
this.bottomStart = true;
symbol.topEnd = true;
maxX = bottom.x + lineLength/2;
@@ -347,35 +479,53 @@ Symbol.prototype.drawLineTo = function(symbol, text, origin) {
if (symbolLeft.x < left.x) {
diffX = symbolLeft.x - lineLength/2;
}
+ yOffset = Math.max(symbol.topLines.length, this.leftLines.length) * 10;
line = drawLine(this.chart, left, [
- {x: diffX, y: left.y},
- {x: diffX, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: diffX, y: left.y - yOffset},
+ {x: diffX, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
+ this.leftLines.push(line);
+ symbol.topLines.push(line);
this.leftStart = true;
symbol.topEnd = true;
maxX = left.x;
} else if ((origin === 'left')) {
+ yOffset = Math.max(symbol.topLines.length, this.leftLines.length) * 10;
line = drawLine(this.chart, left, [
- {x: symbolTop.x + (left.x - symbolTop.x)/ 2, y: left.y},
- {x: symbolTop.x + (left.x - symbolTop.x)/ 2, y: symbolTop.y - lineLength/2},
- {x: symbolTop.x, y: symbolTop.y - lineLength/2},
+ {x: symbolTop.x + (left.x - symbolTop.x)/2, y: left.y},
+ {x: symbolTop.x + (left.x - symbolTop.x)/2, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
{x: symbolTop.x, y: symbolTop.y}
], text);
+ this.leftLines.push(line);
+ symbol.topLines.push(line);
this.leftStart = true;
symbol.topEnd = true;
maxX = left.x;
+ } else if ((origin === 'top')) {
+ yOffset = Math.max(symbol.topLines.length, this.topLines.length) * 10;
+ line = drawLine(this.chart, top, [
+ {x: top.x, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y - lineLength/2 - yOffset},
+ {x: symbolTop.x, y: symbolTop.y}
+ ], text);
+ this.topLines.push(line);
+ symbol.topLines.push(line);
+ this.topStart = true;
+ symbol.topEnd = true;
+ maxX = top.x;
+ }
+
+ //update line style
+ if (this.lineStyle[symbol.key] && line){
+ line.attr(this.lineStyle[symbol.key]);
}
if (line) {
- var self = this;
for (var l = 0, llen = this.chart.lines.length; l < llen; l++) {
var otherLine = this.chart.lines[l];
- var i,
- len,
- intersections,
- inter;
var ePath = otherLine.attr('path'),
lPath = line.attr('path');
@@ -435,16 +585,20 @@ Symbol.prototype.drawLineTo = function(symbol, text, origin) {
}
lP += 2;
- len += 2;
}
}
}
}
this.chart.lines.push(line);
+ if (this.chart.minXFromSymbols === undefined || this.chart.minXFromSymbols > left.x) {
+ this.chart.minXFromSymbols = left.x;
+ }
}
if (!this.chart.maxXFromLine || (this.chart.maxXFromLine && maxX > this.chart.maxXFromLine)) {
this.chart.maxXFromLine = maxX;
}
};
+
+module.exports = Symbol;
diff --git a/src/flowchart.symbol.operation.js b/src/flowchart.symbol.operation.js
index 1e938eda..ad3c108e 100644
--- a/src/flowchart.symbol.operation.js
+++ b/src/flowchart.symbol.operation.js
@@ -1,6 +1,11 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+
function Operation(chart, options) {
var symbol = chart.paper.rect(0, 0, 0, 0);
options = options || {};
Symbol.call(this, chart, options, symbol);
}
-f.inherits(Operation, Symbol);
\ No newline at end of file
+inherits(Operation, Symbol);
+
+module.exports = Operation;
diff --git a/src/flowchart.symbol.output.js b/src/flowchart.symbol.output.js
new file mode 100644
index 00000000..363dac0b
--- /dev/null
+++ b/src/flowchart.symbol.output.js
@@ -0,0 +1,124 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+var drawAPI = require('./flowchart.functions');
+var drawPath = drawAPI.drawPath;
+
+function Output(chart, options) {
+ options = options || {};
+ Symbol.call(this, chart, options);
+ this.textMargin = this.getAttr('text-margin');
+
+ this.text.attr({
+ x: this.textMargin * 3
+ });
+
+ var width = this.text.getBBox().width + 4 * this.textMargin;
+ var height = this.text.getBBox().height + 2 * this.textMargin;
+ var startX = this.textMargin;
+ var startY = height/2;
+
+ var start = {x: startX, y: startY};
+ var points = [
+ {x: startX - this.textMargin, y: height},
+ {x: startX - this.textMargin + width + 2 * this.textMargin, y: height},
+ {x: startX - this.textMargin + width, y: 0},
+ {x: startX - this.textMargin + 2 * this.textMargin, y: 0},
+ {x: startX, y: startY}
+ ];
+
+ var symbol = drawPath(chart, start, points);
+
+ symbol.attr({
+ stroke: this.getAttr('element-color'),
+ 'stroke-width': this.getAttr('line-width'),
+ fill: this.getAttr('fill')
+ });
+ if (options.link) { symbol.attr('href', options.link); }
+ if (options.target) { symbol.attr('target', options.target); }
+ if (options.key) { symbol.node.id = options.key; }
+ symbol.node.setAttribute('class', this.getAttr('class'));
+
+ this.text.attr({
+ y: symbol.getBBox().height/2
+ });
+
+ this.group.push(symbol);
+ symbol.insertBefore(this.text);
+ this.symbol = symbol
+
+ this.initialize();
+}
+inherits(Output, Symbol);
+
+Output.prototype.getLeft = function() {
+ var y = this.getY() + this.group.getBBox().height/2;
+ var x = this.getX() + this.textMargin;
+ return {x: x, y: y};
+};
+
+Output.prototype.getRight = function() {
+ var y = this.getY() + this.group.getBBox().height/2;
+ var x = this.getX() + this.group.getBBox().width - this.textMargin;
+ return {x: x, y: y};
+};
+
+module.exports = Output;
+
+
+
+/*
+//var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+var drawAPI = require('./flowchart.functions');
+var InputOutput = require('./flowchart.symbol.inputoutput');
+var drawPath = drawAPI.drawPath;
+
+function Output(chart, options) {
+ options = options || {};
+ InputOutput.call(this, chart, options);
+
+ var width = this.text.getBBox().width + 4 * this.textMargin;
+ var height = this.text.getBBox().height + 2 * this.textMargin;
+ var startX = this.textMargin;
+ var startY = height/2;
+
+ var start = {x: startX, y: startY};
+ var points = [
+ {x: startX - this.textMargin + 2 * this.textMargin, y: height},
+ {x: startX - this.textMargin + width, y: height},
+ {x: startX - this.textMargin + width + 2 * this.textMargin, y: 0},
+ {x: startX - this.textMargin, y: 0},
+ {x: startX, y: startY}
+ ];
+
+ var symbol = drawPath(chart, start, points);
+
+ symbol.attr({
+ stroke: this.getAttr('element-color'),
+ 'stroke-width': this.getAttr('line-width'),
+ fill: this.getAttr('fill')
+ });
+ if (options.link) { symbol.attr('href', options.link); }
+ if (options.target) { symbol.attr('target', options.target); }
+ if (options.key) { symbol.node.id = options.key; }
+ symbol.node.setAttribute('class', this.getAttr('class'));
+
+ this.text.attr({
+ y: symbol.getBBox().height/2
+ });
+
+ this.group.push(symbol);
+ symbol.insertBefore(this.text);
+
+ if (this.symbol){
+ this.group.remove(this.symbol); //tds
+ this.symbol.parentNode.removeChild(this.symbol); //tds
+ }
+ this.symbol = symbol
+
+ this.initialize();
+}
+inherits(Output, InputOutput);
+
+module.exports = Output;
+*/
diff --git a/src/flowchart.symbol.parallel.js b/src/flowchart.symbol.parallel.js
new file mode 100644
index 00000000..bf7ae0c2
--- /dev/null
+++ b/src/flowchart.symbol.parallel.js
@@ -0,0 +1,210 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+
+function Parallel(chart, options) {
+ var symbol = chart.paper.rect(0, 0, 0, 0);
+ options = options || {};
+ Symbol.call(this, chart, options, symbol);
+ this.path1_annotation = options.path1_annotation || '';
+ this.path2_annotation = options.path2_annotation || '';
+ this.path3_annotation = options.path3_annotation || '';
+ this.textMargin = this.getAttr('text-margin');
+ this.path1_direction = 'bottom';
+ this.path2_direction = 'right';
+ this.path3_direction = 'top';
+ this.params = options.params;
+ if (options.direction_next === 'path1' && !options[options.direction_next] && options.next) {
+ options[options.direction_next] = options.next;
+ }
+ if (options.direction_next === 'path2' && !options[options.direction_next] && options.next) {
+ options[options.direction_next] = options.next;
+ }
+ if (options.direction_next === 'path3' && !options[options.direction_next] && options.next) {
+ options[options.direction_next] = options.next;
+ }
+
+ if (options.path1 && options.direction_path1 && options.path2 && !options.direction_path2 && options.path3 && !options.direction_path3) {
+ if (options.direction_path1 === 'right') {
+ this.path2_direction = 'bottom';
+ this.path1_direction = 'right';
+ this.path3_direction = 'top';
+ } else if (options.direction_path1 === 'top') {
+ this.path2_direction = 'right';
+ this.path1_direction = 'top';
+ this.path3_direction = 'bottom';
+ } else if (options.direction_path1 === 'left') {
+ this.path2_direction = 'right';
+ this.path1_direction = 'left';
+ this.path3_direction = 'bottom';
+ } else {
+ this.path2_direction = 'right';
+ this.path1_direction = 'bottom';
+ this.path3_direction = 'top';
+ }
+ } else if (options.path1 && !options.direction_path1 && options.path2 && options.direction_path2 && options.path3 && !options.direction_path3) {
+ if (options.direction_path2 === 'right') {
+ this.path1_direction = 'bottom';
+ this.path2_direction = 'right';
+ this.path3_direction = 'top';
+ } else if (options.direction_path2 === 'left') {
+ this.path1_direction = 'bottom';
+ this.path2_direction = 'left';
+ this.path3_direction = 'right';
+ } else {
+ this.path1_direction = 'right';
+ this.path2_direction = 'bottom';
+ this.path3_direction = 'top';
+ }
+ } else if (options.path1 && !options.direction_path1 && options.path2 && !options.direction_path2 && options.path3 && options.direction_path3) {
+ if (options.direction_path2 === 'right') {
+ this.path1_direction = 'bottom';
+ this.path2_direction = 'top';
+ this.path3_direction = 'right';
+ } else if (options.direction_path2 === 'left') {
+ this.path1_direction = 'bottom';
+ this.path2_direction = 'right';
+ this.path3_direction = 'left';
+ } else {
+ this.path1_direction = 'right';
+ this.path2_direction = 'bottom';
+ this.path3_direction = 'top';
+ }
+ } else {
+ this.path1_direction = options.direction_path1;
+ this.path2_direction = options.direction_path2;
+ this.path3_direction = options.direction_path3;
+ }
+
+ this.path1_direction = this.path1_direction || 'bottom';
+ this.path2_direction = this.path2_direction || 'right';
+ this.path3_direction = this.path3_direction || 'top';
+
+ this.initialize();
+}
+inherits(Parallel, Symbol);
+
+Parallel.prototype.render = function() {
+ if (this.path1_direction) {
+ this[this.path1_direction + '_symbol'] = this.path1_symbol;
+ }
+
+ if (this.path2_direction) {
+ this[this.path2_direction + '_symbol'] = this.path2_symbol;
+ }
+
+ if (this.path3_direction) {
+ this[this.path3_direction + '_symbol'] = this.path3_symbol;
+ }
+
+ var lineLength = this.getAttr('line-length');
+
+ if (this.bottom_symbol) {
+ var bottomPoint = this.getBottom();
+
+ if (!this.bottom_symbol.isPositioned) {
+ this.bottom_symbol.shiftY(this.getY() + this.height + lineLength);
+ this.bottom_symbol.setX(bottomPoint.x - this.bottom_symbol.width / 2);
+ this.bottom_symbol.isPositioned = true;
+
+ this.bottom_symbol.render();
+ }
+ }
+
+ if (this.top_symbol) {
+ var topPoint = this.getTop();
+
+ if (!this.top_symbol.isPositioned) {
+ this.top_symbol.shiftY(this.getY() - this.top_symbol.height - lineLength);
+ this.top_symbol.setX(topPoint.x + this.top_symbol.width);
+ this.top_symbol.isPositioned = true;
+
+ this.top_symbol.render();
+ }
+ }
+
+ var self = this;
+
+ if (this.left_symbol) {
+ var leftPoint = this.getLeft();
+
+ if (!this.left_symbol.isPositioned) {
+ this.left_symbol.setY(leftPoint.y - this.left_symbol.height / 2);
+ this.left_symbol.shiftX(-(this.group.getBBox().x + this.width + lineLength));
+ (function shift() {
+ var hasSymbolUnder = false;
+ var symb;
+ for (var i = 0, len = self.chart.symbols.length; i < len; i++) {
+ symb = self.chart.symbols[i];
+
+ if (!self.params['align-next'] || self.params['align-next'] !== 'no') {
+ var diff = Math.abs(symb.getCenter().x - self.left_symbol.getCenter().x);
+ if (symb.getCenter().y > self.left_symbol.getCenter().y && diff <= self.left_symbol.width / 2) {
+ hasSymbolUnder = true;
+ break;
+ }
+ }
+ }
+
+ if (hasSymbolUnder) {
+ if (self.left_symbol.symbolType === 'end') return;
+ self.left_symbol.setX(symb.getX() + symb.width + lineLength);
+ shift();
+ }
+ })();
+
+ this.left_symbol.isPositioned = true;
+
+ this.left_symbol.render();
+ }
+ }
+
+ if (this.right_symbol) {
+ var rightPoint = this.getRight();
+
+ if (!this.right_symbol.isPositioned) {
+ this.right_symbol.setY(rightPoint.y - this.right_symbol.height / 2);
+ this.right_symbol.shiftX(this.group.getBBox().x + this.width + lineLength);
+ (function shift() {
+ var hasSymbolUnder = false;
+ var symb;
+ for (var i = 0, len = self.chart.symbols.length; i < len; i++) {
+ symb = self.chart.symbols[i];
+
+ if (!self.params['align-next'] || self.params['align-next'] !== 'no') {
+ var diff = Math.abs(symb.getCenter().x - self.right_symbol.getCenter().x);
+ if (symb.getCenter().y > self.right_symbol.getCenter().y && diff <= self.right_symbol.width / 2) {
+ hasSymbolUnder = true;
+ break;
+ }
+ }
+ }
+
+ if (hasSymbolUnder) {
+ if (self.right_symbol.symbolType === 'end') return;
+ self.right_symbol.setX(symb.getX() + symb.width + lineLength);
+ shift();
+ }
+ })();
+
+ this.right_symbol.isPositioned = true;
+
+ this.right_symbol.render();
+ }
+ }
+};
+
+Parallel.prototype.renderLines = function() {
+ if (this.path1_symbol) {
+ this.drawLineTo(this.path1_symbol, this.path1_annotation, this.path1_direction);
+ }
+
+ if (this.path2_symbol) {
+ this.drawLineTo(this.path2_symbol, this.path2_annotation, this.path2_direction);
+ }
+
+ if (this.path3_symbol) {
+ this.drawLineTo(this.path3_symbol, this.path3_annotation, this.path3_direction);
+ }
+};
+
+module.exports = Parallel;
\ No newline at end of file
diff --git a/src/flowchart.symbol.start.js b/src/flowchart.symbol.start.js
index f594080d..881d4d5a 100644
--- a/src/flowchart.symbol.start.js
+++ b/src/flowchart.symbol.start.js
@@ -1,11 +1,15 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+
function Start(chart, options) {
var symbol = chart.paper.rect(0, 0, 0, 0, 20);
options = options || {};
options.text = options.text || 'Start';
Symbol.call(this, chart, options, symbol);
}
-f.inherits(Start, Symbol);
+inherits(Start, Symbol);
+module.exports = Start;
// Start.prototype.render = function() {
// if (this.next) {
@@ -28,4 +32,4 @@ f.inherits(Start, Symbol);
// if (this.next) {
// this.drawLineTo(this.next);
// }
-// };
\ No newline at end of file
+// };
diff --git a/src/flowchart.symbol.subroutine.js b/src/flowchart.symbol.subroutine.js
index c8fd7411..fdbf6535 100644
--- a/src/flowchart.symbol.subroutine.js
+++ b/src/flowchart.symbol.subroutine.js
@@ -1,3 +1,6 @@
+var Symbol = require('./flowchart.symbol');
+var inherits = require('./flowchart.helpers').inherits;
+
function Subroutine(chart, options) {
var symbol = chart.paper.rect(0, 0, 0, 0);
options = options || {};
@@ -37,4 +40,6 @@ function Subroutine(chart, options) {
this.initialize();
}
-f.inherits(Subroutine, Symbol);
+inherits(Subroutine, Symbol);
+
+module.exports = Subroutine;
diff --git a/src/jquery-plugin.js b/src/jquery-plugin.js
new file mode 100644
index 00000000..71d8066f
--- /dev/null
+++ b/src/jquery-plugin.js
@@ -0,0 +1,80 @@
+if (typeof jQuery != 'undefined') {
+ var parse = require('./flowchart.parse');
+
+ (function( $ ) {
+ function paramFit(needle, haystack) {
+ return needle == haystack ||
+ ( Array.isArray(haystack) && (haystack.includes(needle) || haystack.includes(Number(needle)) ))
+ }
+ var methods = {
+ init : function(options) {
+ return this.each(function() {
+ var $this = $(this);
+ this.chart = parse($this.text());
+ $this.html('');
+ this.chart.drawSVG(this, options);
+ });
+ },
+ setFlowStateByParam : function(param, paramValue, newFlowState) {
+ return this.each(function() {
+ var chart = this.chart;
+
+ // @todo this should be part of Symbol API
+ var nextSymbolKeys = ['next', 'yes', 'no', 'path1', 'path2', 'path3'];
+
+ for (var property in chart.symbols) {
+ if (chart.symbols.hasOwnProperty(property)) {
+ var symbol = chart.symbols[property];
+ var val = symbol.params[param];
+ if (paramFit(val, paramValue)) {
+ symbol.flowstate = newFlowState;
+ for (var nski = 0; nski < nextSymbolKeys.length; nski++) {
+ var nextSymbolKey = nextSymbolKeys[nski];
+ if (
+ symbol[nextSymbolKey] &&
+ symbol[nextSymbolKey]['params'] &&
+ symbol[nextSymbolKey]['params'][param] &&
+ paramFit(symbol[nextSymbolKey]['params'][param], paramValue)
+ ) {
+ symbol.lineStyle[symbol[nextSymbolKey]['key']] = {stroke: chart.options()['flowstate'][newFlowState]['fill']};
+ }
+ }
+ }
+ }
+ }
+
+ chart.clean();
+ chart.drawSVG(this);
+ });
+
+ },
+ clearFlowState: function () {
+ return this.each(function() {
+ var chart = this.chart;
+
+ for (var property in chart.symbols) {
+ if (chart.symbols.hasOwnProperty(property)) {
+ var node = chart.symbols[property];
+ node.flowstate = '';
+ }
+ }
+
+ chart.clean();
+ chart.drawSVG(this);
+ });
+ }
+ };
+
+ $.fn.flowChart = function(methodOrOptions) {
+ if ( methods[methodOrOptions] ) {
+ return methods[ methodOrOptions ].apply( this, Array.prototype.slice.call( arguments, 1 ));
+ } else if ( typeof methodOrOptions === 'object' || ! methodOrOptions ) {
+ // Default to "init"
+ return methods.init.apply( this, arguments );
+ } else {
+ $.error( 'Method ' + methodOrOptions + ' does not exist on jQuery.flowChart' );
+ }
+ };
+
+ })(jQuery); // eslint-disable-line
+}
diff --git a/types/index.d.ts b/types/index.d.ts
new file mode 100644
index 00000000..76af8008
--- /dev/null
+++ b/types/index.d.ts
@@ -0,0 +1,43 @@
+declare module "flowchart.js" {
+ namespace FlowChart {
+ interface SVGOptions {
+ x: number;
+ y: number;
+ "line-width": number;
+ "line-length": number;
+ "text-margin": number;
+ "font-size": number;
+ "font-color": string;
+ "line-color": string;
+ "element-color": string;
+ fill: string;
+ roundness?: number;
+ "yes-text": string;
+ "no-text": string;
+ "arrow-end": string;
+ scale: number;
+ class: string;
+ [props: string]: any;
+ }
+
+ interface DrawOptions extends Partial {
+ /** Stymbol Styles */
+ symbols?: Record>;
+ /** FlowState config */
+ flowstate?: Record>;
+ }
+
+ interface Instance {
+ clean: () => void;
+ drawSVG: (container: HTMLElement | string, options?: DrawOptions) => void;
+ }
+ }
+
+ interface FlowChart {
+ parse: (code: string) => FlowChart.Instance;
+ }
+
+ const FlowChart: FlowChart;
+
+ export = FlowChart;
+}
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 00000000..4bdc0add
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,86 @@
+var path = require('path');
+var webpack = require('webpack');
+var moment = require('moment');
+
+var component = require('./package.json');
+var banner =
+ '// ' + component.name + ', v' + component.version + '\n' +
+ '// Copyright (c)' + moment().format('YYYY') + ' Adriano Raiano (adrai).\n' +
+ '// Distributed under MIT license\n' +
+ '// http://adrai.github.io/flowchart.js\n';
+
+var NODE_ENV = process.env.NODE_ENV || 'development';
+var defines = new webpack.DefinePlugin({
+ 'process.env': {
+ 'NODE_ENV': JSON.stringify(NODE_ENV)
+ }
+});
+
+var config = {
+ devtool: 'source-map', // always build source map
+ entry: [
+ 'webpack-hot-middleware/client',
+ './index'
+ ],
+ output: {
+ path: path.join(__dirname, 'release'),
+ filename: component.name + '.js',
+ publicPath: '/release/'
+ },
+ plugins: [
+ new webpack.HotModuleReplacementPlugin(),
+ new webpack.NoErrorsPlugin(),
+ defines
+ ],
+ resolve: {
+ extensions: ['', '.js'],
+ modulesDirectories: ['src', 'node_modules'],
+ alias: {
+ 'dev/raphael.core.js': './dev/raphael.core.js',
+ 'raphael.core': './raphael.core.js',
+ 'raphael.svg': './dev/raphael.svg.js',
+ 'raphael.vml': './dev/raphael.vml.js'
+ }
+ }
+};
+
+if (NODE_ENV === 'production') {
+ var minified = process.env.MINIFIED == '1';
+ var withoutJs = component.name;
+ withoutJs = withoutJs.replace('.js', '');
+ var filename = minified ? withoutJs + '.min.js' : withoutJs + '.js';
+ var uglifyOptions = {
+ sourceMap: true,
+ compressor: {
+ warnings: false,
+ dead_code: true
+ },
+ output: {
+ preamble: banner,
+ comments: false
+ }
+ };
+ if (!minified) {
+ uglifyOptions.beautify = true;
+ uglifyOptions.mangle = false;
+ uglifyOptions.output.comments = 'all';
+ }
+ config.entry = './index';
+ config.externals = {
+ raphael: 'Raphael'
+ };
+ config.output = {
+ devtoolLineToLine: true,
+ sourceMapFilename: filename + '.map',
+ path: path.join(__dirname, 'release'),
+ filename: filename,
+ libraryTarget: 'umd'
+ };
+ config.plugins = [
+ new webpack.optimize.OccurenceOrderPlugin(),
+ defines,
+ new webpack.optimize.UglifyJsPlugin(uglifyOptions)
+ ];
+}
+
+module.exports = config;