a.y)}function m(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function n(a,b,c,d,e,f,g,h,i){null==i&&(i=1),i=i>1?1:0>i?0:i;for(var j=i/2,k=12,l=[-.1252,.1252,-.3678,.3678,-.5873,.5873,-.7699,.7699,-.9041,.9041,-.9816,.9816],n=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],o=0,p=0;k>p;p++){var q=j*l[p]+j,r=m(q,a,c,e,g),s=m(q,b,d,f,h),t=r*r+s*s;o+=n[p]*N.sqrt(t)}return j*o}function o(a,b,c,d,e,f,g,h,i){if(!(0>i||n(a,b,c,d,e,f,g,h)o;)l/=2,m+=(i>j?1:-1)*l,j=n(a,b,c,d,e,f,g,h,m);return m}}function p(a,b,c,d,e,f,g,h){if(!(Q(a,c)Q(e,g)||Q(b,d)
Q(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(k){var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(!(n<+P(a,c).toFixed(2)||n>+Q(a,c).toFixed(2)||n<+P(e,g).toFixed(2)||n>+Q(e,g).toFixed(2)||o<+P(b,d).toFixed(2)||o>+Q(b,d).toFixed(2)||o<+P(f,h).toFixed(2)||o>+Q(f,h).toFixed(2)))return{x:l,y:m}}}}function q(a,b,c){var d=j(a),e=j(b);if(!l(d,e))return c?0:[];for(var f=n.apply(0,a),g=n.apply(0,b),h=~~(f/8),k=~~(g/8),m=[],o=[],q={},r=c?0:[],s=0;h+1>s;s++){var t=i.apply(0,a.concat(s/h));m.push({x:t.x,y:t.y,t:s/h})}for(s=0;k+1>s;s++)t=i.apply(0,b.concat(s/k)),o.push({x:t.x,y:t.y,t:s/k});for(s=0;h>s;s++)for(var u=0;k>u;u++){var v=m[s],w=m[s+1],x=o[u],y=o[u+1],z=S(w.x-v.x)<.001?"y":"x",A=S(y.x-x.x)<.001?"y":"x",B=p(v.x,v.y,w.x,w.y,x.x,x.y,y.x,y.y);if(B){if(q[B.x.toFixed(4)]==B.y.toFixed(4))continue;q[B.x.toFixed(4)]=B.y.toFixed(4);var C=v.t+S((B[z]-v[z])/(w[z]-v[z]))*(w.t-v.t),D=x.t+S((B[A]-x[A])/(y[A]-x[A]))*(y.t-x.t);C>=0&&1>=C&&D>=0&&1>=D&&(c?r++:r.push({x:B.x,y:B.y,t1:C,t2:D}))}}return r}function r(a,b){return t(a,b)}function s(a,b){return t(a,b,1)}function t(a,b,c){a=E(a),b=E(b);for(var d,e,f,g,h,i,j,k,l,m,n=c?0:[],o=0,p=a.length;p>o;o++){var r=a[o];if("M"==r[0])d=h=r[1],e=i=r[2];else{"C"==r[0]?(l=[d,e].concat(r.slice(1)),d=l[6],e=l[7]):(l=[d,e,d,e,h,i,h,i],d=h,e=i);for(var s=0,t=b.length;t>s;s++){var u=b[s];if("M"==u[0])f=j=u[1],g=k=u[2];else{"C"==u[0]?(m=[f,g].concat(u.slice(1)),f=m[6],g=m[7]):(m=[f,g,f,g,j,k,j,k],f=j,g=k);var v=q(l,m,c);if(c)n+=v;else{for(var w=0,x=v.length;x>w;w++)v[w].segment1=o,v[w].segment2=s,v[w].bez1=l,v[w].bez2=m;n=n.concat(v)}}}}}return n}function u(a,b,c){var d=v(a);return k(d,b,c)&&t(a,[["M",b,c],["H",d.x2+10]],1)%2==1}function v(a){var b=c(a);if(b.bbox)return J(b.bbox);if(!a)return d();a=E(a);for(var e,f=0,g=0,h=[],i=[],j=0,k=a.length;k>j;j++)if(e=a[j],"M"==e[0])f=e[1],g=e[2],h.push(f),i.push(g);else{var l=D(f,g,e[1],e[2],e[3],e[4],e[5],e[6]);h=h.concat(l.min.x,l.max.x),i=i.concat(l.min.y,l.max.y),f=e[5],g=e[6]}var m=P.apply(0,h),n=P.apply(0,i),o=Q.apply(0,h),p=Q.apply(0,i),q=d(m,n,o-m,p-n);return b.bbox=J(q),q}function w(a,b,c,d,f){if(f)return[["M",+a+ +f,b],["l",c-2*f,0],["a",f,f,0,0,1,f,f],["l",0,d-2*f],["a",f,f,0,0,1,-f,f],["l",2*f-c,0],["a",f,f,0,0,1,-f,-f],["l",0,2*f-d],["a",f,f,0,0,1,f,-f],["z"]];var g=[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]];return g.toString=e,g}function x(a,b,c,d,f){if(null==f&&null==d&&(d=c),a=+a,b=+b,c=+c,d=+d,null!=f)var g=Math.PI/180,h=a+c*Math.cos(-d*g),i=a+c*Math.cos(-f*g),j=b+c*Math.sin(-d*g),k=b+c*Math.sin(-f*g),l=[["M",h,j],["A",c,c,0,+(f-d>180),0,i,k]];else l=[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]];return l.toString=e,l}function y(b){var d=c(b),g=String.prototype.toLowerCase;if(d.rel)return f(d.rel);a.is(b,"array")&&a.is(b&&b[0],"array")||(b=a.parsePathString(b));var h=[],i=0,j=0,k=0,l=0,m=0;"M"==b[0][0]&&(i=b[0][1],j=b[0][2],k=i,l=j,m++,h.push(["M",i,j]));for(var n=m,o=b.length;o>n;n++){var p=h[n]=[],q=b[n];if(q[0]!=g.call(q[0]))switch(p[0]=g.call(q[0]),p[0]){case"a":p[1]=q[1],p[2]=q[2],p[3]=q[3],p[4]=q[4],p[5]=q[5],p[6]=+(q[6]-i).toFixed(3),p[7]=+(q[7]-j).toFixed(3);break;case"v":p[1]=+(q[1]-j).toFixed(3);break;case"m":k=q[1],l=q[2];default:for(var r=1,s=q.length;s>r;r++)p[r]=+(q[r]-(r%2?i:j)).toFixed(3)}else{p=h[n]=[],"m"==q[0]&&(k=q[1]+i,l=q[2]+j);for(var t=0,u=q.length;u>t;t++)h[n][t]=q[t]}var v=h[n].length;switch(h[n][0]){case"z":i=k,j=l;break;case"h":i+=+h[n][v-1];break;case"v":j+=+h[n][v-1];break;default:i+=+h[n][v-2],j+=+h[n][v-1]}}return h.toString=e,d.rel=f(h),h}function z(b){var d=c(b);if(d.abs)return f(d.abs);if(I(b,"array")&&I(b&&b[0],"array")||(b=a.parsePathString(b)),!b||!b.length)return[["M",0,0]];var g,h=[],i=0,j=0,k=0,l=0,m=0;"M"==b[0][0]&&(i=+b[0][1],j=+b[0][2],k=i,l=j,m++,h[0]=["M",i,j]);for(var n,o,p=3==b.length&&"M"==b[0][0]&&"R"==b[1][0].toUpperCase()&&"Z"==b[2][0].toUpperCase(),q=m,r=b.length;r>q;q++){if(h.push(n=[]),o=b[q],g=o[0],g!=g.toUpperCase())switch(n[0]=g.toUpperCase(),n[0]){case"A":n[1]=o[1],n[2]=o[2],n[3]=o[3],n[4]=o[4],n[5]=o[5],n[6]=+o[6]+i,n[7]=+o[7]+j;break;case"V":n[1]=+o[1]+j;break;case"H":n[1]=+o[1]+i;break;case"R":for(var s=[i,j].concat(o.slice(1)),t=2,u=s.length;u>t;t++)s[t]=+s[t]+i,s[++t]=+s[t]+j;h.pop(),h=h.concat(G(s,p));break;case"O":h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);break;case"U":h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=["U"].concat(h[h.length-1].slice(-2));break;case"M":k=+o[1]+i,l=+o[2]+j;default:for(t=1,u=o.length;u>t;t++)n[t]=+o[t]+(t%2?i:j)}else if("R"==g)s=[i,j].concat(o.slice(1)),h.pop(),h=h.concat(G(s,p)),n=["R"].concat(o.slice(-2));else if("O"==g)h.pop(),s=x(i,j,o[1],o[2]),s.push(s[0]),h=h.concat(s);else if("U"==g)h.pop(),h=h.concat(x(i,j,o[1],o[2],o[3])),n=["U"].concat(h[h.length-1].slice(-2));else for(var v=0,w=o.length;w>v;v++)n[v]=o[v];if(g=g.toUpperCase(),"O"!=g)switch(n[0]){case"Z":i=+k,j=+l;break;case"H":i=n[1];break;case"V":j=n[1];break;case"M":k=n[n.length-2],l=n[n.length-1];default:i=n[n.length-2],j=n[n.length-1]}}return h.toString=e,d.abs=f(h),h}function A(a,b,c,d){return[a,b,c,d,c,d]}function B(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]}function C(b,c,d,e,f,g,h,i,j,k){var l,m=120*O/180,n=O/180*(+f||0),o=[],p=a._.cacher(function(a,b,c){var d=a*N.cos(c)-b*N.sin(c),e=a*N.sin(c)+b*N.cos(c);return{x:d,y:e}});if(k)y=k[0],z=k[1],w=k[2],x=k[3];else{l=p(b,c,-n),b=l.x,c=l.y,l=p(i,j,-n),i=l.x,j=l.y;var q=(N.cos(O/180*f),N.sin(O/180*f),(b-i)/2),r=(c-j)/2,s=q*q/(d*d)+r*r/(e*e);s>1&&(s=N.sqrt(s),d=s*d,e=s*e);var t=d*d,u=e*e,v=(g==h?-1:1)*N.sqrt(S((t*u-t*r*r-u*q*q)/(t*r*r+u*q*q))),w=v*d*r/e+(b+i)/2,x=v*-e*q/d+(c+j)/2,y=N.asin(((c-x)/e).toFixed(9)),z=N.asin(((j-x)/e).toFixed(9));y=w>b?O-y:y,z=w>i?O-z:z,0>y&&(y=2*O+y),0>z&&(z=2*O+z),h&&y>z&&(y-=2*O),!h&&z>y&&(z-=2*O)}var A=z-y;if(S(A)>m){var B=z,D=i,E=j;z=y+m*(h&&z>y?1:-1),i=w+d*N.cos(z),j=x+e*N.sin(z),o=C(i,j,d,e,f,0,h,D,E,[z,B,w,x])}A=z-y;var F=N.cos(y),G=N.sin(y),H=N.cos(z),I=N.sin(z),J=N.tan(A/4),K=4/3*d*J,L=4/3*e*J,M=[b,c],P=[b+K*G,c-L*F],Q=[i+K*I,j-L*H],R=[i,j];if(P[0]=2*M[0]-P[0],P[1]=2*M[1]-P[1],k)return[P,Q,R].concat(o);o=[P,Q,R].concat(o).join().split(",");for(var T=[],U=0,V=o.length;V>U;U++)T[U]=U%2?p(o[U-1],o[U],n).y:p(o[U],o[U+1],n).x;return T}function D(a,b,c,d,e,f,g,h){for(var i,j,k,l,m,n,o,p,q=[],r=[[],[]],s=0;2>s;++s)if(0==s?(j=6*a-12*c+6*e,i=-3*a+9*c-9*e+3*g,k=3*c-3*a):(j=6*b-12*d+6*f,i=-3*b+9*d-9*f+3*h,k=3*d-3*b),S(i)<1e-12){if(S(j)<1e-12)continue;l=-k/j,l>0&&1>l&&q.push(l)}else o=j*j-4*k*i,p=N.sqrt(o),0>o||(m=(-j+p)/(2*i),m>0&&1>m&&q.push(m),n=(-j-p)/(2*i),n>0&&1>n&&q.push(n));for(var t,u=q.length,v=u;u--;)l=q[u],t=1-l,r[0][u]=t*t*t*a+3*t*t*l*c+3*t*l*l*e+l*l*l*g,r[1][u]=t*t*t*b+3*t*t*l*d+3*t*l*l*f+l*l*l*h;return r[0][v]=a,r[1][v]=b,r[0][v+1]=g,r[1][v+1]=h,r[0].length=r[1].length=v+2,{min:{x:P.apply(0,r[0]),y:P.apply(0,r[1])},max:{x:Q.apply(0,r[0]),y:Q.apply(0,r[1])}}}function E(a,b){var d=!b&&c(a);if(!b&&d.curve)return f(d.curve);for(var e=z(a),g=b&&z(b),h={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},i={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},j=(function(a,b,c){var d,e;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];switch(!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null),a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"].concat(C.apply(0,[b.x,b.y].concat(a.slice(1))));break;case"S":"C"==c||"S"==c?(d=2*b.x-b.bx,e=2*b.y-b.by):(d=b.x,e=b.y),a=["C",d,e].concat(a.slice(1));break;case"T":"Q"==c||"T"==c?(b.qx=2*b.x-b.qx,b.qy=2*b.y-b.qy):(b.qx=b.x,b.qy=b.y),a=["C"].concat(B(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"].concat(B(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"].concat(A(b.x,b.y,a[1],a[2]));break;case"H":a=["C"].concat(A(b.x,b.y,a[1],b.y));break;case"V":a=["C"].concat(A(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"].concat(A(b.x,b.y,b.X,b.Y))}return a}),k=function(a,b){if(a[b].length>7){a[b].shift();for(var c=a[b];c.length;)m[b]="A",g&&(n[b]="A"),a.splice(b++,0,["C"].concat(c.splice(0,6)));a.splice(b,1),r=Q(e.length,g&&g.length||0)}},l=function(a,b,c,d,f){a&&b&&"M"==a[f][0]&&"M"!=b[f][0]&&(b.splice(f,0,["M",d.x,d.y]),c.bx=0,c.by=0,c.x=a[f][1],c.y=a[f][2],r=Q(e.length,g&&g.length||0))},m=[],n=[],o="",p="",q=0,r=Q(e.length,g&&g.length||0);r>q;q++){e[q]&&(o=e[q][0]),"C"!=o&&(m[q]=o,q&&(p=m[q-1])),e[q]=j(e[q],h,p),"A"!=m[q]&&"C"==o&&(m[q]="C"),k(e,q),g&&(g[q]&&(o=g[q][0]),"C"!=o&&(n[q]=o,q&&(p=n[q-1])),g[q]=j(g[q],i,p),"A"!=n[q]&&"C"==o&&(n[q]="C"),k(g,q)),l(e,g,h,i,q),l(g,e,i,h,q);var s=e[q],t=g&&g[q],u=s.length,v=g&&t.length;h.x=s[u-2],h.y=s[u-1],h.bx=M(s[u-4])||h.x,h.by=M(s[u-3])||h.y,i.bx=g&&(M(t[v-4])||i.x),i.by=g&&(M(t[v-3])||i.y),i.x=g&&t[v-2],i.y=g&&t[v-1]}return g||(d.curve=f(e)),g?[e,g]:e}function F(a,b){if(!b)return a;var c,d,e,f,g,h,i;for(a=E(a),e=0,g=a.length;g>e;e++)for(i=a[e],f=1,h=i.length;h>f;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d;return a}function G(a,b){for(var c=[],d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}var H=b.prototype,I=a.is,J=a._.clone,K="hasOwnProperty",L=/,?([a-z]),?/gi,M=parseFloat,N=Math,O=N.PI,P=N.min,Q=N.max,R=N.pow,S=N.abs,T=h(1),U=h(),V=h(0,1),W=a._unit2px,X={path:function(a){return a.attr("path")},circle:function(a){var b=W(a);return x(b.cx,b.cy,b.r)},ellipse:function(a){var b=W(a);return x(b.cx||0,b.cy||0,b.rx,b.ry)},rect:function(a){var b=W(a);return w(b.x||0,b.y||0,b.width,b.height,b.rx,b.ry)},image:function(a){var b=W(a);return w(b.x||0,b.y||0,b.width,b.height)},line:function(a){return"M"+[a.attr("x1")||0,a.attr("y1")||0,a.attr("x2"),a.attr("y2")]},polyline:function(a){return"M"+a.attr("points")},polygon:function(a){return"M"+a.attr("points")+"z"},deflt:function(a){var b=a.node.getBBox();return w(b.x,b.y,b.width,b.height)}};a.path=c,a.path.getTotalLength=T,a.path.getPointAtLength=U,a.path.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return V(a,b).end;var d=V(a,c,1);return b?V(d,b).end:d},H.getTotalLength=function(){return this.node.getTotalLength?this.node.getTotalLength():void 0},H.getPointAtLength=function(a){return U(this.attr("d"),a)},H.getSubpath=function(b,c){return a.path.getSubpath(this.attr("d"),b,c)},a._.box=d,a.path.findDotsAtSegment=i,a.path.bezierBBox=j,a.path.isPointInsideBBox=k,a.closest=function(b,c,e,f){for(var g=100,h=d(b-g/2,c-g/2,g,g),i=[],j=e[0].hasOwnProperty("x")?function(a){return{x:e[a].x,y:e[a].y}}:function(a){return{x:e[a],y:f[a]}},l=0;1e6>=g&&!l;){for(var m=0,n=e.length;n>m;m++){var o=j(m);if(k(h,o.x,o.y)){l++,i.push(o);break}}l||(g*=2,h=d(b-g/2,c-g/2,g,g))}if(1e6!=g){var p,q=1/0;for(m=0,n=i.length;n>m;m++){var r=a.len(b,c,i[m].x,i[m].y);q>r&&(q=r,i[m].len=r,p=i[m])}return p}},a.path.isBBoxIntersect=l,a.path.intersection=r,a.path.intersectionNumber=s,a.path.isPointInside=u,a.path.getBBox=v,a.path.get=X,a.path.toRelative=y,a.path.toAbsolute=z,a.path.toCubic=E,a.path.map=F,a.path.toString=e,a.path.clone=f}),d.plugin(function(a){var d=Math.max,e=Math.min,f=function(a){if(this.items=[],this.bindings={},this.length=0,this.type="set",a)for(var b=0,c=a.length;c>b;b++)a[b]&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},g=f.prototype;g.push=function(){for(var a,b,c=0,d=arguments.length;d>c;c++)a=arguments[c],a&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},g.pop=function(){return this.length&&delete this[this.length--],this.items.pop()},g.forEach=function(a,b){for(var c=0,d=this.items.length;d>c;c++)if(a.call(b,this.items[c],c)===!1)return this;return this},g.animate=function(d,e,f,g){"function"!=typeof f||f.length||(g=f,f=c.linear),d instanceof a._.Animation&&(g=d.callback,f=d.easing,e=f.dur,d=d.attr);var h=arguments;if(a.is(d,"array")&&a.is(h[h.length-1],"array"))var i=!0;var j,k=function(){j?this.b=j:j=this.b},l=0,m=this,n=g&&function(){++l==m.length&&g.call(this)
+};return this.forEach(function(a,c){b.once("snap.animcreated."+a.id,k),i?h[c]&&a.animate.apply(a,h[c]):a.animate(d,e,f,n)})},g.remove=function(){for(;this.length;)this.pop().remove();return this},g.bind=function(a,b,c){var d={};if("function"==typeof b)this.bindings[a]=b;else{var e=c||a;this.bindings[a]=function(a){d[e]=a,b.attr(d)}}return this},g.attr=function(a){var b={};for(var c in a)this.bindings[c]?this.bindings[c](a[c]):b[c]=a[c];for(var d=0,e=this.items.length;e>d;d++)this.items[d].attr(b);return this},g.clear=function(){for(;this.length;)this.pop()},g.splice=function(a,b){a=0>a?d(this.length+a,0):a,b=d(0,e(this.length-a,b));var c,g=[],h=[],i=[];for(c=2;cc;c++)h.push(this[a+c]);for(;cc?i[c]:g[c-j];for(c=this.items.length=this.length-=b-j;this[c];)delete this[c++];return new f(h)},g.exclude=function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]==a)return this.splice(b,1),!0;return!1},g.insertAfter=function(a){for(var b=this.items.length;b--;)this.items[b].insertAfter(a);return this},g.getBBox=function(){for(var a=[],b=[],c=[],f=[],g=this.items.length;g--;)if(!this.items[g].removed){var h=this.items[g].getBBox();a.push(h.x),b.push(h.y),c.push(h.x+h.width),f.push(h.y+h.height)}return a=e.apply(0,a),b=e.apply(0,b),c=d.apply(0,c),f=d.apply(0,f),{x:a,y:b,x2:c,y2:f,width:c-a,height:f-b,cx:a+(c-a)/2,cy:b+(f-b)/2}},g.clone=function(a){a=new f;for(var b=0,c=this.items.length;c>b;b++)a.push(this.items[b].clone());return a},g.toString=function(){return"Snap‘s set"},g.type="set",a.Set=f,a.set=function(){var a=new f;return arguments.length&&a.push.apply(a,Array.prototype.slice.call(arguments,0)),a}}),d.plugin(function(a,c){function d(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return 4==a.length?[b,0,a[2],a[3]]:[b,0];case"s":return 5==a.length?[b,1,1,a[3],a[4]]:3==a.length?[b,1,1]:[b,1]}}function e(b,c,e){c=p(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];for(var f,g,h,i,l=Math.max(b.length,c.length),m=[],n=[],o=0;l>o;o++){if(h=b[o]||d(c[o]),i=c[o]||d(h),h[0]!=i[0]||"r"==h[0].toLowerCase()&&(h[2]!=i[2]||h[3]!=i[3])||"s"==h[0].toLowerCase()&&(h[3]!=i[3]||h[4]!=i[4])){b=a._.transform2matrix(b,e()),c=a._.transform2matrix(c,e()),m=[["m",b.a,b.b,b.c,b.d,b.e,b.f]],n=[["m",c.a,c.b,c.c,c.d,c.e,c.f]];break}for(m[o]=[],n[o]=[],f=0,g=Math.max(h.length,i.length);g>f;f++)f in h&&(m[o][f]=h[f]),f in i&&(n[o][f]=i[f])}return{from:k(m),to:k(n),f:j(m)}}function f(a){return a}function g(a){return function(b){return+b.toFixed(3)+a}}function h(a){return a.join(" ")}function i(b){return a.rgb(b[0],b[1],b[2])}function j(a){var b,c,d,e,f,g,h=0,i=[];for(b=0,c=a.length;c>b;b++){for(f="[",g=['"'+a[b][0]+'"'],d=1,e=a[b].length;e>d;d++)g[d]="val["+h++ +"]";f+=g+"]",i[b]=f}return Function("val","return Snap.path.toString.call(["+i+"])")}function k(a){for(var b=[],c=0,d=a.length;d>c;c++)for(var e=1,f=a[c].length;f>e;e++)b.push(a[c][e]);return b}function l(a){return isFinite(parseFloat(a))}function m(b,c){return a.is(b,"array")&&a.is(c,"array")?b.toString()==c.toString():!1}var n={},o=/[a-z]+$/i,p=String;n.stroke=n.fill="colour",c.prototype.equal=function(a,c){return b("snap.util.equal",this,a,c).firstDefined()},b.on("snap.util.equal",function(b,c){var d,q,r=p(this.attr(b)||""),s=this;if(l(r)&&l(c))return{from:parseFloat(r),to:parseFloat(c),f:f};if("colour"==n[b])return d=a.color(r),q=a.color(c),{from:[d.r,d.g,d.b,d.opacity],to:[q.r,q.g,q.b,q.opacity],f:i};if("viewBox"==b)return d=this.attr(b).vb.split(" ").map(Number),q=c.split(" ").map(Number),{from:d,to:q,f:h};if("transform"==b||"gradientTransform"==b||"patternTransform"==b)return c instanceof a.Matrix&&(c=c.toTransformString()),a._.rgTransform.test(c)||(c=a._.svgTransform2string(c)),e(r,c,function(){return s.getBBox(1)});if("d"==b||"path"==b)return d=a.path.toCubic(r,c),{from:k(d[0]),to:k(d[1]),f:j(d[0])};if("points"==b)return d=p(r).split(a._.separator),q=p(c).split(a._.separator),{from:d,to:q,f:function(a){return a}};var t=r.match(o),u=p(c).match(o);return t&&m(t,u)?{from:parseFloat(r),to:parseFloat(c),f:g(t)}:{from:this.asPX(b),to:this.asPX(b,c),f:f}})}),d.plugin(function(a,c,d,e){for(var f=c.prototype,g="hasOwnProperty",h=("createTouch"in e.doc),i=["click","dblclick","mousedown","mousemove","mouseout","mouseover","mouseup","touchstart","touchmove","touchend","touchcancel"],j={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},k=(function(a,b){var c="y"==a?"scrollTop":"scrollLeft",d=b&&b.node?b.node.ownerDocument:e.doc;return d[c in d.documentElement?"documentElement":"body"][c]}),l=function(){return this.originalEvent.preventDefault()},m=function(){return this.originalEvent.stopPropagation()},n=function(a,b,c,d){var e=h&&j[b]?j[b]:b,f=function(e){var f=k("y",d),i=k("x",d);if(h&&j[g](b))for(var n=0,o=e.targetTouches&&e.targetTouches.length;o>n;n++)if(e.targetTouches[n].target==a||a.contains(e.targetTouches[n].target)){var p=e;e=e.targetTouches[n],e.originalEvent=p,e.preventDefault=l,e.stopPropagation=m;break}var q=e.clientX+i,r=e.clientY+f;return c.call(d,e,q,r)};return b!==e&&a.addEventListener(b,f,!1),a.addEventListener(e,f,!1),function(){return b!==e&&a.removeEventListener(b,f,!1),a.removeEventListener(e,f,!1),!0}},o=[],p=function(a){for(var c,d=a.clientX,e=a.clientY,f=k("y"),g=k("x"),i=o.length;i--;){if(c=o[i],h){for(var j,l=a.touches&&a.touches.length;l--;)if(j=a.touches[l],j.identifier==c.el._drag.id||c.el.node.contains(j.target)){d=j.clientX,e=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}else a.preventDefault();{var m=c.el.node;m.nextSibling,m.parentNode,m.style.display}d+=g,e+=f,b("snap.drag.move."+c.el.id,c.move_scope||c.el,d-c.el._drag.x,e-c.el._drag.y,d,e,a)}},q=function(c){a.unmousemove(p).unmouseup(q);for(var d,e=o.length;e--;)d=o[e],d.el._drag={},b("snap.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,c),b.off("snap.drag.*."+d.el.id);o=[]},r=i.length;r--;)!function(b){a[b]=f[b]=function(c,d){if(a.is(c,"function"))this.events=this.events||[],this.events.push({name:b,f:c,unbind:n(this.node||document,b,c,d||this)});else for(var e=0,f=this.events.length;f>e;e++)if(this.events[e].name==b)try{this.events[e].f.call(this)}catch(g){}return this},a["un"+b]=f["un"+b]=function(a){for(var c=this.events||[],d=c.length;d--;)if(c[d].name==b&&(c[d].f==a||!a))return c[d].unbind(),c.splice(d,1),!c.length&&delete this.events,this;return this}}(i[r]);f.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},f.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var s=[];f.drag=function(c,d,e,f,g,h){function i(i,j,l){(i.originalEvent||i).preventDefault(),k._drag.x=j,k._drag.y=l,k._drag.id=i.identifier,!o.length&&a.mousemove(p).mouseup(q),o.push({el:k,move_scope:f,start_scope:g,end_scope:h}),d&&b.on("snap.drag.start."+k.id,d),c&&b.on("snap.drag.move."+k.id,c),e&&b.on("snap.drag.end."+k.id,e),b("snap.drag.start."+k.id,g||f||k,j,l,i)}function j(a,c,d){b("snap.draginit."+k.id,k,a,c,d)}var k=this;if(!arguments.length){var l;return k.drag(function(a,b){this.attr({transform:l+(l?"T":"t")+[a,b]})},function(){l=this.transform().local})}return b.on("snap.draginit."+k.id,i),k._drag={},s.push({el:k,start:i,init:j}),k.mousedown(j),k},f.undrag=function(){for(var c=s.length;c--;)s[c].el==this&&(this.unmousedown(s[c].init),s.splice(c,1),b.unbind("snap.drag.*."+this.id),b.unbind("snap.draginit."+this.id));return!s.length&&a.unmousemove(p).unmouseup(q),this}}),d.plugin(function(a,c,d){var e=(c.prototype,d.prototype),f=/^\s*url\((.+)\)/,g=String,h=a._.$;a.filter={},e.filter=function(b){var d=this;"svg"!=d.type&&(d=d.paper);var e=a.parse(g(b)),f=a._.id(),i=(d.node.offsetWidth,d.node.offsetHeight,h("filter"));return h(i,{id:f,filterUnits:"userSpaceOnUse"}),i.appendChild(e.node),d.defs.appendChild(i),new c(i)},b.on("snap.util.getattr.filter",function(){b.stop();var c=h(this.node,"filter");if(c){var d=g(c).match(f);return d&&a.select(d[1])}}),b.on("snap.util.attr.filter",function(d){if(d instanceof c&&"filter"==d.type){b.stop();var e=d.node.id;e||(h(d.node,{id:d.id}),e=d.id),h(this.node,{filter:a.url(e)})}d&&"none"!=d||(b.stop(),this.node.removeAttribute("filter"))}),a.filter.blur=function(b,c){null==b&&(b=2);var d=null==c?b:[b,c];return a.format('',{def:d})},a.filter.blur.toString=function(){return this()},a.filter.shadow=function(b,c,d,e,f){return"string"==typeof d&&(e=d,f=e,d=4),"string"!=typeof e&&(f=e,e="#000"),e=e||"#000",null==d&&(d=4),null==f&&(f=1),null==b&&(b=0,c=2),null==c&&(c=b),e=a.color(e),a.format('',{color:e,dx:b,dy:c,blur:d,opacity:f})},a.filter.shadow.toString=function(){return this()},a.filter.grayscale=function(b){return null==b&&(b=1),a.format('',{a:.2126+.7874*(1-b),b:.7152-.7152*(1-b),c:.0722-.0722*(1-b),d:.2126-.2126*(1-b),e:.7152+.2848*(1-b),f:.0722-.0722*(1-b),g:.2126-.2126*(1-b),h:.0722+.9278*(1-b)})},a.filter.grayscale.toString=function(){return this()},a.filter.sepia=function(b){return null==b&&(b=1),a.format('',{a:.393+.607*(1-b),b:.769-.769*(1-b),c:.189-.189*(1-b),d:.349-.349*(1-b),e:.686+.314*(1-b),f:.168-.168*(1-b),g:.272-.272*(1-b),h:.534-.534*(1-b),i:.131+.869*(1-b)})},a.filter.sepia.toString=function(){return this()},a.filter.saturate=function(b){return null==b&&(b=1),a.format('',{amount:1-b})},a.filter.saturate.toString=function(){return this()},a.filter.hueRotate=function(b){return b=b||0,a.format('',{angle:b})},a.filter.hueRotate.toString=function(){return this()},a.filter.invert=function(b){return null==b&&(b=1),a.format('',{amount:b,amount2:1-b})},a.filter.invert.toString=function(){return this()},a.filter.brightness=function(b){return null==b&&(b=1),a.format('',{amount:b})},a.filter.brightness.toString=function(){return this()},a.filter.contrast=function(b){return null==b&&(b=1),a.format('',{amount:b,amount2:.5-b/2})},a.filter.contrast.toString=function(){return this()}}),d.plugin(function(a,b){var c=a._.box,d=a.is,e=/^[^a-z]*([tbmlrc])/i,f=function(){return"T"+this.dx+","+this.dy};b.prototype.getAlign=function(a,b){null==b&&d(a,"string")&&(b=a,a=null),a=a||this.paper;var g=a.getBBox?a.getBBox():c(a),h=this.getBBox(),i={};switch(b=b&&b.match(e),b=b?b[1].toLowerCase():"c"){case"t":i.dx=0,i.dy=g.y-h.y;break;case"b":i.dx=0,i.dy=g.y2-h.y2;break;case"m":i.dx=0,i.dy=g.cy-h.cy;break;case"l":i.dx=g.x-h.x,i.dy=0;break;case"r":i.dx=g.x2-h.x2,i.dy=0;break;default:i.dx=g.cx-h.cx,i.dy=0}return i.toString=f,i},b.prototype.align=function(a,b){return this.transform("..."+this.getAlign(a,b))}}),d});
Index: lams_central/web/includes/javascript/authoring/authoringActivity.js
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/includes/javascript/authoring/authoringActivity.js,v
diff -u -r1.50 -r1.51
--- lams_central/web/includes/javascript/authoring/authoringActivity.js 23 Jun 2015 17:37:03 -0000 1.50
+++ lams_central/web/includes/javascript/authoring/authoringActivity.js 26 Jun 2015 08:33:23 -0000 1.51
@@ -277,19 +277,24 @@
}
// create activity SVG elements
- paper.setStart();
- var shape = paper.path(Raphael.format('M {0} {1} a 8 8 0 1 0 16 0 a 8 8 0 1 0 -16 0', x, y + 8))
+ this.items = Snap.set();
+ var shape = paper.path(Snap.format('M {x} {y} a 8 8 0 1 0 16 0 a 8 8 0 1 0 -16 0',
+ {
+ 'x' : x,
+ 'y' : y + 8
+ })
+ )
.attr({
+ 'stroke' : layout.colors.activityBorder,
'fill' : this.isStart ? layout.colors.branchingEdgeStart
: layout.colors.branchingEdgeEnd
- });
+ }),
+ title = this.branchingActivity.title,
+ label = paper.text(x + 8, y + 27, title + ' ' + (this.isStart ? LABELS.BRANCHING_START_SUFFIX
+ : LABELS.BRANCHING_END_SUFFIX))
+ .attr(layout.defaultTextAttributes);
- var title = this.branchingActivity.title;
- paper.text(x + 8, y + 27, title + ' ' + (this.isStart ? LABELS.BRANCHING_START_SUFFIX
- : LABELS.BRANCHING_END_SUFFIX))
- .attr(layout.defaultTextAttributes);
-
- this.items = paper.setFinish();
+ this.items.push(shape).push(label);
this.items.shape = shape;
ActivityLib.activityHandlersInit(this);
@@ -314,7 +319,7 @@
if (this.childActivities && this.childActivities.length > 0) {
// draw one by one, horizontally
var activityX = x + layout.conf.containerActivityPadding,
- allElements = paper.set(),
+ allElements = Snap.set(),
floatingActivity = this,
box = this.items.shape.getBBox();
$.each(this.childActivities, function(orderID){
@@ -340,7 +345,7 @@
layout.colors.optionalActivity);
}
- this.items.data('parentObject', this);
+ GeneralLib.applyToSet(this.items, 'data', ['parentObject', this]);
},
@@ -358,17 +363,22 @@
}
// create activity SVG elements
- paper.setStart();
- var shape = paper.path(Raphael.format('M {0} {1} l-9 9 v16 l9 9 h16 l9 -9 v-16 l-9 -9 z', x + 9, y))
+ this.items = Snap.set();
+ var shape = paper.path(Snap.format('M {x} {y} l-9 9 v16 l9 9 h16 l9 -9 v-16 l-9 -9 z',
+ {
+ 'x' : x + 9,
+ 'y' : y
+ })
+ )
.attr({
- 'fill' : layout.colors.gate
- });
+ 'stroke' : layout.colors.activityBorder,
+ 'fill' : layout.colors.gate
+ }),
+ label = paper.text(x + 17, y + 20, LABELS.GATE_ACTIVITY_LABEL)
+ .attr(layout.defaultTextAttributes)
+ .attr('stroke', layout.colors.gateText);
- paper.text(x + 17, y + 16, LABELS.GATE_ACTIVITY_LABEL)
- .attr(layout.defaultTextAttributes)
- .attr('stroke', layout.colors.gateText);
-
- this.items = paper.setFinish();
+ this.items.push(shape).push(label);
this.items.shape = shape;
ActivityLib.activityHandlersInit(this);
@@ -390,16 +400,22 @@
}
// create activity SVG elements
- paper.setStart();
- var shape = paper.path(Raphael.format('M {0} {1} h 125 v 50 h -125 z', x, y))
+ this.items = Snap.set();
+ var shape = paper.path(Snap.format('M {x} {y} h 125 v 50 h -125 z',
+ {
+ 'x' : x,
+ 'y' : y
+ })
+ )
.attr({
+ 'stroke' : layout.colors.activityBorder,
'fill' : layout.colors.grouping
- });
+ }),
+ icon = paper.image('../images/grouping.gif', x + 47, y + 2, 30, 30),
+ label = paper.text(x + 62, y + 40, ActivityLib.shortenActivityTitle(this.title))
+ .attr(layout.defaultTextAttributes);
- paper.image('../images/grouping.gif', x + 47, y + 2, 30, 30);
- paper.text(x + 62, y + 40, ActivityLib.shortenActivityTitle(this.title));
-
- this.items = paper.setFinish();
+ this.items.push(shape).push(icon).push(label);
this.items.shape = shape;
ActivityLib.activityHandlersInit(this);
@@ -424,14 +440,15 @@
if (this.childActivities && this.childActivities.length > 0) {
// draw one by one, vertically
var activityY = y + layout.conf.containerActivityPadding + 10,
- allElements = paper.set(),
+ allElements = Snap.set(),
optionalActivity = this,
- box = this.items.shape.getBBox();
+ box = this.items.shape.getBBox(),
+ boxWidth = box.width;
$.each(this.childActivities, function(orderID){
this.parentActivity = optionalActivity;
this.orderID = orderID + 1;
var childBox = this.items.shape.getBBox();
- this.draw(x + Math.max(layout.conf.containerActivityPadding, (box.width - childBox.width)/2), activityY);
+ this.draw(x + Math.max(layout.conf.containerActivityPadding, (boxWidth - childBox.width)/2), activityY);
childBox = this.items.shape.getBBox();
activityY = childBox.y2 + layout.conf.containerActivityChildrenPadding;
allElements.push(this.items.shape);
@@ -452,10 +469,11 @@
if (!isReadOnlyMode){
// allow transition drawing and other activity behaviour
- this.items.unmousedown().mousedown(HandlerActivityLib.activityMousedownHandler);
+ GeneralLib.applyToSet(this.items, 'unmousedown');
+ GeneralLib.applyToSet(this.items, 'mousedown', [HandlerActivityLib.activityMousedownHandler]);
}
- this.items.data('parentObject', this);
+ GeneralLib.applyToSet(this.items, 'data', ['parentObject', this]);
},
@@ -474,7 +492,7 @@
if (this.childActivities && this.childActivities.length > 0) {
// draw one by one, vertically
var activityY = y + layout.conf.containerActivityPadding + 10,
- allElements = paper.set(),
+ allElements = Snap.set(),
optionalActivity = this;
$.each(this.childActivities, function(orderID){
this.parentActivity = optionalActivity;
@@ -503,10 +521,11 @@
if (!isReadOnlyMode){
// allow transition drawing and other activity behaviour
- this.items.unmousedown().mousedown(HandlerActivityLib.activityMousedownHandler);
+ GeneralLib.applyToSet(this.items, 'unmousedown');
+ GeneralLib.applyToSet(this.items, 'mousedown', [HandlerActivityLib.activityMousedownHandler]);
}
- this.items.data('parentObject', this);
+ GeneralLib.applyToSet(this.items, 'data', ['parentObject', this]);
},
@@ -525,25 +544,30 @@
}
// create activity SVG elements
- this.items = paper.set();
- var shape = paper.path(Raphael.format('M {0} {1} h 125 v 50 h -125 z', x, y))
+ this.items = Snap.set();
+ var shape = paper.path(Snap.format('M {x} {y} h 125 v 50 h -125 z',
+ {
+ 'x' : x,
+ 'y' : y
+ }))
// activity colour depends on its category ID
.attr({
+ 'stroke' : layout.colors.activityBorder,
'fill' : layout.colors.activity[layout.toolMetadata[this.learningLibraryID].activityCategoryID]
- });
+ }),
+ // check for icon in the library
+ icon = paper.image(layout.toolMetadata[this.learningLibraryID].iconPath, x + 47, y + 3, 30, 30),
+ label = paper.text(x + 62, y + 43, ActivityLib.shortenActivityTitle(this.title))
+ .attr(layout.defaultTextAttributes)
+ .attr('fill', layout.colors.activityText);
+
+ this.items.push(shape).push(icon).push(label);
this.items.shape = shape;
- this.items.push(shape);
if (this.grouping) {
ActivityLib.addGroupingEffect(this);
}
- // check for icon in the library
- this.items.push(paper.image(layout.toolMetadata[this.learningLibraryID].iconPath, x + 47, y + 2, 30, 30));
- this.items.push(paper.text(x + 62, y + 40, ActivityLib.shortenActivityTitle(this.title))
- .attr(layout.defaultTextAttributes)
- .attr('fill', layout.colors.activityText));
-
ActivityLib.activityHandlersInit(this);
},
@@ -561,46 +585,51 @@
var points = ActivityLib.findTransitionPoints(this.fromActivity, this.toActivity);
// create transition SVG elements
- paper.setStart();
- paper.path(Raphael.format('M {0} {1} L {2} {3}', points.startX, points.startY, points.endX, points.endY))
- .attr({
- 'stroke' : layout.colors.transition,
- 'stroke-width' : 2
- });
-
- // draw the arrow and turn it in the same direction as the line
- var angle = 90 + Math.atan2(points.endY - points.startY, points.endX - points.startX) * 180 / Math.PI,
- arrowPath = Raphael.transformPath(Raphael.format('M {0} {1} l 10 15 a 25 25 0 0 0 -20 0 z',
- points.middleX, points.middleY),
- Raphael.format('R {0} {1} {2}', angle, points.middleX, points.middleY));
- paper.path(arrowPath)
- .attr({
- 'stroke' : layout.colors.transition,
- 'fill' : layout.colors.transition
- });
+ this.items = Snap.set();
+ var arrowShaft = paper.path(Snap.format('M {startX} {startY} L {endX} {endY}', points))
+ .attr({
+ 'stroke' : layout.colors.transition,
+ 'stroke-width' : 2
+ }),
+ // draw the arrow and turn it in the same direction as the line
+ angle = 90 + Math.atan2(points.endY - points.startY, points.endX - points.startX) * 180 / Math.PI,
+ arrowPath = paper.path(Snap.format('M {middleX} {middleY} l 10 15 a 25 25 0 0 0 -20 0 z', points))
+ .transform(Snap.format('R {angle} {points.middleX} {points.middleY}',
+ {
+ 'angle' : angle,
+ 'points' : points
+ })
+ )
+ .attr({
+ 'stroke' : layout.colors.transition,
+ 'fill' : layout.colors.transition
+ });
+ this.items.push(arrowShaft).push(arrowPath);
if (this.title) {
// adjust X & Y depending on the angle, so the label does not overlap with the transition;
// angle in Javascript is -90 <= a <= 270
- paper.text(points.middleX + ((angle > -45 && angle < 45) || (angle > 135 && angle < 225) ? 20 : 0),
- points.middleY + ((angle > 45 && angle < 135) || angle > 225 || angle < 45 ? -20 : 0),
- this.title)
- .attr('text-anchor', 'start');
+ var label = paper.text(points.middleX + ((angle > -45 && angle < 45) || (angle > 135 && angle < 225) ? 20 : 0),
+ points.middleY + ((angle > 45 && angle < 135) || angle > 225 || angle < 45 ? -20 : 0),
+ this.title)
+ .attr(layout.defaultTextAttributes)
+ .attr('text-anchor', 'start');
+
+ this.items.push(label);
}
- this.items = paper.setFinish();
- this.items.toBack();
+ GeneralLib.toBack(this.items);
// region annotations could cover grouping effect
$.each(layout.regions, function(){
- this.items.shape.toBack();
+ GeneralLib.toBack(this.items.shape);
});
- this.items.data('parentObject', this);
+ GeneralLib.applyToSet(this.items, 'data', ['parentObject', this]);
if (!isReadOnlyMode){
- this.items.attr('cursor', 'pointer');
- this.items.mousedown(HandlerTransitionLib.transitionMousedownHandler);
- this.items.click(HandlerLib.itemClickHandler);
+ GeneralLib.applyToSet(this.items, 'attr', ['cursor', 'pointer']);
+ GeneralLib.applyToSet(this.items, 'mousedown', [HandlerTransitionLib.transitionMousedownHandler]);
+ GeneralLib.applyToSet(this.items, 'click', [HandlerLib.itemClickHandler]);
}
}
},
@@ -616,33 +645,32 @@
* Make a new activity fully functional on canvas.
*/
activityHandlersInit : function(activity) {
- activity.items.data('parentObject', activity);
+ GeneralLib.applyToSet(activity.items, 'data', ['parentObject', activity]);
if (isReadOnlyMode) {
if (activitiesOnlySelectable) {
- activity.items.click(HandlerLib.itemClickHandler)
- .attr({
- 'cursor' : 'pointer'
- });
+ GeneralLib.applyToSet(activity.items, 'click', [HandlerLib.itemClickHandler]);
+ GeneralLib.applyToSet(activity.items, 'attr', [{'cursor' : 'pointer'}]);
}
} else {
// set all the handlers
- activity.items.mousedown(HandlerActivityLib.activityMousedownHandler)
- .click(HandlerLib.itemClickHandler)
- .dblclick(HandlerActivityLib.activityDblclickHandler)
- .attr({
- 'cursor' : 'pointer'
- });
+ GeneralLib.applyToSet(activity.items, 'mousedown', [HandlerActivityLib.activityMousedownHandler]);
+ GeneralLib.applyToSet(activity.items, 'click', [HandlerLib.itemClickHandler]);
+ GeneralLib.applyToSet(activity.items, 'dblclick', [HandlerActivityLib.activityDblclickHandler]);
+ GeneralLib.applyToSet(activity.items, 'attr', [{'cursor' : 'pointer'}]);
if (activity instanceof ActivityDefs.BranchingEdgeActivity
&& activity.branchingActivity.end) {
// highligh branching edges on hover
- activity.branchingActivity.start.items.hover(HandlerActivityLib.branchingEdgeMouseoverHandler,
- HandlerActivityLib.branchingEdgeMouseoutHandler);
- activity.branchingActivity.end.items.hover(HandlerActivityLib.branchingEdgeMouseoverHandler,
- HandlerActivityLib.branchingEdgeMouseoutHandler);
+ GeneralLib.applyToSet(activity.branchingActivity.start.items, 'hover',
+ [HandlerActivityLib.branchingEdgeMouseoverHandler,
+ HandlerActivityLib.branchingEdgeMouseoutHandler]);
+ GeneralLib.applyToSet(activity.branchingActivity.end.items, 'hover',
+ [HandlerActivityLib.branchingEdgeMouseoverHandler,
+ HandlerActivityLib.branchingEdgeMouseoutHandler]);
}
}
+
},
@@ -718,19 +746,17 @@
activityBox.width,
activityBox.height)
.attr({
+ 'stroke' : layout.colors.activityBorder,
'fill' : shape.attr('fill')
- })
- .toBack();
+ });
+ GeneralLib.toBack(activity.items.groupingEffect);
activity.items.push(activity.items.groupingEffect);
// region annotations could cover grouping effect
$.each(layout.regions, function(){
- this.items.shape.toBack();
+ GeneralLib.toBack(this.items.shape);
});
-
- // this is needed, for some reason, otherwise the activity can not be selected
- HandlerLib.resetCanvasMode(true);
}
},
@@ -745,17 +771,17 @@
if (object instanceof DecorationDefs.Region) {
object.items.shape.attr({
'stroke' : layout.colors.selectEffect,
- 'stroke-dasharray' : '-'
+ 'stroke-dasharray' : '5,3'
});
object.items.selectEffect = true;
if (!isReadOnlyMode) {
- object.items.resizeButton.show();
- object.items.resizeButton.toFront();
+ object.items.resizeButton.attr('display', null);
+ GeneralLib.toFront(object.items.resizeButton);
// also select encapsulated activities
var childActivities = DecorationLib.getChildActivities(object.items.shape);
if (childActivities.length > 0) {
- object.items.fitButton.show();
+ object.items.fitButton.attr('display', null);
$.each(childActivities, function(){
if (!this.parentActivity || !(this.parentActivity instanceof DecorationDefs.Container)) {
@@ -779,15 +805,18 @@
var box = object.items.getBBox();
// a simple rectange a bit wider than the actual activity boundaries
- object.items.selectEffect = paper.rect(
- box.x - layout.conf.selectEffectPadding,
- box.y - layout.conf.selectEffectPadding,
- box.width + 2*layout.conf.selectEffectPadding,
- box.height + 2*layout.conf.selectEffectPadding)
- .attr({
- 'stroke' : layout.colors.selectEffect,
- 'stroke-dasharray' : '-'
- });
+ object.items.selectEffect = paper.path(Snap.format('M {x} {y} h {width} v {height} h -{width} z',
+ {
+ 'x' : box.x - layout.conf.selectEffectPadding,
+ 'y' : box.y - layout.conf.selectEffectPadding,
+ 'width' : box.width + 2*layout.conf.selectEffectPadding,
+ 'height' : box.height + 2*layout.conf.selectEffectPadding
+ }))
+ .attr({
+ 'stroke' : layout.colors.selectEffect,
+ 'stroke-dasharray' : '5,3',
+ 'fill' : 'none'
+ });
object.items.push(object.items.selectEffect);
// if it's "import part" select children activities
@@ -1061,10 +1090,9 @@
},
// find intersection points of the temporary transition
- tempTransition = Raphael.parsePathString(Raphael.format(
- 'M {0} {1} L {2} {3}', points.startX, points.startY, points.endX, points.endY)),
- fromIntersect = Raphael.pathIntersection(tempTransition, fromActivity.items.shape.attr('path')),
- toIntersect = Raphael.pathIntersection(tempTransition, toActivity.items.shape.attr('path'));
+ tempTransitionPath = Snap.format('M {startX} {startY} L {endX} {endY}', points),
+ fromIntersect = Snap.path.intersection(tempTransitionPath, fromActivity.items.shape.attr('path')),
+ toIntersect = Snap.path.intersection(tempTransitionPath, toActivity.items.shape.attr('path'));
// find points on borders of activities, if they exist
if (fromIntersect.length > 0) {
@@ -1100,12 +1128,12 @@
// check if it was added to an Optional or Floating Activity
var container = layout.floatingActivity
- && Raphael.isPointInsideBBox(layout.floatingActivity.items.getBBox(),x,y)
+ && Snap.path.isPointInsideBBox(layout.floatingActivity.items.getBBox(),x,y)
? layout.floatingActivity : null;
if (!container) {
$.each(layout.activities, function(){
if (this instanceof ActivityDefs.OptionalActivity
- && Raphael.isPointInsideBBox(this.items.getBBox(),x,y)) {
+ && Snap.path.isPointInsideBBox(this.items.getBBox(),x,y)) {
container = this;
return false;
}
@@ -1313,11 +1341,11 @@
// different effects for different types of objects
if (object instanceof DecorationDefs.Region) {
object.items.shape.attr({
- 'stroke' : 'black',
- 'stroke-dasharray' : ''
+ 'stroke' : layout.colors.activityBorder,
+ 'stroke-dasharray' : null
});
- object.items.fitButton.hide();
- object.items.resizeButton.hide();
+ object.items.fitButton.attr('display','none');
+ object.items.resizeButton.attr('display','none');
var childActivities = DecorationLib.getChildActivities(object.items.shape);
$.each(childActivities, function(){
@@ -1441,8 +1469,7 @@
transition.items.remove();
GeneralLib.setModified(true);
},
-
-
+
/**
* Reduce length of activity's title so it fits in its SVG shape.
*/
Index: lams_central/web/includes/javascript/authoring/authoringDecoration.js
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/includes/javascript/authoring/authoringDecoration.js,v
diff -u -r1.11 -r1.12
--- lams_central/web/includes/javascript/authoring/authoringDecoration.js 9 Jul 2014 09:37:57 -0000 1.11
+++ lams_central/web/includes/javascript/authoring/authoringDecoration.js 26 Jun 2015 08:33:23 -0000 1.12
@@ -76,36 +76,46 @@
}
// the label
- this.items = paper.set();
+ this.items = Snap.set();
if (this.title) {
- var label = paper.text(x + 7, y + 10, this.title)
+ var label = paper.text(x + 7, y + 14, this.title)
.attr(layout.defaultTextAttributes)
- .attr('text-anchor', 'start')
- .toBack();
+ .attr('text-anchor', 'start');
if (!isReadOnlyMode){
label.attr('cursor', 'pointer');
}
+
+ GeneralLib.toBack(label);
this.items.push(label);
// make sure title fits
x2 = Math.max(x2, label.getBBox().x2 + 5);
}
// the rectangle
- this.items.shape = paper.path('M {0} {1} H {2} V {3} H {0} z', x, y, x2, y2)
- .attr('fill', color)
- .toBack();
+ this.items.shape = paper.path(Snap.format('M {x} {y} H {x2} V {y2} H {x} z',
+ {
+ 'x' : x,
+ 'y' : y,
+ 'x2' : x2,
+ 'y2' : y2
+ }))
+ .attr({
+ 'stroke' : layout.colors.activityBorder,
+ 'fill' : color
+ });
+ GeneralLib.toBack(this.items.shape);
this.items.push(this.items.shape);
if (isReadOnlyMode){
if (activitiesOnlySelectable) {
this.items.shape.attr('cursor', 'pointer');
- this.items.click(HandlerLib.itemClickHandler);
+ GeneralLib.applyToSet(this.items, 'click',[HandlerLib.itemClickHandler]);
}
} else {
this.items.shape.attr('cursor', 'pointer');
- this.items.mousedown(HandlerDecorationLib.containerMousedownHandler)
- .click(HandlerLib.itemClickHandler);
+ GeneralLib.applyToSet(this.items, 'mousedown',[HandlerDecorationLib.containerMousedownHandler]);
+ GeneralLib.applyToSet(this.items, 'click',[HandlerLib.itemClickHandler]);
}
},
@@ -121,7 +131,7 @@
ActivityLib.removeSelectEffect(this);
- var allElements = paper.set();
+ var allElements = Snap.set();
$.each(childActivities, function(){
allElements.push(this.items.shape);
});
@@ -142,28 +152,26 @@
*/
label : {
draw : function(x, y) {
- var x = x ? x : this.items.shape.getBBox().x,
- // the Y coordinate has to be adjusted;
- // it is not perfect and not really cross-browser compliant...
- y = y ? y : this.items.shape.getBBox().y + 6;
+ var x = x ? x : this.items.shape.attr('x'),
+ y = y ? y : this.items.shape.attr('y');
if (this.items) {
this.items.remove();
}
- this.items = paper.set();
+ this.items = Snap.set();
this.items.shape = paper.text(x, y, this.title)
.attr(layout.defaultTextAttributes)
.attr('text-anchor', 'start');
this.items.push(this.items.shape);
this.items.shape.attr('cursor', 'pointer');
- this.items.click(HandlerLib.itemClickHandler);
+ GeneralLib.applyToSet(this.items, 'click',[HandlerLib.itemClickHandler]);
if (!isReadOnlyMode){
this.items.shape.mousedown(HandlerDecorationLib.labelMousedownHandler);
}
- this.items.data('parentObject', this);
+ GeneralLib.applyToSet(this.items, 'data', ['parentObject', this]);
}
},
@@ -180,35 +188,41 @@
if (!isReadOnlyMode){
this.items.fitButton = paper.circle(box.x2 - 10, box.y + 10, 5)
.attr({
- 'stroke' : null,
- 'fill' : 'blue',
- 'cursor' : 'pointer',
- 'title' : LABELS.REGION_FIT_BUTTON_TOOLTIP
+ 'stroke' : null,
+ 'fill' : 'blue',
+ // hide it for now
+ 'display' : 'none',
+ 'cursor' : 'pointer',
+ 'title' : LABELS.REGION_FIT_BUTTON_TOOLTIP
})
.click(function(event){
event.stopImmediatePropagation();
var region = this.data('parentObject');
region.fit();
ActivityLib.addSelectEffect(region, true);
- })
- .hide();
+ });
this.items.push(this.items.fitButton);
- this.items.resizeButton = paper.path(Raphael.format('M {0} {1} v {2} h -{2} z',
- box.x2, box.y2 - 15, 15))
+ this.items.resizeButton = paper.path(Snap.format('M {x} {y} v {side} h -{side} z',
+ {
+ 'x' : box.x2,
+ 'y' : box.y2 - 15,
+ 'side' : 15
+ })
+ )
.attr({
'stroke' : null,
'fill' : 'blue',
+ // hide it for now
+ 'display' : 'none',
'cursor' : 'se-resize'
});
- this.items.resizeButton.mousedown(HandlerDecorationLib.resizeRegionStartHandler)
- .hide();
-
+ this.items.resizeButton.mousedown(HandlerDecorationLib.resizeRegionStartHandler);
this.items.push(this.items.resizeButton);
}
- this.items.data('parentObject', this);
+ GeneralLib.applyToSet(this.items, 'data', ['parentObject', this]);
}
}
}
@@ -254,8 +268,8 @@
var activityBox = this.items.shape.getBBox(),
shapeBox = shape.getBBox();
- if (Raphael.isPointInsideBBox(shapeBox,activityBox.x, activityBox.y)
- && Raphael.isPointInsideBBox(shapeBox, activityBox.x2, activityBox.y2)) {
+ if (Snap.path.isPointInsideBBox(shapeBox,activityBox.x, activityBox.y)
+ && Snap.path.isPointInsideBBox(shapeBox, activityBox.x2, activityBox.y2)) {
result.push(this);
}
}
Index: lams_central/web/includes/javascript/authoring/authoringGeneral.js
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/includes/javascript/authoring/authoringGeneral.js,v
diff -u -r1.66 -r1.67
--- lams_central/web/includes/javascript/authoring/authoringGeneral.js 22 Jun 2015 02:01:29 -0000 1.66
+++ lams_central/web/includes/javascript/authoring/authoringGeneral.js 26 Jun 2015 08:33:23 -0000 1.67
@@ -31,7 +31,7 @@
* A few publicly visible variables .
*/
- // The Raphael Paper object
+ // The Snap Paper object
var paper = null,
// container for the paper
canvas = null,
@@ -65,7 +65,7 @@
'arrangeHorizontalPadding' : 35,
'arrangeVerticalPadding' : 50,
- 'dragStartThreshold' : 100,
+ 'dragStartThreshold' : 300,
'propertiesDialogDimOpacity' : 0.3,
'propertiesDialogDimThreshold' : 100,
@@ -84,14 +84,11 @@
'groupingEffectPadding' : 5,
'selectEffectPadding' : 7,
- 'supportsDownloadAttribute' : typeof $('')[0].download != 'undefined',
-
- // when mouse hovers over rubbish bin
- 'binGlowWidth' : 10,
- 'binGlowOpacity' : 1
+ 'supportsDownloadAttribute' : typeof $('')[0].download != 'undefined'
},
'colors' : {
+ 'activityBorder' : 'black',
// each activity type has its own colour
'activity' : ['','#d0defd','#fffccb','#ece9f7','#fdf1d3','#FFFFFF','#e9f9c0'],
'activityText' : 'black',
@@ -103,7 +100,7 @@
'B0C4DE', 'FFE4E1', 'FF4500', 'EE82EE'],
// when mouse hovers over rubbish bin
- 'binGlow' : 'red',
+ 'binSelect' : 'red',
'branchingEdgeStart' : 'green',
'branchingEdgeEnd' : 'red',
@@ -119,8 +116,9 @@
},
'defaultTextAttributes' : {
- 'font-size' : 10,
- 'font' : 'sans-serif'
+ 'text-anchor' : 'middle',
+ 'font-size' : 10,
+ 'font-family' : 'sans-serif'
}
},
@@ -1058,8 +1056,18 @@
nameValidator : /^[^<>^*@%$]*$/i,
numberValidator : /^[\d\.]+$/,
-
+
/**
+ * Runs the method with parameters on each item of the set.
+ */
+ applyToSet : function(set, method, params) {
+ set.forEach(function(item){
+ item[method].apply(item, params);
+ });
+ },
+
+
+ /**
* Sorts activities on canvas.
*/
arrangeActivities : function(activities){
@@ -1097,7 +1105,7 @@
// for special cases when row needs to shifted more
forceRowY = null,
// check how many columns current paper can hold
- maxColumns = Math.floor((paper.width - layout.conf.arrangeHorizontalPadding)
+ maxColumns = Math.floor((paper.attr('width') - layout.conf.arrangeHorizontalPadding)
/ layout.conf.arrangeHorizontalSpace),
// the initial max length of subsequences is limited by paper space
subsequenceMaxLength = maxColumns,
@@ -1416,7 +1424,8 @@
paper.clear();
} else {
// need to set size right away for Chrome
- paper = Raphael('canvas', canvas.width() - 5, canvas.height() - 5);
+ paper = Snap(canvas.width() - 5, canvas.height() - 5);
+ canvas.append(paper.node);
}
GeneralLib.resizePaper();
@@ -1998,7 +2007,10 @@
width = Math.max(width, canvas.width()) - 20;
height = Math.max(height + (isReadOnlyMode ? 20 : 50), canvas.height()) - 20;
- paper.setSize(width, height);
+ paper.attr({
+ 'width' : width,
+ 'height' : height
+ });
if (!isReadOnlyMode){
if (layout.bin) {
@@ -2679,8 +2691,34 @@
});
},
+ /**
+ * Puts given object (set or shape) to back of parent.
+ */
+ toBack : function(object) {
+ if (object.type == 'set') {
+ object.forEach(function(item) {
+ GeneralLib.toBack(item);
+ });
+ } else {
+ $(object.node).parent().prepend(object.node);
+ }
+ },
/**
+ * Puts given object (set or shape) to front of parent.
+ */
+ toFront : function(object) {
+ if (object.type == 'set') {
+ object.forEach(function(item) {
+ GeneralLib.toFront(item);
+ });
+ } else {
+ $(object.node).parent().append(object.node);
+ }
+ },
+
+
+ /**
* Get real coordinates on paper, based on event coordinates.
*/
translateEventOnCanvas : function(event) {
Index: lams_central/web/includes/javascript/authoring/authoringHandler.js
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/includes/javascript/authoring/authoringHandler.js,v
diff -u -r1.20 -r1.21
--- lams_central/web/includes/javascript/authoring/authoringHandler.js 22 Jun 2015 02:01:29 -0000 1.20
+++ lams_central/web/includes/javascript/authoring/authoringHandler.js 26 Jun 2015 08:33:23 -0000 1.21
@@ -26,6 +26,11 @@
* Start dragging an activity or a transition.
*/
dragItemsStartHandler : function(items, draggedElement, mouseupHandler, event, startX, startY) {
+ if (layout.drawMode || (event.originalEvent ?
+ event.originalEvent.defaultPrevented : event.defaultPrevented)){
+ return;
+ }
+
// if user clicks or drags very shortly, do not take it into account
var dragCancel = function(){
canvas.off('mouseup');
@@ -40,32 +45,32 @@
dragCancel();
canvas.mouseup(dragCancel);
- if (layout.drawMode || (event.originalEvent ?
- event.originalEvent.defaultPrevented : event.defaultPrevented)){
- return;
- }
-
// run only if "click" event was not generated, i.e. user really wants to drag
items.dragStarter = setTimeout(function(){
items.dragStarter = null;
// show that we are in the middle of something
HandlerLib.resetCanvasMode();
items.isDragged = true;
- items.attr('cursor', 'move');
+ GeneralLib.applyToSet(items, 'attr', ['cursor', 'move']);
var parentObject = draggedElement.data('parentObject');
sticky = parentObject && (parentObject instanceof ActivityDefs.ParallelActivity
|| parentObject instanceof ActivityDefs.OptionalActivity
|| parentObject instanceof ActivityDefs.FloatingActivity);
// hide child activities while moving the parent around
+ // they will be redrawn when the parent is dropped
if (sticky) {
$.each(parentObject.childActivities, function(){
- this.items.hide();
+ this.items.forEach(function(item){
+ item.attr('display', 'none');
+ });
if (this.childActivities) {
$.each(this.childActivities, function() {
- this.items.hide();
+ this.items.forEach(function(item){
+ item.attr('display', 'none');
+ });
});
}
});
@@ -78,7 +83,7 @@
var mouseup = function(mouseupEvent){
// finish dragging - restore various elements' default state
items.isDragged = false;
- items.unmouseup();
+ GeneralLib.applyToSet(items, 'unmouseup');
HandlerLib.resetCanvasMode(true);
if (layout.bin.glowEffect) {
layout.bin.glowEffect.remove();
@@ -108,21 +113,27 @@
var dx = event.pageX - startX,
dy = event.pageY - startY;
- items.transform('t' + dx + ' ' + dy);
+ GeneralLib.applyToSet(items, 'transform', ['t' + dx + ' ' + dy]);
if (items.groupingEffect) {
- items.groupingEffect.toBack();
+ GeneralLib.toBack(items.groupingEffect);
}
// highlight rubbish bin if dragged elements are over it
if (HandlerLib.isElemenentBinned(event)) {
if (!layout.bin.glowEffect) {
- layout.bin.glowEffect = layout.bin.glow({
- 'width' : layout.conf.binGlowWidth,
- 'opacity' : layout.conf.binGlowOpacity,
- 'color' : layout.colors.binGlow,
- 'offsety' : 2
- });
+ layout.bin.glowEffect = paper.path(Snap.format('M {x} {y} h {side} v {side} h -{side} z',
+ {
+ 'x' : layout.bin.attr('x'),
+ 'y' : layout.bin.attr('y'),
+ 'side' : layout.bin.attr('width')
+ }))
+ .attr({
+ 'stroke' : layout.colors.binSelect,
+ 'stroke-width' : 2,
+ 'stroke-dasharray' : '5,3',
+ 'fill' : 'none'
+ });
}
} else if (layout.bin.glowEffect){
layout.bin.glowEffect.remove();
@@ -136,8 +147,8 @@
*/
dropObject : function(object) {
// finally transform the dragged elements
- var transformation = object.items.shape.attr('transform');
- object.items.transform('');
+ var transformation = Snap.parseTransformString(object.items.shape.transform().string);
+ GeneralLib.applyToSet(object.items, 'transform', ['']);
var box = object.items.shape.getBBox(),
originalCoordinates = {
@@ -146,7 +157,7 @@
y : box.y + (object instanceof DecorationDefs.Label ? 6 : 0)
};
- if (transformation.length > 0) {
+ if (transformation && transformation.length > 0) {
object.draw(originalCoordinates.x + transformation[0][1],
originalCoordinates.y + transformation[0][2]);
}
@@ -162,7 +173,7 @@
*/
isElemenentBinned : function(event) {
var translatedEvent = GeneralLib.translateEventOnCanvas(event);
- return Raphael.isPointInsideBBox(layout.bin.getBBox(), translatedEvent[0], translatedEvent[1]);
+ return Snap.path.isPointInsideBBox(layout.bin.getBBox(), translatedEvent[0], translatedEvent[1]);
},
@@ -176,7 +187,6 @@
}
var parentObject = this.data('parentObject');
-
// if it's "import part" allow multiple selection of activities
if (activitiesOnlySelectable) {
if (parentObject.items.selectEffect) {
@@ -376,11 +386,14 @@
data.shape.remove();
}
- data.shape = paper.path(Raphael.format('M {0} {1} h {2} v {3} h -{2} z',
- x < data.startX ? x : data.startX,
- y < data.startY ? y : data.startY,
- Math.abs(x - data.startX),
- Math.abs(y - data.startY)))
+ data.shape = paper.path(Snap.format('M {x} {y} h {width} v {height} h -{width} z',
+ {
+ 'x' : x < data.startX ? x : data.startX,
+ 'y' : y < data.startY ? y : data.startY,
+ 'width' : Math.abs(x - data.startX),
+ 'height' : Math.abs(y - data.startY)
+ })
+ )
.attr({
'fill' : layout.colors.annotation,
'opacity' : 0.3
@@ -559,16 +572,24 @@
var translatedEvent = GeneralLib.translateEventOnCanvas(event),
endX = translatedEvent[0],
endY = translatedEvent[1];
-
// draw a temporary transition so user sees what he is doing
- activity.tempTransition = paper.set();
- activity.tempTransition.push(paper.circle(startX, startY, 3));
- activity.tempTransition.push(paper.path(Raphael.format('M {0} {1} L {2} {3}',
- startX, startY, endX, endY))
- .attr({
- 'arrow-end' : 'open-wide-long',
- 'stroke-dasharray' : '- '
- }));
+ activity.tempTransition = Snap.set();
+ activity.tempTransition.push(paper.circle(startX, startY, 3).attr({
+ 'stroke' : layout.colors.transition
+ }));
+ activity.tempTransition.push(paper.path(Snap.format('M {startX} {startY} L {endX} {endY}',
+ {
+ 'startX' : startX,
+ 'startY' : startY,
+ 'endX' : endX,
+ 'endY' : endY
+ }))
+ .attr({
+ 'stroke' : layout.colors.transition,
+ 'stroke-width' : 2,
+ 'stroke-dasharray' : '5,3'
+ })
+ );
},
@@ -587,7 +608,7 @@
}
var endActivity = null,
- targetElement = paper.getElementByPoint(event.pageX, event.pageY);
+ targetElement = Snap.getElementByPoint(event.pageX, event.pageY);
if (targetElement) {
endActivity = targetElement.data('parentObject');
}
Index: lams_central/web/includes/javascript/authoring/authoringMenu.js
===================================================================
RCS file: /usr/local/cvsroot/lams_central/web/includes/javascript/authoring/authoringMenu.js,v
diff -u -r1.36 -r1.37
--- lams_central/web/includes/javascript/authoring/authoringMenu.js 27 May 2015 06:21:24 -0000 1.36
+++ lams_central/web/includes/javascript/authoring/authoringMenu.js 26 Jun 2015 08:33:23 -0000 1.37
@@ -137,13 +137,13 @@
dialog.text('');
dialog.dialog('close');
- var targetElement = paper.getElementByPoint(event.pageX, event.pageY);
+ var targetElement = Snap.getElementByPoint(event.pageX, event.pageY);
- if (targetElement) {
- // cancel
- HandlerLib.resetCanvasMode(true);
- } else {
+ if (targetElement.type == 'svg') {
HandlerDecorationLib.drawRegionStartHandler(event);
+ } else {
+ // cancel if clicked on some existing element, not canvas
+ HandlerLib.resetCanvasMode(true);
}
});
},
@@ -303,7 +303,7 @@
dialog.dialog('close');
var startActivity = null,
- targetElement = paper.getElementByPoint(event.pageX, event.pageY);
+ targetElement = Snap.getElementByPoint(event.pageX, event.pageY);
if (targetElement) {
startActivity = targetElement.data('parentObject');
if (startActivity) {
@@ -450,17 +450,18 @@
// need to set attributes using pure JS as jQuery sets them with lower case, which is unacceptable in SVG
svg.setAttribute('viewBox', crop.x + ' ' + crop.y + ' ' + width + ' ' + height);
svg.setAttribute('preserveAspectRatio', 'xMinYMin slice');
+ svg.setAttribute('xmlns:xlink', 'http://www.w3.org/1999/xlink');
+ svg.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
+
// reset any cursor=pointer styles
$('*[style*="cursor"]', svg).css('cursor', 'default');
imageCode = crop.canvasClone.html();
// otherwise there will be syntax erros in IE11
- imageCode = imageCode.replace(/xmlns=\"http:\/\/www\.w3\.org\/2000\/svg\"/, '');
imageCode = imageCode.replace(/xmlns:NS1=\"\"/, '');
- imageCode = imageCode.replace(/NS1:xmlns:xlink=\"http:\/\/www\.w3\.org\/1999\/xlink\"/, 'xmlns:xlink=\"http:\/\/www\.w3\.org\/1999\/xlink\"');
- imageCode = imageCode.replace(/xmlns:xlink=\"http:\/\/www\.w3\.org\/1999\/xlink\" xlink:href/g, 'xlink:href');
+ imageCode = imageCode.replace(/NS1:xmlns:xlink=\"http:\/\/www\.w3\.org\/1999\/xlink\"/, '');
}
if (download) {
@@ -488,7 +489,7 @@
*/
getCanvasCrop : function(){
var canvasClone = canvas.clone();
- // Raphael does not add this and it's needed by Firefox
+ // Snap does not add this and it's needed by Firefox
$('svg', canvasClone).attr('xmlns:xlink', 'http://www.w3.org/1999/xlink');
// remove the rubbish bin icon
canvasClone.find('#rubbishBin').remove();