From 89e3f477cd1ffddb400d5b7e895314c1e32bc926 Mon Sep 17 00:00:00 2001 From: Dmitry Baranovskiy Date: Wed, 3 Aug 2011 11:17:19 +1000 Subject: [PATCH] Bug fixes & docs update MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit • documentation for Cufon fonts • fixed path2curve error • fixed setSize and setViewBox --- raphael-min.js | 4 +- raphael.core.js | 298 +++++++- raphael.js | 1931 ++++++----------------------------------------- raphael.svg.js | 74 +- raphael.vml.js | 11 +- reference.html | 511 ++++++++++--- 6 files changed, 944 insertions(+), 1885 deletions(-) diff --git a/raphael-min.js b/raphael-min.js index 28c82da..2744e8b 100644 --- a/raphael-min.js +++ b/raphael-min.js @@ -1,8 +1,8 @@ // ┌─────────────────────────────────────────────────────────────────────┐ \\ -// │ "Raphaël 2.0" - JavaScript Vector Library │ \\ +// │ Raphaël 2.0 - JavaScript Vector Library │ \\ // ├─────────────────────────────────────────────────────────────────────┤ \\ // │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ // │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\ // │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\ // └─────────────────────────────────────────────────────────────────────┘ \\ -(function(a){var b="0.3.0",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=Array.prototype.slice.call(arguments,2),e=k.listeners(a),f=0,l=!1,m,n=[],o={},p=[],q=[];h=a,i=0;for(var r=0,s=e.length;rf*b.top){e=b.percents[w],o=b.percents[w-1]||0,q=q/b.top*(e-o),n=b.percents[w+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[w]])}if(!!j){if(!k){for(attr in j)if(j[g](attr))if(V[g](attr)||d.paper.customAttributes[g](attr)){s[attr]=d.attr(attr),s[attr]==null&&(s[attr]=U[attr]),t[attr]=j[attr];switch(V[attr]){case C:u[attr]=(t[attr]-s[attr])/q;break;case"colour":s[attr]=a.getRGB(s[attr]);var y=a.getRGB(t[attr]);u[attr]={r:(y.r-s[attr].r)/q,g:(y.g-s[attr].g)/q,b:(y.b-s[attr].b)/q};break;case"path":var z=bG(s[attr],t[attr]),A=z[1];s[attr]=z[0],u[attr]=[];for(w=0,x=s[attr].length;wd)return d;while(cf?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cd(){return this.x+q+this.y+q+this.width+" × "+this.height}function cc(){return this.x+q+this.y}function bR(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bw(){return this.hex}function bu(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bt(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bt(a,b){for(var c=0,d=a.length;c',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,k.customAttributes={},a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(fb-d)return c-f+b}return c};var bm=a._createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,initWin&&initWin(h.win)};var bn=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write(""),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bn=bu(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bn=bu(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bn(b)},bo=function(){return"hsb("+[this.h,this.s,this.b]+")"},bp=function(){return"hsl("+[this.h,this.s,this.l]+")"},bq=function(){return this.hex},br=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bs=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bq};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},crl.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=bq;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bs(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bs(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=br(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bo}},a.rgb2hsl=function(a,b,c){c=br(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bp}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bv=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bu(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bw};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bw};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bn(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4].split(W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5].split(W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6].split(W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bw},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bw}},a),a.hsb=bu(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bu(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bu(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=bu(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Z,function(a,b,e){var f=[],g=v.call(b);e.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");while(f.length>=c[g]){d.push([b][n](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=bu(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([f][n](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3)*a+A(j,2)*3*i*c+j*3*i*i*e+A(i,3)*g,l=A(j,3)*b+A(j,2)*3*i*d+j*3*i*i*f+A(i,3)*h,m=a+2*i*(c-a)+i*i*(e-2*c+a),n=b+2*i*(d-b)+i*i*(f-2*d+b),o=c+2*i*(e-c)+i*i*(g-2*e+c),p=d+2*i*(f-d)+i*i*(h-2*f+d),q=(1-i)*a+i*c,r=(1-i)*b+i*d,s=(1-i)*e+i*g,t=(1-i)*f+i*h,u=90-w.atan2(m-o,n-p)*180/B;(m>o||n1&&(u=w.sqrt(u),c=u*c,d=u*d);var v=c*c,x=d*d,y=(f==g?-1:1)*w.sqrt(z((v*x-v*t*t-x*s*s)/(v*t*t+x*s*s))),A=y*c*t/d+(a+h)/2,C=y*-d*s/c+(b+i)/2,D=w.asin(((b-C)/d).toFixed(9)),E=w.asin(((i-C)/d).toFixed(9));D=aE&&(D=D-B*2),!g&&E>D&&(E=E-B*2)}else D=j[0],E=j[1],A=j[2],C=j[3];var F=E-D;if(z(F)>k){var G=E,H=h,I=i;E=D+k*(g&&E>D?1:-1),h=A+c*w.cos(E),i=C+d*w.sin(E),m=bD(h,i,c,d,e,0,g,H,I,[E,G,A,C])}F=E-D;var J=w.cos(D),K=w.sin(D),L=w.cos(E),M=w.sin(E),N=w.tan(F/4),O=4/3*c*N,P=4/3*d*N,Q=[a,b],R=[a+O*K,b-P*J],S=[h+O*M,i-P*L],T=[h,i];R[0]=2*Q[0]-R[0],R[1]=2*Q[1]-R[1];if(j)return[R,S,T][n](m);m=[R,S,T][n](m).join().split(",");var U=[];for(var V=0,W=m.length;V"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bG=bu(function(a,b){var c=bA(a),d=b&&bA(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bD[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bC(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"][n](bC(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bB(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bB(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bB(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bB(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1),k=x(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=x(c.length,d&&d.length||0))};for(var j=0,k=x(c.length,d&&d.length||0);j=j)return p;o=p}if(j==null)return k},cg=function(b,c){return function(d,e,f){d=bG(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;oe){if(c&&!l.start){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},ch=cg(1),ci=cg(),cj=cg(0,1);a.getTotalLength=ch,a.getPointAtLength=ci,a.getSubpath=function(a,b,c){if(z(this.getTotalLength(a)-c)<1e-6)return cj(a,b).end;var d=cj(a,c,1);return b?cj(d,b).end:d},b_.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return ch(this.attrs.path)}},b_.getPointAtLength=function(a){if(this.type=="path")return ci(this.attrs.path,a)},b_.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var ck=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};ck.easeIn=ck["ease-in"]=ck["<"],ck.easeOut=ck["ease-out"]=ck[">"],ck.easeInOut=ck["ease-in-out"]=ck["<>"],ck["back-in"]=ck.backIn,ck["back-out"]=ck.backOut;var cl=[],cm=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cn=function(){var b=+(new Date),c=0;for(;c1&&!d.next&&cr(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1),d.next&&!d.stop&&cr(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}a.svg&&m&&m.paper&&m.paper.safari(),cl.length&&cm(cn)},co=function(a){return a>255?255:a<0?0:a};b_.animateWith=function(a,b,c,d,e){this.animate(b,c,d,e);var f,g;for(var h=0,i=cl.length;h.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;b.gradient&&(q.defs.removeChild(b.gradient),delete b.gradient),k=k.replace(/[\(\)\s,\xb0#]/g,"-"),s=p(j+"Gradient",{id:k}),b.gradient=s,p(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),q.defs.appendChild(s);for(var x=0,y=w.length;x1?F.opacity/100:F.opacity});case"stroke":F=a.getRGB(r),k.setAttribute(q,F.hex),q=="stroke"&&F[b]("opacity")&&p(k,{"stroke-opacity":F.opacity>1?F.opacity/100:F.opacity}),q=="stroke"&&d._.arrows&&("startString"in d._.arrows&&v(d,d._.arrows.startString),"endString"in d._.arrows&&v(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(r).charAt()!="r")&&t(d,r);break;case"opacity":n.gradient&&!n[b]("stroke-opacity")&&p(k,{"stroke-opacity":r>1?r/100:r});case"fill-opacity":if(n.gradient){G=a._g.doc.getElementById(k.getAttribute("fill").replace(/^url\(#|\)$/g,l)),G&&(H=G.getElementsByTagName("stop"),p(H[H.length-1],{"stop-opacity":r}));break};default:q=="font-size"&&(r=e(r,10)+"px");var I=q.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});k.style[I]=r,d._.dirty=1,k.setAttribute(q,r)}}y(d,f)},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n"));var Z=W.getBoundingClientRect();x.W=o.w=(Z.right-Z.left)/X,x.H=o.h=(Z.bottom-Z.top)/X,x.paper.canvas.style.display="none",x.X=o.x,x.Y=o.y+x.H/2,("x"in i||"y"in i)&&(x.path.v=a.format("m{0},{1}l{2},{1}",f(o.x*t),f(o.y*t),f(o.x*t)+1));var $=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var _=0,ba=$.length;_.25&&(c=e.sqrt(.25-pow(b-.5,2))*((c>.5)*2-1)+.5),l=b+m+c);return n}),f=f.split(/\s*\-\s*/);if(k=="linear"){var o=f.shift();o=-d(o);if(isNaN(o))return null}var p=a._parseDots(f);if(!p)return null;b=b.shape||b.node;if(p.length){b.removeChild(g),g.on=!0,g.method="none",g.color=p[0].color,g.color2=p[p.length-1].color;var q=[];for(var r=0,s=p.length;r')}}catch(c){A=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}};B(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=t*1e3+m+t*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("clear",this),this.canvas.innerHTML=n,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=removed(b);return!0}}(window.Raphael) \ No newline at end of file +(function(a){var b="0.3.0",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=Array.prototype.slice.call(arguments,2),e=k.listeners(a),f=0,l=!1,m,n=[],o={},p=[],q=[];h=a,i=0;for(var r=0,s=e.length;rf*b.top){e=b.percents[w],o=b.percents[w-1]||0,q=q/b.top*(e-o),n=b.percents[w+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[w]])}if(!!j){if(!k){for(attr in j)if(j[g](attr))if(V[g](attr)||d.paper.customAttributes[g](attr)){s[attr]=d.attr(attr),s[attr]==null&&(s[attr]=U[attr]),t[attr]=j[attr];switch(V[attr]){case C:u[attr]=(t[attr]-s[attr])/q;break;case"colour":s[attr]=a.getRGB(s[attr]);var y=a.getRGB(t[attr]);u[attr]={r:(y.r-s[attr].r)/q,g:(y.g-s[attr].g)/q,b:(y.b-s[attr].b)/q};break;case"path":var z=bG(s[attr],t[attr]),A=z[1];s[attr]=z[0],u[attr]=[];for(w=0,x=s[attr].length;wd)return d;while(cf?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cd(){return this.x+q+this.y+q+this.width+" × "+this.height}function cc(){return this.x+q+this.y}function bR(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bw(){return this.hex}function bu(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("␀"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bt(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bt(a,b){for(var c=0,d=a.length;c',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,k.customAttributes={},a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(fb-d)return c-f+b}return c};var bm=a._createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,initWin&&initWin(h.win)};var bn=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write(""),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bn=bu(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bn=bu(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bn(b)},bo=function(){return"hsb("+[this.h,this.s,this.b]+")"},bp=function(){return"hsl("+[this.h,this.s,this.l]+")"},bq=function(){return this.hex},br=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bs=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:bq};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},crl.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=bq;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bs(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bs(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=br(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bo}},a.rgb2hsl=function(a,b,c){c=br(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bp}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bv=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bu(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bw};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bw};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bn(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4].split(W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5].split(W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6].split(W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bw},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bw}},a),a.hsb=bu(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bu(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bu(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=bu(function(b){if(!b)return null;var c={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace(Z,function(a,b,e){var f=[],g=v.call(b);e.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(d.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");while(f.length>=c[g]){d.push([b][n](f.splice(0,c[g])));if(!c[g])break}}),d.toString=a._path2string;return d}),a.parseTransformString=bu(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=by(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([f][n](e))}),d.toString=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r1&&(u=w.sqrt(u),c=u*c,d=u*d);var v=c*c,x=d*d,y=(f==g?-1:1)*w.sqrt(z((v*x-v*t*t-x*s*s)/(v*t*t+x*s*s))),A=y*c*t/d+(a+h)/2,C=y*-d*s/c+(b+i)/2,D=w.asin(((b-C)/d).toFixed(9)),E=w.asin(((i-C)/d).toFixed(9));D=aE&&(D=D-B*2),!g&&E>D&&(E=E-B*2)}else D=j[0],E=j[1],A=j[2],C=j[3];var F=E-D;if(z(F)>k){var G=E,H=h,I=i;E=D+k*(g&&E>D?1:-1),h=A+c*w.cos(E),i=C+d*w.sin(E),m=bD(h,i,c,d,e,0,g,H,I,[E,G,A,C])}F=E-D;var J=w.cos(D),K=w.sin(D),L=w.cos(E),M=w.sin(E),N=w.tan(F/4),O=4/3*c*N,P=4/3*d*N,Q=[a,b],R=[a+O*K,b-P*J],S=[h+O*M,i-P*L],T=[h,i];R[0]=2*Q[0]-R[0],R[1]=2*Q[1]-R[1];if(j)return[R,S,T][n](m);m=[R,S,T][n](m).join().split(",");var U=[];for(var V=0,W=m.length;V"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bE(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bE(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bG=a._path2curve=bu(function(a,b){var c=bA(a),d=b&&bA(b),e={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bD[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bC(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"][n](bC(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bB(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bB(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bB(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bB(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b].length>7){a[b].shift();var e=a[b];while(e.length)a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1),k=x(c.length,d&&d.length||0)}},i=function(a,b,e,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),e.bx=0,e.by=0,e.x=a[g][1],e.y=a[g][2],k=x(c.length,d&&d.length||0))};for(var j=0,k=x(c.length,d&&d.length||0);j=j)return p;o=p}if(j==null)return k},cg=function(b,c){return function(d,e,f){d=bG(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;oe){if(c&&!l.start){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cf(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[1],i[2],i[3],i[4],i[5],i[6],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},ch=cg(1),ci=cg(),cj=cg(0,1);a.getTotalLength=ch,a.getPointAtLength=ci,a.getSubpath=function(a,b,c){if(z(this.getTotalLength(a)-c)<1e-6)return cj(a,b).end;var d=cj(a,c,1);return b?cj(d,b).end:d},b_.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return ch(this.attrs.path)}},b_.getPointAtLength=function(a){if(this.type=="path")return ci(this.attrs.path,a)},b_.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var ck=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};ck.easeIn=ck["ease-in"]=ck["<"],ck.easeOut=ck["ease-out"]=ck[">"],ck.easeInOut=ck["ease-in-out"]=ck["<>"],ck["back-in"]=ck.backIn,ck["back-out"]=ck.backOut;var cl=[],cm=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cn=function(){var b=+(new Date),c=0;for(;c1&&!d.next&&cr(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1),d.next&&!d.stop&&cr(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}a.svg&&m&&m.paper&&m.paper.safari(),cl.length&&cm(cn)},co=function(a){return a>255?255:a<0?0:a};b_.animateWith=function(a,b,c,d,e){this.animate(b,c,d,e);var f,g;for(var h=0,i=cl.length;h.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;b.gradient&&(p.defs.removeChild(b.gradient),delete b.gradient),k=k.replace(/[\(\)\s,\xb0#]/g,"-"),s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x1?E.opacity/100:E.opacity});case"stroke":E=a.getRGB(p),i.setAttribute(o,E.hex),o=="stroke"&&E[b]("opacity")&&q(i,{"stroke-opacity":E.opacity>1?E.opacity/100:E.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&w(d,d._.arrows.startString),"endString"in d._.arrows&&w(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&u(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){F=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),F&&(G=F.getElementsByTagName("stop"),q(G[G.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var H=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[H]=p,d._.dirty=1,i.setAttribute(o,p)}}B(d,f),i.style.visibility=m,console.log("new")},A=1.2,B=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n"));var Z=W.getBoundingClientRect();x.W=o.w=(Z.right-Z.left)/X,x.H=o.h=(Z.bottom-Z.top)/X,x.X=o.x,x.Y=o.y+x.H/2,("x"in i||"y"in i)&&(x.path.v=a.format("m{0},{1}l{2},{1}",f(o.x*t),f(o.y*t),f(o.x*t)+1));var $=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var _=0,ba=$.length;_.25&&(c=e.sqrt(.25-pow(b-.5,2))*((c>.5)*2-1)+.5),l=b+m+c);return n}),f=f.split(/\s*\-\s*/);if(k=="linear"){var o=f.shift();o=-d(o);if(isNaN(o))return null}var p=a._parseDots(f);if(!p)return null;b=b.shape||b.node;if(p.length){b.removeChild(g),g.on=!0,g.method="none",g.color=p[0].color,g.color2=p[p.length-1].color;var q=[];for(var r=0,s=p.length;r')}}catch(c){A=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}};B(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=t*1e3+m+t*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("clear",this),this.canvas.innerHTML=n,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=removed(b);return!0}}(window.Raphael) \ No newline at end of file diff --git a/raphael.core.js b/raphael.core.js index 6de994d..5641c07 100644 --- a/raphael.core.js +++ b/raphael.core.js @@ -109,7 +109,7 @@ S = " ", Str = String, split = "split", - events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend".split(S), + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel".split(S), touchMap = { mousedown: "touchstart", mousemove: "touchmove", @@ -1109,16 +1109,20 @@ \*/ R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { var t1 = 1 - t, - x = pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, - y = pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y, - mx = p1x + 2 * t * (c1x - p1x) + t * t * (c2x - 2 * c1x + p1x), - my = p1y + 2 * t * (c1y - p1y) + t * t * (c2y - 2 * c1y + p1y), - nx = c1x + 2 * t * (c2x - c1x) + t * t * (p2x - 2 * c2x + c1x), - ny = c1y + 2 * t * (c2y - c1y) + t * t * (p2y - 2 * c2y + c1y), - ax = (1 - t) * p1x + t * c1x, - ay = (1 - t) * p1y + t * c1y, - cx = (1 - t) * c2x + t * p2x, - cy = (1 - t) * c2y + t * p2y, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); (mx > nx || my < ny) && (alpha += 180); return { @@ -1491,7 +1495,7 @@ max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} }; }), - path2curve = cacher(function (path, path2) { + path2curve = R._path2curve = cacher(function (path, path2) { var p = pathToAbsolute(path), p2 = path2 && pathToAbsolute(path2), attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, @@ -2248,6 +2252,214 @@ | paper.circle(100, 100, 20).red(); \*/ elproto = R.el = {}; + /*\ + * Element.click + [ method ] + ** + * Adds event handler for click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unclick + [ method ] + ** + * Removes event handler for click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.dblclick + [ method ] + ** + * Adds event handler for double click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.undblclick + [ method ] + ** + * Removes event handler for double click for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousedown + [ method ] + ** + * Adds event handler for mousedown for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousedown + [ method ] + ** + * Removes event handler for mousedown for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mousemove + [ method ] + ** + * Adds event handler for mousemove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmousemove + [ method ] + ** + * Removes event handler for mousemove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseout + [ method ] + ** + * Adds event handler for mouseout for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseout + [ method ] + ** + * Removes event handler for mouseout for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseover + [ method ] + ** + * Adds event handler for mouseover for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseover + [ method ] + ** + * Removes event handler for mouseover for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.mouseup + [ method ] + ** + * Adds event handler for mouseup for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.unmouseup + [ method ] + ** + * Removes event handler for mouseup for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchstart + [ method ] + ** + * Adds event handler for touchstart for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchstart + [ method ] + ** + * Removes event handler for touchstart for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchmove + [ method ] + ** + * Adds event handler for touchmove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchmove + [ method ] + ** + * Removes event handler for touchmove for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchend + [ method ] + ** + * Adds event handler for touchend for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchend + [ method ] + ** + * Removes event handler for touchend for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + + /*\ + * Element.touchcancel + [ method ] + ** + * Adds event handler for touchcancel for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ + /*\ + * Element.untouchcancel + [ method ] + ** + * Removes event handler for touchcancel for the element. + > Parameters + - handler (function) handler for the event + = (object) @Element + \*/ for (var i = events.length; i--;) { (function (eventName) { R[eventName] = elproto[eventName] = function (fn, scope) { @@ -2638,7 +2850,9 @@ | ); | st.attr({fill: "red"}); \*/ - paperproto.setSize = R._engine.setSize; + paperproto.setSize = function (width, height) { + return R._engine.setSize.call(this, width, height); + }; /*\ * Paper.setViewBox [ method ] @@ -2648,14 +2862,15 @@ ** > Parameters ** - x, y, w, h, fit - x (number) new x position, default is `0` - y (number) new y position, default is `0` - w (number) new width of the canvas - h (number) new height of the canvas - fit (boolean) `true` if you want graphics to fit into new boundary box \*/ - paperproto.setViewBox = R._engine.setViewBox; + paperproto.setViewBox = function (x, y, w, h, fit) { + return R._engine.setViewBox.call(this, x, y, w, h, fit); + }; /*\ * Paper.top [ property ] @@ -3971,6 +4186,21 @@ return "Rapha\xebl\u2018s set"; }; + /*\ + * Raphael.registerFont + [ method ] + ** + * Adds given font to the registered set of fonts for Raphaël. Should be used as an internal call from within Cufón’s font file. + * Returns original parameter, so it could be used with chaining. + # More about Cufón and how to convert your font form TTF, OTF, etc to JavaScript file. + ** + > Parameters + ** + - font (object) the font to register + = (object) the font you passed in + > Usage + | Cufon.registerFont(Raphael.registerFont({…})); + \*/ R.registerFont = function (font) { if (!font.face) { return font; @@ -4010,6 +4240,22 @@ } return font; }; + /*\ + * Paper.getFont + [ method ] + ** + * Finds font object in the registered fonts by given parameters. You could specify only one word from the font name, like “Myriad” for “Myriad Pro”. + ** + > Parameters + ** + - family (string) font family name or any word from it + - weight (string) #optional font weight + - style (string) #optional font style + - stretch (string) #optional font stretch + = (object) the font object + > Usage + | paper.print(100, 100, "Test string", paper.getFont("Times", 800), 30); + \*/ paperproto.getFont = function (family, weight, style, stretch) { stretch = stretch || "normal"; style = style || "normal"; @@ -4038,6 +4284,28 @@ } return thefont; }; + /*\ + * Paper.print + [ method ] + ** + * Creates set of shapes to represent given font at given position with given size. + * Result of the method is set object (see @Paper.set) which contains each letter as separate path object. + ** + > Parameters + ** + - x (number) x position of the text + - y (number) y position of the text + - text (string) text to print + - font (object) font object, see @Paper.getFont + - size (number) #optional size of the font, default is `16` + - origin (string) #optional could be `"baseline"` or `"middle"`, default is `"middle"` + - letter_spacing (number) #optional number in range `-1..1`, default is `0` + = (object) resulting set of letters + > Usage + | var txt = r.print(10, 50, "print", r.getFont("Museo"), 30).attr({fill: "#fff"}); + | // following line will paint first letter in red + | txt[0].attr({fill: "#f00"}); + \*/ paperproto.print = function (x, y, string, font, size, origin, letter_spacing) { origin = origin || "middle"; // baseline|middle letter_spacing = mmax(mmin(letter_spacing || 0, 1), -1); diff --git a/raphael.js b/raphael.js index d29b815..3f978fb 100644 --- a/raphael.js +++ b/raphael.js @@ -1,5 +1,5 @@ // ┌─────────────────────────────────────────────────────────────────────┐ \\ -// │ "Raphaël 2.0" - JavaScript Vector Library │ \\ +// │ Raphaël 2.0 - JavaScript Vector Library │ \\ // ├─────────────────────────────────────────────────────────────────────┤ \\ // │ Copyright (c) 2008-2011 Dmitry Baranovskiy (http://raphaeljs.com) │ \\ // │ Copyright (c) 2008-2011 Sencha Labs (http://sencha.com) │ \\ @@ -25,20 +25,7 @@ current_event, stop, events = {n: {}}, - /*\ - * eve - [ method ] - ** - * Fires event with given `name`, given scope and other parameters. - ** - > Arguments - ** - - name (string) name of the event, dot (`.`) or slash (`/`) separated - - scope (object) context for the event handlers - - varargs (...) the rest of arguments will be sent to event handlers - ** - = (object) array of returned values from the listeners - \*/ + eve = function (name, scope) { var e = events, args = Array.prototype.slice.call(arguments, 2), @@ -94,18 +81,7 @@ } return out.length ? out : null; }; - /*\ - * eve.listeners - [ method ] - ** - * Internal method which gives you array of all event handlers that will be triggered by the given `name`. - ** - > Arguments - ** - - name (string) name of the event, dot (`.`) or slash (`/`) separated - ** - = (array) array of event handlers - \*/ + eve.listeners = function (name) { var names = name.split(separator), e = events, @@ -138,29 +114,7 @@ return out; }; - /*\ - * eve.on - [ method ] - ** - * Binds given event handler with a given name. You can use wildcards “`*`” for the names: - | eve.on("*.under.*", f); - | eve("mouse.under.floor"); // triggers f - * Use @eve to trigger the listener. - ** - > Arguments - ** - - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards - - f (function) event handler function - ** - = (function) returned function accept one number parameter that represents z-index of the handler. It is optional feature and only used when you need to ensure that some subset of handlers will be invoked in a given order, despite of the order of assignment. - > Example: - | eve.on("mouse", eat)(2); - | eve.on("mouse", scream); - | eve.on("mouse", catch)(1); - * This will ensure that `catch` function will be called before `eat`. - * If you want to put you hadler before not indexed handlers specify negative value. - * Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”. - \*/ + eve.on = function (name, f) { var names = name.split(separator), e = events; @@ -180,46 +134,18 @@ } }; }; - /*\ - * eve.stop - [ method ] - ** - * Is used inside event handler to stop event - \*/ + eve.stop = function () { stop = 1; }; - /*\ - * eve.nt - [ method ] - ** - * Could be used inside event handler to figure out actual name of the event. - ** - > Arguments - ** - - subname (string) #optional subname of the event - ** - = (string) name of the event, if `subname` is not specified - * or - = (boolean) `true`, if current event’s name contains `subname` - \*/ + eve.nt = function (subname) { if (subname) { return new RegExp("(?:\\.|\\/|^)" + subname + "(?:\\.|\\/|$)").test(current_event); } return current_event; }; - /*\ - * eve.unbind - [ method ] - ** - * Removes given function from the list of event listeners assigned to given name. - ** - > Arguments - ** - - name (string) name of the event, dot (`.`) or slash (`/`) separated, with optional wildcards - - f (function) event handler function - \*/ + eve.unbind = function (name, f) { var names = name.split(separator), e, @@ -271,12 +197,7 @@ } } }; - /*\ - * eve.version - [ property (string) ] - ** - * Current version of the library. - \*/ + eve.version = version; eve.toString = function () { return "You are running Eve " + version; @@ -292,56 +213,7 @@ // │ Licensed under the MIT (http://raphaeljs.com/license.html) license. │ \\ // └─────────────────────────────────────────────────────────────────────┘ \\ (function () { - /*\ - * Raphael - [ method ] - ** - * Creates a canvas object on which to draw. - * You must do this first, as all future calls to drawing methods - * from this instance will be bound to this canvas. - > Parameters - ** - - container (HTMLElement|string) DOM element or its ID which is going to be a parent for drawing surface - - width (number) - - height (number) - - callback (function) #optional callback function which is going to be executed in the context of newly created paper - * or - - x (number) - - y (number) - - width (number) - - height (number) - - callback (function) #optional callback function which is going to be executed in the context of newly created paper - * or - - all (array) (first 3 or 4 elements in the array are equal to [containerID, width, height] or [x, y, width, height]. The rest are element descriptions in format {type: type, }) - - callback (function) #optional callback function which is going to be executed in the context of newly created paper - * or - - onReadyCallback (function) function that is going to be called on DOM ready event. You can also subscribe to this event via Eve’s “DOMLoad” event. In this case method returns `undefined`. - = (object) @Paper - > Usage - | // Each of the following examples create a canvas - | // that is 320px wide by 200px high. - | // Canvas is created at the viewport’s 10,50 coordinate. - | var paper = Raphael(10, 50, 320, 200); - | // Canvas is created at the top left corner of the #notepad element - | // (or its top right corner in dir="rtl" elements) - | var paper = Raphael(document.getElementById("notepad"), 320, 200); - | // Same as above - | var paper = Raphael("notepad", 320, 200); - | // Image dump - | var set = Raphael(["notepad", 320, 200, { - | type: "rect", - | x: 10, - | y: 10, - | width: 25, - | height: 25, - | stroke: "#f00" - | }, { - | type: "text", - | x: 30, - | y: 40, - | text: "Dump" - | }]); - \*/ + function R(first) { if (R.is(first, "function")) { return loaded ? first() : eve.on("DOMload", first); @@ -395,7 +267,7 @@ S = " ", Str = String, split = "split", - events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend".split(S), + events = "click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel".split(S), touchMap = { mousedown: "touchstart", mousemove: "touchmove", @@ -561,12 +433,7 @@ }; R._g = g; - /*\ - * Raphael.type - [ property (string) ] - ** - * Can be “SVG”, “VML” or empty, depending on browser support. - \*/ + R.type = (g.win.SVGAngle || g.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") ? "SVG" : "VML"); if (R.type == "VML") { var d = g.doc.createElement("div"), @@ -579,85 +446,17 @@ } d = null; } - /*\ - * Raphael.svg - [ property (boolean) ] - ** - * `true` if browser supports SVG. - \*/ - /*\ - * Raphael.vml - [ property (boolean) ] - ** - * `true` if browser supports VML. - \*/ + + R.svg = !(R.vml = R.type == "VML"); R._Paper = Paper; - /*\ - * Raphael.fn - [ property (object) ] - ** - * You can add your own method to the canvas. For example if you want to draw a pie chart, - * you can create your own pie chart function and ship it as a Raphaël plugin. To do this - * you need to extend the `Raphael.fn` object. Please note that you can create your own namespaces - * inside the `fn` object — methods will be run in the context of canvas anyway. You should alter - * the `fn` object before a Raphaël instance is created, otherwise it will take no effect. - > Usage - | Raphael.fn.arrow = function (x1, y1, x2, y2, size) { - | return this.path( ... ); - | }; - | // or create namespace - | Raphael.fn.mystuff = { - | arrow: function () {…}, - | star: function () {…}, - | // etc… - | }; - | var paper = Raphael(10, 10, 630, 480); - | // then use it - | paper.arrow(10, 10, 30, 30, 5).attr({fill: "#f00"}); - | paper.mystuff.arrow(); - | paper.mystuff.star(); - \*/ + R.fn = paperproto = Paper.prototype = R.prototype; - /*\ - * Paper.customAttributes - [ property (object) ] - ** - * If you have a set of attributes that you would like to represent - * as a function of some number you can do it easily with custom attributes: - > Usage - | paper.customAttributes.hue = function (num) { - | num = num % 1; - | return {fill: "hsb(" + num + ", .75, 1)"}; - | }; - | // Custom attribute “hue” will change fill - | // to be given hue with fixed saturation and brightness. - | // Now you can use it like this: - | var c = paper.circle(10, 10, 10).attr({hue: .45}); - | // or even like this: - | c.animate({hue: 1}, 1e3); - | - | // You could also create custom attribute - | // with multiple parameters: - | paper.customAttributes.hsb = function (h, s, b) { - | return {fill: "hsb(" + [h, s, b].join(",") + ")"}; - | }; - | c.attr({hsb: ".5 .8 1"}); - | c.animate({hsb: "1 0 .5"}, 1e3); - \*/ + paperproto.customAttributes = {}; R._id = 0; R._oid = 0; - /*\ - * Raphael.is - [ method ] - ** - * Handfull replacement for `typeof` operator. - > Parameters - - o (…) any object or primitive - - type (string) name of the type, i.e. “string”, “function”, “number”, etc. - = (boolean) is given value is of given type - \*/ + R.is = function (o, type) { type = lowerCase.call(type); if (type == "finite") { @@ -672,20 +471,7 @@ (type == "array" && Array.isArray && Array.isArray(o)) || objectToString.call(o).slice(8, -1).toLowerCase() == type; }; - /*\ - * Raphael.angle - [ method ] - ** - * Returns angle between two or three points - > Parameters - - x1 (number) x coord of first point - - y1 (number) y coord of first point - - x2 (number) x coord of second point - - y2 (number) y coord of second point - - x3 (number) #optional x coord of third point - - y3 (number) #optional y coord of third point - = (number) angle in degrees. - \*/ + R.angle = function (x1, y1, x2, y2, x3, y3) { if (x3 == null) { var x = x1 - x2, @@ -698,41 +484,15 @@ return R.angle(x1, y1, x3, y3) - R.angle(x2, y2, x3, y3); } }; - /*\ - * Raphael.rad - [ method ] - ** - * Transform angle to radians - > Parameters - - deg (number) angle in degrees - = (number) angle in radians. - \*/ + R.rad = function (deg) { return deg % 360 * PI / 180; }; - /*\ - * Raphael.deg - [ method ] - ** - * Transform angle to degrees - > Parameters - - deg (number) angle in radians - = (number) angle in degrees. - \*/ + R.deg = function (rad) { return rad * 180 / PI % 360; }; - /*\ - * Raphael.snapTo - [ method ] - ** - * Snaps given value to given grid. - > Parameters - - values (array|number) given array of values or step of the grid - - value (number) value to adjust - - tolerance (number) #optional tolerance for snapping. Default is `10`. - = (number) adjusted value. - \*/ + R.snapTo = function (values, value, tolerance) { tolerance = R.is(tolerance, "finite") ? tolerance : 10; if (R.is(values, array)) { @@ -763,14 +523,7 @@ return v.toString(16); }); - /*\ - * Raphael.setWindow - [ method ] - ** - * Used when you need to draw in `<iframe>`. Switched window to the iframe one. - > Parameters - - newwin (window) new window object - \*/ + R.setWindow = function (newwin) { eve("setWindow", R, g.win, newwin); g.win = newwin; @@ -860,26 +613,7 @@ return rgb; }; - /*\ - * Raphael.color - [ method ] - ** - * Parses the color string and returns object with all values for the given color. - > Parameters - - clr (string) color string in one of the supported formats (see @Raphael.getRGB) - = (object) Combined RGB & HSB object in format: - o { - o r (number) red, - o g (number) green, - o b (number) blue, - o hex (string) color in HTML/CSS format: #••••••, - o error (boolean) `true` if string can’t be parsed, - o h (number) hue, - o s (number) saturation, - o v (number) value (brightness), - o l (number) lightness - o } - \*/ + R.color = function (clr) { var rgb; if (R.is(clr, "object") && "h" in clr && "s" in clr && "b" in clr) { @@ -913,23 +647,7 @@ clr.toString = rgbtoString; return clr; }; - /*\ - * Raphael.hsb2rgb - [ method ] - ** - * Converts HSB values to RGB object. - > Parameters - - h (number) hue - - s (number) saturation - - v (number) value or brightness - = (object) RGB object in format: - o { - o r (number) red, - o g (number) green, - o b (number) blue, - o hex (string) color in HTML/CSS format: #•••••• - o } - \*/ + R.hsb2rgb = function (h, s, v, o) { if (this.is(h, "object") && "h" in h && "s" in h && "b" in h) { v = h.b; @@ -950,23 +668,7 @@ B += [0, 0, X, C, C, X][h]; return packageRGB(R, G, B, o); }; - /*\ - * Raphael.hsl2rgb - [ method ] - ** - * Converts HSL values to RGB object. - > Parameters - - h (number) hue - - s (number) saturation - - l (number) luminosity - = (object) RGB object in format: - o { - o r (number) red, - o g (number) green, - o b (number) blue, - o hex (string) color in HTML/CSS format: #•••••• - o } - \*/ + R.hsl2rgb = function (h, s, l, o) { if (this.is(h, "object") && "h" in h && "s" in h && "l" in h) { l = h.l; @@ -991,22 +693,7 @@ B += [0, 0, X, C, C, X][h]; return packageRGB(R, G, B, o); }; - /*\ - * Raphael.rgb2hsb - [ method ] - ** - * Converts RGB values to HSB object. - > Parameters - - r (number) red - - g (number) green - - b (number) blue - = (object) HSB object in format: - o { - o h (number) hue - o s (number) saturation - o b (number) brightness - o } - \*/ + R.rgb2hsb = function (r, g, b) { b = prepareRGB(r, g, b); r = b[0]; @@ -1025,22 +712,7 @@ S = C == 0 ? 0 : C / V; return {h: H, s: S, b: V, toString: hsbtoString}; }; - /*\ - * Raphael.rgb2hsl - [ method ] - ** - * Converts RGB values to HSL object. - > Parameters - - r (number) red - - g (number) green - - b (number) blue - = (object) HSL object in format: - o { - o h (number) hue - o s (number) saturation - o l (number) luminosity - o } - \*/ + R.rgb2hsl = function (r, g, b) { b = prepareRGB(r, g, b); r = b[0]; @@ -1107,33 +779,7 @@ return this.hex; } - /*\ - * Raphael.getRGB - [ method ] - ** - * Parses colour string as RGB object - > Parameters - - colour (string) colour string in one of formats: - #
    - #
  • Colour name (“red”, “green”, “cornflowerblue”, etc)
  • - #
  • #••• — shortened HTML colour: (“#000”, “#fc0”, etc)
  • - #
  • #•••••• — full length HTML colour: (“#000000”, “#bd2300”)
  • - #
  • rgb(•••, •••, •••) — red, green and blue channels’ values: (“rgb(200, 100, 0)”)
  • - #
  • rgb(•••%, •••%, •••%) — same as above, but in %: (“rgb(100%, 175%, 0%)”)
  • - #
  • hsb(•••, •••, •••) — hue, saturation and brightness values: (“hsb(0.5, 0.25, 1)”)
  • - #
  • hsb(•••%, •••%, •••%) — same as above, but in %
  • - #
  • hsl(•••, •••, •••) — same as hsb
  • - #
  • hsl(•••%, •••%, •••%) — same as hsb
  • - #
- = (object) RGB object in format: - o { - o r (number) red, - o g (number) green, - o b (number) blue - o hex (string) color in HTML/CSS format: #••••••, - o error (boolean) true if string can’t be parsed - o } - \*/ + R.getRGB = cacher(function (colour) { if (!colour || !!((colour = Str(colour)).indexOf("-") + 1)) { return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; @@ -1205,57 +851,19 @@ } return {r: -1, g: -1, b: -1, hex: "none", error: 1, toString: clrToString}; }, R); - /*\ - * Raphael.hsb - [ method ] - ** - * Converts HSB values to hex representation of the colour. - > Parameters - - h (number) hue - - s (number) saturation - - b (number) value or brightness - = (string) hex representation of the colour. - \*/ + R.hsb = cacher(function (h, s, b) { return R.hsb2rgb(h, s, b).hex; }); - /*\ - * Raphael.hsl - [ method ] - ** - * Converts HSL values to hex representation of the colour. - > Parameters - - h (number) hue - - s (number) saturation - - l (number) luminosity - = (string) hex representation of the colour. - \*/ + R.hsl = cacher(function (h, s, l) { return R.hsl2rgb(h, s, l).hex; }); - /*\ - * Raphael.rgb - [ method ] - ** - * Converts RGB values to hex representation of the colour. - > Parameters - - r (number) red - - g (number) green - - b (number) blue - = (string) hex representation of the colour. - \*/ + R.rgb = cacher(function (r, g, b) { return "#" + (16777216 | b | (g << 8) | (r << 16)).toString(16).slice(1); }); - /*\ - * Raphael.getColor - [ method ] - ** - * On each call returns next colour in the spectrum. To reset it back to red call @Raphael.getColor.reset - > Parameters - - value (number) #optional brightness, default is `0.75` - = (string) hex representation of the colour. - \*/ + R.getColor = function (value) { var start = this.getColor.start = this.getColor.start || {h: 0, s: 1, b: value || .75}, rgb = this.hsb2rgb(start.h, start.s, start.b); @@ -1267,27 +875,12 @@ } return rgb.hex; }; - /*\ - * Raphael.getColor.reset - [ method ] - ** - * Resets spectrum position for @Raphael.getColor back to red. - \*/ + R.getColor.reset = function () { delete this.start; }; - /*\ - * Raphael.parsePathString - [ method ] - ** - * Utility method - ** - * Parses given path string into an array of arrays of path segments. - > Parameters - - pathString (string|array) path string or array of segments (in the last case it will be returned straight away) - = (array) array of segments. - \*/ + R.parsePathString = cacher(function (pathString) { if (!pathString) { return null; @@ -1320,17 +913,7 @@ data.toString = R._path2string; return data; }); - /*\ - * Raphael.parseTransformString - [ method ] - ** - * Utility method - ** - * Parses given path string into an array of transformations. - > Parameters - - TString (string|array) transform string or array of transformations (in the last case it will be returned straight away) - = (array) array of transformations. - \*/ + R.parseTransformString = cacher(function (TString) { if (!TString) { return null; @@ -1353,58 +936,23 @@ data.toString = R._path2string; return data; }); - /*\ - * Raphael.findDotsAtSegment - [ method ] - ** - * Utility method - ** - * Find dot coordinates on the given cubic bezier curve at the given t. - > Parameters - - p1x (number) x of the first point of the curve - - p1y (number) y of the first point of the curve - - c1x (number) x of the first anchor of the curve - - c1y (number) y of the first anchor of the curve - - c2x (number) x of the second anchor of the curve - - c2y (number) y of the second anchor of the curve - - p2x (number) x of the second point of the curve - - p2y (number) y of the second point of the curve - - t (number) position on the curve (0..1) - = (object) point information in format: - o { - o x: (number) x coordinate of the point - o y: (number) y coordinate of the point - o m: { - o x: (number) x coordinate of the left anchor - o y: (number) y coordinate of the left anchor - o } - o n: { - o x: (number) x coordinate of the right anchor - o y: (number) y coordinate of the right anchor - o } - o start: { - o x: (number) x coordinate of the start of the curve - o y: (number) y coordinate of the start of the curve - o } - o end: { - o x: (number) x coordinate of the end of the curve - o y: (number) y coordinate of the end of the curve - o } - o alpha: (number) angle of the curve derivative at the point - o } - \*/ + R.findDotsAtSegment = function (p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t) { var t1 = 1 - t, - x = pow(t1, 3) * p1x + pow(t1, 2) * 3 * t * c1x + t1 * 3 * t * t * c2x + pow(t, 3) * p2x, - y = pow(t1, 3) * p1y + pow(t1, 2) * 3 * t * c1y + t1 * 3 * t * t * c2y + pow(t, 3) * p2y, - mx = p1x + 2 * t * (c1x - p1x) + t * t * (c2x - 2 * c1x + p1x), - my = p1y + 2 * t * (c1y - p1y) + t * t * (c2y - 2 * c1y + p1y), - nx = c1x + 2 * t * (c2x - c1x) + t * t * (p2x - 2 * c2x + c1x), - ny = c1y + 2 * t * (c2y - c1y) + t * t * (p2y - 2 * c2y + c1y), - ax = (1 - t) * p1x + t * c1x, - ay = (1 - t) * p1y + t * c1y, - cx = (1 - t) * c2x + t * p2x, - cy = (1 - t) * c2y + t * p2y, + t13 = pow(t1, 3), + t12 = pow(t1, 2), + t2 = t * t, + t3 = t2 * t, + x = t13 * p1x + t12 * 3 * t * c1x + t1 * 3 * t * t * c2x + t3 * p2x, + y = t13 * p1y + t12 * 3 * t * c1y + t1 * 3 * t * t * c2y + t3 * p2y, + mx = p1x + 2 * t * (c1x - p1x) + t2 * (c2x - 2 * c1x + p1x), + my = p1y + 2 * t * (c1y - p1y) + t2 * (c2y - 2 * c1y + p1y), + nx = c1x + 2 * t * (c2x - c1x) + t2 * (p2x - 2 * c2x + c1x), + ny = c1y + 2 * t * (c2y - c1y) + t2 * (p2y - 2 * c2y + c1y), + ax = t1 * p1x + t * c1x, + ay = t1 * p1y + t * c1y, + cx = t1 * c2x + t * p2x, + cy = t1 * c2y + t * p2y, alpha = (90 - math.atan2(mx - nx, my - ny) * 180 / PI); (mx > nx || my < ny) && (alpha += 180); return { @@ -1777,7 +1325,7 @@ max: {x: mmax[apply](0, x), y: mmax[apply](0, y)} }; }), - path2curve = cacher(function (path, path2) { + path2curve = R._path2curve = cacher(function (path, path2) { var p = pathToAbsolute(path), p2 = path2 && pathToAbsolute(path2), attrs = {x: 0, y: 0, bx: 0, by: 0, X: 0, Y: 0, qx: null, qy: null}, @@ -2095,47 +1643,12 @@ height: h }; }; - /*\ - * Raphael.pathToRelative - [ method ] - ** - * Utility method - ** - * Converts path to relative form - > Parameters - - pathString (string|array) path string or array of segments - = (array) array of segments. - \*/ + R.pathToRelative = pathToRelative; R._engine = {}; - /*\ - * Raphael.path2curve - [ method ] - ** - * Utility method - ** - * Converts path to a new path where all segments are cubic bezier curves. - > Parameters - - pathString (string|array) path string or array of segments - = (array) array of segments. - \*/ + R.path2curve = path2curve; - /*\ - * Raphael.matrix - [ method ] - ** - * Utility method - ** - * Returns matrix based on given parameters. - > Parameters - - a (number) - - b (number) - - c (number) - - d (number) - - e (number) - - f (number) - = (object) @Matrix - \*/ + R.matrix = function (a, b, c, d, e, f) { return new Matrix(a, b, c, d, e, f); }; @@ -2157,21 +1670,7 @@ } } (function (matrixproto) { - /*\ - * Matrix.add - [ method ] - ** - * Adds given matrix to existing one. - > Parameters - - a (number) - - b (number) - - c (number) - - d (number) - - e (number) - - f (number) - or - - matrix (object) @Matrix - \*/ + matrixproto.add = function (a, b, c, d, e, f) { var out = [[], [], []], m = [[this.a, this.c, this.e], [this.b, this.d, this.f], [0, 0, 1]], @@ -2198,67 +1697,28 @@ this.e = out[0][2]; this.f = out[1][2]; }; - /*\ - * Matrix.invert - [ method ] - ** - * Returns inverted version of the matrix - = (object) @Matrix - \*/ + matrixproto.invert = function () { var me = this, x = me.a * me.d - me.b * me.c; return new Matrix(me.d / x, -me.b / x, -me.c / x, me.a / x, (me.c * me.f - me.d * me.e) / x, (me.b * me.e - me.a * me.f) / x); }; - /*\ - * Matrix.clone - [ method ] - ** - * Returns copy of the matrix - = (object) @Matrix - \*/ + matrixproto.clone = function () { return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f); }; - /*\ - * Matrix.translate - [ method ] - ** - * Translate the matrix - > Parameters - - x (number) - - y (number) - \*/ + matrixproto.translate = function (x, y) { this.add(1, 0, 0, 1, x, y); }; - /*\ - * Matrix.scale - [ method ] - ** - * Scales the matrix - > Parameters - - x (number) - - y (number) #optional - - cx (number) #optional - - cy (number) #optional - \*/ + matrixproto.scale = function (x, y, cx, cy) { y == null && (y = x); cx || cy && this.add(1, 0, 0, 1, cx, cy); this.add(x, 0, 0, y, 0, 0); cx || cy && this.add(1, 0, 0, 1, -cx, -cy); }; - /*\ - * Matrix.rotate - [ method ] - ** - * Rotates the matrix - > Parameters - - a (number) - - x (number) - - y (number) - \*/ + matrixproto.rotate = function (a, x, y) { a = R.rad(a); x = x || 0; @@ -2268,29 +1728,11 @@ this.add(cos, sin, -sin, cos, x, y); this.add(1, 0, 0, 1, -x, -y); }; - /*\ - * Matrix.x - [ method ] - ** - * Return x coordinate for given point after transformation described by the matrix. See also @Matrix.y - > Parameters - - x (number) - - y (number) - = (number) x - \*/ + matrixproto.x = function (x, y) { return x * this.a + y * this.c + this.e; }; - /*\ - * Matrix.y - [ method ] - ** - * Return y coordinate for given point after transformation described by the matrix. See also @Matrix.x - > Parameters - - x (number) - - y (number) - = (number) y - \*/ + matrixproto.y = function (x, y) { return x * this.b + y * this.d + this.f; }; @@ -2318,20 +1760,7 @@ a[0] && (a[0] /= mag); a[1] && (a[1] /= mag); } - /*\ - * Matrix.split - [ method ] - ** - * Splits matrix into primitive transformations - = (object) in format: - o dx (number) translation by x - o dy (number) translation by y - o scalex (number) scale by x - o scaley (number) scale by y - o shear (number) shear - o rotate (number) rotation in deg - o isSimple (boolean) could it be represented via simple transformations - \*/ + matrixproto.split = function () { var out = {}; // translation @@ -2367,13 +1796,7 @@ out.noRotation = !+out.shear.toFixed(9) && !out.rotate; return out; }; - /*\ - * Matrix.toTransformString - [ method ] - ** - * Return transform string that represents given matrix - = (string) transform string - \*/ + matrixproto.toTransformString = function () { var s = this.split(); if (s.isSimple) { @@ -2388,14 +1811,7 @@ var version = navigator.userAgent.match(/Version\/(.*?)\s/) || navigator.userAgent.match(/Chrome\/(\d+)/); if ((navigator.vendor == "Apple Computer, Inc.") && (version && version[1] < 4 || navigator.platform.slice(0, 2) == "iP") || (navigator.vendor == "Google Inc." && version && version[1] < 8)) { - /*\ - * Paper.safari - [ method ] - ** - * There is an inconvenient rendering bug in Safari (WebKit): - * sometimes the rendering should be forced. - * This method should help with dealing with this bug. - \*/ + paperproto.safari = function () { var rect = this.rect(-99, -99, this.width + 99, this.height + 99).attr({stroke: "none"}); setTimeout(function () {rect.remove();}); @@ -2519,21 +1935,40 @@ } drag = []; }, - /*\ - * Raphael.el - [ property (object) ] - ** - * You can add your own method to elements. This is usefull when you want to hack default functionality or - * want to wrap some common transformation or attributes in one method. In difference to canvas methods, - * you can redefine element method at any time. Expending element methods wouldn’t affect set. - > Usage - | Raphael.el.red = function () { - | this.attr({fill: "#f00"}); - | }; - | // then use it - | paper.circle(100, 100, 20).red(); - \*/ + elproto = R.el = {}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + for (var i = events.length; i--;) { (function (eventName) { R[eventName] = elproto[eventName] = function (fn, scope) { @@ -2557,29 +1992,7 @@ })(events[i]); } - /*\ - * Element.data - [ method ] - ** - * Adds or retrieves given value asociated with given key. - ** - * See also @Element.removeData - > Parameters - - key (string) key to store data - - value (any) #optional value to store - = (object) @Element - * or, if value is not specified: - = (any) value - > Usage - | for (var i = 0, i < 5, i++) { - | paper.circle(10 + 15 * i, 10, 10) - | .attr({fill: "#000"}) - | .data("i", i) - | .click(function () { - | alert(this.data("i")); - | }); - | } - \*/ + elproto.data = function (key, value) { var data = eldata[this.id] = eldata[this.id] || {}; if (arguments.length == 1) { @@ -2596,16 +2009,7 @@ eve("data.set." + this.id, this, value, key); return this; }; - /*\ - * Element.removeData - [ method ] - ** - * Removes value associated with an element by given key. - * If key is not provided, removes all the data of the element. - > Parameters - - key (string) #optional key - = (object) @Element - \*/ + elproto.removeData = function (key) { if (key == null) { eldata[this.id] = {}; @@ -2614,64 +2018,15 @@ } return this; }; - /*\ - * Element.hover - [ method ] - ** - * Adds event handlers for hover for the element. - > Parameters - - f_in (function) handler for hover in - - f_out (function) handler for hover out - - icontext (object) #optional context for hover in handler - - ocontext (object) #optional context for hover out handler - = (object) @Element - \*/ + elproto.hover = function (f_in, f_out, scope_in, scope_out) { return this.mouseover(f_in, scope_in).mouseout(f_out, scope_out || scope_in); }; - /*\ - * Element.unhover - [ method ] - ** - * Removes event handlers for hover for the element. - > Parameters - - f_in (function) handler for hover in - - f_out (function) handler for hover out - = (object) @Element - \*/ + elproto.unhover = function (f_in, f_out) { return this.unmouseover(f_in).unmouseout(f_out); }; - /*\ - * Element.drag - [ method ] - ** - * Adds event handlers for drag of the element. - > Parameters - - onmove (function) handler for moving - - onstart (function) handler for drag start - - onend (function) handler for drag end - - mcontext (object) #optional context for moving handler - - scontext (object) #optional context for drag start handler - - econtext (object) #optional context for drag end handler - * Additionaly following `drag` events will be triggered: `drag.start.` on start, - * `drag.end.` on end and `drag.move.` on every move. When element will be dragged over another element - * `drag.over.` will be fired as well. - * - * Start event and start handler will be called in specified context or in context of the element with following parameters: - o x (number) x position of the mouse - o y (number) y position of the mouse - o event (object) DOM event object - * Move event and move handler will be called in specified context or in context of the element with following parameters: - o dx (number) shift by x from the start point - o dy (number) shift by y from the start point - o x (number) x position of the mouse - o y (number) y position of the mouse - o event (object) DOM event object - * End event and end handler will be called in specified context or in context of the element with following parameters: - o event (object) DOM event object - = (object) @Element - \*/ + elproto.drag = function (onmove, onstart, onend, move_scope, start_scope, end_scope) { function start(e) { (e.originalEvent || e).preventDefault(); @@ -2691,23 +2046,11 @@ this.mousedown(start); return this; }; - /*\ - * Element.onDragOver - [ method ] - ** - * Shortcut for assigning event handler for `drag.over.` event, where id is id of the element (see @Element.id). - > Parameters - - f (function) handler for event - \*/ + elproto.onDragOver = function (f) { f ? eve.on("drag.over." + this.id, f) : eve.unbind("drag.over." + this.id); }; - /*\ - * Element.undrag - [ method ] - ** - * Removes all drag event handlers from given element. - \*/ + elproto.undrag = function () { var i = drag.length; while (i--) if (drag[i].el == this) { @@ -2717,250 +2060,72 @@ } !drag.length && R.unmousemove(dragMove).unmouseup(dragUp); }; - /*\ - * Paper.circle - [ method ] - ** - * Draws a circle. - ** - > Parameters - ** - - x (number) x coordinate of the centre - - y (number) y coordinate of the centre - - r (number) radius - = (object) Raphaël element object with type “circle” - ** - > Usage - | var c = paper.circle(50, 50, 40); - \*/ + paperproto.circle = function (x, y, r) { var out = R._engine.circle(this, x || 0, y || 0, r || 0); this.__set__ && this.__set__.push(out); return out; }; - /*\ - * Paper.rect - [ method ] - * - * Draws a rectangle. - ** - > Parameters - ** - - x (number) x coordinate of the top left corner - - y (number) y coordinate of the top left corner - - width (number) width - - height (number) height - - r (number) #optional radius for rounded corners, default is 0 - = (object) Raphaël element object with type “rect” - ** - > Usage - | // regular rectangle - | var c = paper.rect(10, 10, 50, 50); - | // rectangle with rounded corners - | var c = paper.rect(40, 40, 50, 50, 10); - \*/ + paperproto.rect = function (x, y, w, h, r) { var out = R._engine.rect(this, x || 0, y || 0, w || 0, h || 0, r || 0); this.__set__ && this.__set__.push(out); return out; }; - /*\ - * Paper.ellipse - [ method ] - ** - * Draws an ellipse. - ** - > Parameters - ** - - x (number) x coordinate of the centre - - y (number) y coordinate of the centre - - rx (number) horizontal radius - - ry (number) vertical radius - = (object) Raphaël element object with type “ellipse” - ** - > Usage - | var c = paper.ellipse(50, 50, 40, 20); - \*/ + paperproto.ellipse = function (x, y, rx, ry) { var out = R._engine.ellipse(this, x || 0, y || 0, rx || 0, ry || 0); this.__set__ && this.__set__.push(out); return out; }; - /*\ - * Paper.path - [ method ] - ** - * Creates a path element by given path data string. - ** - > Parameters - ** - - pathString (string) path data in SVG path string format. - = (object) Raphaël element object with type “path” - # Details of a path's data attribute's format are described in the SVG specification. - ** - > Usage - | var c = paper.path("M10 10L90 90"); - | // draw a diagonal line: - | // move to 10,10, line to 90,90 - \*/ + paperproto.path = function (pathString) { pathString && !R.is(pathString, string) && !R.is(pathString[0], array) && (pathString += E); var out = R._engine.path(R.format[apply](R, arguments), this); this.__set__ && this.__set__.push(out); return out; }; - /*\ - * Paper.image - [ method ] - ** - * Embeds an image into the surface. - ** - > Parameters - ** - - src (string) URI of the source image - - x (number) x coordinate position - - y (number) y coordinate position - - width (number) width of the image - - height (number) height of the image - = (object) Raphaël element object with type “image” - ** - > Usage - | var c = paper.image("apple.png", 10, 10, 80, 80); - \*/ + paperproto.image = function (src, x, y, w, h) { var out = R._engine.image(this, src || "about:blank", x || 0, y || 0, w || 0, h || 0); this.__set__ && this.__set__.push(out); return out; }; - /*\ - * Paper.text - [ method ] - ** - * Draws a text string. If you need line breaks, put “\n” in the string. - ** - > Parameters - ** - - x (number) x coordinate position - - y (number) y coordinate position - - text (string) The text string to draw - = (object) Raphaël element object with type “text” - ** - > Usage - | var t = paper.text(50, 50, "Raphaël\nkicks\nbutt!"); - \*/ + paperproto.text = function (x, y, text) { var out = R._engine.text(this, x || 0, y || 0, Str(text)); this.__set__ && this.__set__.push(out); return out; }; - /*\ - * Paper.set - [ method ] - ** - * Creates array-like object to keep and operate several elements at once. - * Warning: it doesn’t create any elements for itself in the page, it just groups existing elements. - * Sets act as pseudo elements — all methods available to an element can be used on a set. - = (object) array-like object that represents set of elements - ** - > Usage - | var st = paper.set(); - | st.push( - | paper.circle(10, 10, 5), - | paper.circle(30, 10, 5) - | ); - | st.attr({fill: "red"}); // changes the fill of both circles - \*/ + paperproto.set = function (itemsArray) { !R.is(itemsArray, "array") && (itemsArray = Array.prototype.splice.call(arguments, 0, arguments.length)); var out = new Set(itemsArray); this.__set__ && this.__set__.push(out); return out; }; - /*\ - * Paper.setStart - [ method ] - ** - * Creates @Paper.set. All elements that will be created after calling this method and before calling - * @Paper.setFinish will be added to the set. - ** - > Usage - | paper.setStart(); - | paper.circle(10, 10, 5), - | paper.circle(30, 10, 5) - | var st = paper.setFinish(); - | st.attr({fill: "red"}); // changes the fill of both circles - \*/ + paperproto.setStart = function (set) { this.__set__ = set || this.set(); }; - /*\ - * Paper.setFinish - [ method ] - ** - * See @Paper.setStart. This method finishes catching and returns resulting set. - ** - = (object) set - \*/ + paperproto.setFinish = function (set) { var out = this.__set__; delete this.__set__; return out; }; - /*\ - * Paper.setSize - [ method ] - ** - * If you need to change dimensions of the canvas call this method - ** - > Parameters - ** - - width (number) new width of the canvas - - height (number) new height of the canvas - > Usage - | var st = paper.set(); - | st.push( - | paper.circle(10, 10, 5), - | paper.circle(30, 10, 5) - | ); - | st.attr({fill: "red"}); - \*/ - paperproto.setSize = R._engine.setSize; - /*\ - * Paper.setViewBox - [ method ] - ** - * Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by - * specifying new boundaries. - ** - > Parameters - ** - x, y, w, h, fit - - x (number) new x position, default is `0` - - y (number) new y position, default is `0` - - w (number) new width of the canvas - - h (number) new height of the canvas - - fit (boolean) `true` if you want graphics to fit into new boundary box - \*/ - paperproto.setViewBox = R._engine.setViewBox; - /*\ - * Paper.top - [ property ] - ** - * Points to the topmost element on the paper - \*/ - /*\ - * Paper.bottom - [ property ] - ** - * Points to the bottom element on the paper - \*/ + + paperproto.setSize = function (width, height) { + return R._engine.setSize.call(this, width, height); + }; + + paperproto.setViewBox = function (x, y, w, h, fit) { + return R._engine.setViewBox.call(this, x, y, w, h, fit); + }; + + paperproto.top = paperproto.bottom = null; - /*\ - * Paper.raphael - [ property ] - ** - * Points to the @Raphael object/function - \*/ + paperproto.raphael = R; var getOffset = function (elem) { var box = elem.getBoundingClientRect(), @@ -2975,20 +2140,7 @@ x: left }; }; - /*\ - * Paper.getElementByPoint - [ method ] - ** - * Returns you topmost element under given point. - ** - = (object) Raphaël element object - > Parameters - ** - - x (number) x coordinate from the top left corner of the window - - y (number) y coordinate from the top left corner of the window - > Usage - | paper.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"}); - \*/ + paperproto.getElementByPoint = function (x, y) { var paper = this, svg = paper.canvas, @@ -3014,17 +2166,7 @@ target = target && target.raphael ? paper.getById(target.raphaelid) : null; return target; }; - /*\ - * Paper.getById - [ method ] - ** - * Returns you element by its internal ID. - ** - > Parameters - ** - - id (number) id - = (object) Raphaël element object - \*/ + paperproto.getById = function (id) { var bot = this.bottom; while (bot) { @@ -3035,20 +2177,7 @@ } return null; }; - /*\ - * Paper.forEach - [ method ] - ** - * Executes given function for each element on the paper - * - * If callback function returns `false` it will stop loop running. - ** - > Parameters - ** - - callback (function) function to run - - thisArg (object) context object for the callback - = (object) Paper object - \*/ + paperproto.forEach = function (callback, thisArg) { var bot = this.bottom; while (bot) { @@ -3065,23 +2194,7 @@ function x_y_w_h() { return this.x + S + this.y + S + this.width + " \xd7 " + this.height; } - /*\ - * Element.getBBox - [ method ] - ** - * Return bounding box for a given element - ** - > Parameters - ** - - isWithoutTransform (boolean) flag, `true` if you want to have bounding box before transformations. Default is `false`. - = (object) Bounding box object: - o { - o x: (number) top left corner x - o y: (number) top left corner y - o width: (number) width - o height: (number) height - o } - \*/ + elproto.getBBox = function (isWithoutTransform) { if (this.removed) { return {}; @@ -3107,40 +2220,14 @@ } return _.bbox; }; - /*\ - * Element.clone - [ method ] - ** - = (object) clone of a given element - ** - \*/ + elproto.clone = function () { if (this.removed) { return null; } return this.paper[this.type]().attr(this.attr()); }; - /*\ - * Element.glow - [ method ] - ** - * Return set of elements that create glow-like effect around given element. See @Paper.set. - * - * Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself. - ** - > Parameters - ** - - glow (object) #optional parameters object with all properties optional: - o { - o width (number) size of the glow, default is `10` - o fill (boolean) will it be filled, default is `false` - o opacity (number) opacity, default is `0.5` - o offsetx (number) horizontal offset, default is `0` - o offsety (number) vertical offset, default is `0` - o color (string) glow colour, default is `black` - o } - = (object) @Paper.set of elements that represents glow - \*/ + elproto.glow = function (glow) { if (this.type == "text") { return null; @@ -3248,52 +2335,11 @@ var getTotalLength = getLengthFactory(1), getPointAtLength = getLengthFactory(), getSubpathsAtLength = getLengthFactory(0, 1); - /*\ - * Raphael.getTotalLength - [ method ] - ** - * Returns length of the given path in pixels. - ** - > Parameters - ** - - path (string) SVG path string. - ** - = (number) length. - \*/ + R.getTotalLength = getTotalLength; - /*\ - * Raphael.getPointAtLength - [ method ] - ** - * Return coordinates of the point located at the given length on the given path. - ** - > Parameters - ** - - path (string) SVG path string - - length (number) - ** - = (object) representation of the point: - o { - o x: (number) x coordinate - o y: (number) y coordinate - o alpha: (number) angle of derivative - o } - \*/ + R.getPointAtLength = getPointAtLength; - /*\ - * Raphael.getSubpath - [ method ] - ** - * Return subpath of a given path from given length to given length. - ** - > Parameters - ** - - path (string) SVG path string - - from (number) position of the start of the segment - - to (number) position of the end of the segment - ** - = (string) pathstring for the segment - \*/ + R.getSubpath = function (path, from, to) { if (abs(this.getTotalLength(path) - to) < 1e-6) { return getSubpathsAtLength(path, from).end; @@ -3301,13 +2347,7 @@ var a = getSubpathsAtLength(path, to, 1); return from ? getSubpathsAtLength(a, from).end : a; }; - /*\ - * Element.getTotalLength - [ method ] - ** - * Returns length of the path in pixels. Only works for element of “path” type. - = (number) length. - \*/ + elproto.getTotalLength = function () { if (this.type != "path") {return;} if (this.node.getTotalLength) { @@ -3315,61 +2355,17 @@ } return getTotalLength(this.attrs.path); }; - /*\ - * Element.getPointAtLength - [ method ] - ** - * Return coordinates of the point located at the given length on the given path. Only works for element of “path” type. - ** - > Parameters - ** - - length (number) - ** - = (object) representation of the point: - o { - o x: (number) x coordinate - o y: (number) y coordinate - o alpha: (number) angle of derivative - o } - \*/ + elproto.getPointAtLength = function (length) { if (this.type != "path") {return;} return getPointAtLength(this.attrs.path, length); }; - /*\ - * Element.getSubpath - [ method ] - ** - * Return subpath of a given element from given length to given length. Only works for element of “path” type. - ** - > Parameters - ** - - from (number) position of the start of the segment - - to (number) position of the end of the segment - ** - = (string) pathstring for the segment - \*/ + elproto.getSubpath = function (from, to) { if (this.type != "path") {return;} return R.getSubpath(this.attrs.path, from, to); }; - /*\ - * Raphael.easing_formulas - [ property ] - ** - * Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing: - #
    - #
  • “linear”
  • - #
  • “<” or “easeIn” or “ease-in”
  • - #
  • “>” or “easeOut” or “ease-out”
  • - #
  • “<>” or “easeInOut” or “ease-in-out”
  • - #
  • “backIn” or “back-in”
  • - #
  • “backOut” or “back-out”
  • - #
  • “elastic”
  • - #
  • “bounce”
  • - #
- #

See also Easing demo.

- \*/ + var ef = R.easing_formulas = { linear: function (n) { return n; @@ -3564,23 +2560,7 @@ upto255 = function (color) { return color > 255 ? 255 : color < 0 ? 0 : color; }; - /*\ - * Element.animateWith - [ method ] - ** - * Acts similar to @Element.animate, but ensure that given animation runs in sync with another given element. - ** - > Parameters - ** - - params (object) final attributes for the element, see also @Element.attr - - ms (number) number of milliseconds for animation to run - - easing (string) #optional easing type. Accept on of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` - - callback (function) #optional callback function. Will be called at the end of animation. - * or - - animation (object) animation object, see @Raphael.animation - ** - = (object) original element - \*/ + elproto.animateWith = function (element, params, ms, easing, callback) { this.animate(params, ms, easing, callback); var start, el; @@ -3664,36 +2644,14 @@ this.top = percents[percents.length - 1]; this.percents = percents; } - /*\ - * Animation.delay - [ method ] - ** - * Creates a copy of existing animation object with given delay. - ** - > Parameters - ** - - delay (number) number of ms to pass between animation start and actual animation - ** - = (object) new altered Animation object - \*/ + Animation.prototype.delay = function (delay) { var a = new Animation(this.anim, this.ms); a.times = this.times; a.del = +delay || 0; return a; }; - /*\ - * Animation.repeat - [ method ] - ** - * Creates a copy of existing animation object with given repetition. - ** - > Parameters - ** - - repeat (number) number iterations of animation. For infinite animation pass `Infinity` - ** - = (object) new altered Animation object - \*/ + Animation.prototype.repeat = function (times) { var a = new Animation(this.anim, this.ms); a.del = this.del; @@ -3903,22 +2861,7 @@ } eve("anim.start." + element.id, element, anim); } - /*\ - * Raphael.animation - [ method ] - ** - * Creates an animation object that can be passed to the @Element.animate or @Element.animateWith methods. - * See also @Animation.delay and @Animation.repeat methods. - ** - > Parameters - ** - - params (object) final attributes for the element, see also @Element.attr - - ms (number) number of milliseconds for animation to run - - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` - - callback (function) #optional callback function. Will be called at the end of animation. - ** - = (object) @Animation - \*/ + R.animation = function (params, ms, easing, callback) { if (R.is(easing, "function") || !easing) { callback = callback || easing || null; @@ -3941,23 +2884,7 @@ return new Animation({100: p}, ms); } }; - /*\ - * Element.animate - [ method ] - ** - * Creates and starts animation for given element. - ** - > Parameters - ** - - params (object) final attributes for the element, see also @Element.attr - - ms (number) number of milliseconds for animation to run - - easing (string) #optional easing type. Accept one of @Raphael.easing_formulas or CSS format: `cubic‐bezier(XX, XX, XX, XX)` - - callback (function) #optional callback function. Will be called at the end of animation. - * or - - animation (object) animation object, see @Raphael.animation - ** - = (object) original element - \*/ + elproto.animate = function (params, ms, easing, callback) { var element = this; if (element.removed) { @@ -3968,49 +2895,14 @@ runAnimation(anim, element, anim.percents[0], null, element.attr()); return element; }; - /*\ - * Element.setTime - [ method ] - ** - * Sets the status of animation of the element in milliseconds. Similar to @Element.status method. - ** - > Parameters - ** - - anim (object) animation object - - value (number) number of milliseconds from the beginning of the animation - ** - = (object) original element if `value` is specified - * Note, that during animation following events are triggered: - * - * On each animation frame event `anim.frame.`, on start `anim.start.` and on end `anim.finish.`. - \*/ + elproto.setTime = function (anim, value) { if (anim && value != null) { this.status(anim, mmin(value, anim.ms) / anim.ms); } return this; }; - /*\ - * Element.status - [ method ] - ** - * Gets or sets the status of animation of the element. - ** - > Parameters - ** - - anim (object) #optional animation object - - value (number) #optional 0 – 1. If specified, method works like a setter and sets the status of a given animation to the value. This will cause animation to jump to the given position. - ** - = (number) status - * or - = (array) status if `anim` is not specified. Array of objects in format: - o { - o anim: (object) animation object - o status: (number) status - o } - * or - = (object) original element if `value` is specified - \*/ + elproto.status = function (anim, value) { var out = [], i = 0, @@ -4036,18 +2928,7 @@ return out; } }; - /*\ - * Element.pause - [ method ] - ** - * Stops animation of the element with ability to resume it later on. - ** - > Parameters - ** - - anim (object) #optional animation object - ** - = (object) original element - \*/ + elproto.pause = function (anim) { for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { if (eve("anim.pause." + this.id, this, animationElements[i].anim) !== false) { @@ -4056,18 +2937,7 @@ } return this; }; - /*\ - * Element.resume - [ method ] - ** - * Resumes animation if it was paused with @Element.pause method. - ** - > Parameters - ** - - anim (object) #optional animation object - ** - = (object) original element - \*/ + elproto.resume = function (anim) { for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { var e = animationElements[i]; @@ -4078,18 +2948,7 @@ } return this; }; - /*\ - * Element.stop - [ method ] - ** - * Stops animation of the element. - ** - > Parameters - ** - - anim (object) #optional animation object - ** - = (object) original element - \*/ + elproto.stop = function (anim) { for (var i = 0; i < animationElements.length; i++) if (animationElements[i].el.id == this.id && (!anim || animationElements[i].anim == anim)) { if (eve("anim.stop." + this.id, this, animationElements[i].anim) !== false) { @@ -4117,13 +2976,7 @@ } }, setproto = Set.prototype; - /*\ - * Set.push - [ method ] - ** - * Adds each argument to the current set. - = (object) original element - \*/ + setproto.push = function () { var item, len; @@ -4137,31 +2990,12 @@ } return this; }; - /*\ - * Set.pop - [ method ] - ** - * Removes last element and returns it. - = (object) element - \*/ + setproto.pop = function () { this.length && delete this[this.length--]; return this.items.pop(); }; - /*\ - * Set.forEach - [ method ] - ** - * Executes given function for each element in the set. - * - * If function returns `false` it will stop loop running. - ** - > Parameters - ** - - callback (function) function to run - - thisArg (object) context object for the callback - = (object) Set object - \*/ + setproto.forEach = function (callback, thisArg) { for (var i = 0, ii = this.items.length; i < ii; i++) { if (callback.call(thisArg, this.items[i]) === false) { @@ -4353,25 +3187,7 @@ return out; }; - /*\ - * Raphael.format - [ method ] - ** - * Simple format function. Replaces construction of type “`{}`” to the corresponding argument. - ** - > Parameters - ** - - token (string) string to format - - … (string) rest of arguments will be treated as parameters for replacement - = (string) formated string - > Usage - | var x = 10, - | y = 20, - | width = 40, - | height = 50; - | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" - | paper.path(Raphael.format("M{1},{2}h{3}v{4}h{5}z", x, y, width, height, -width)); - \*/ + R.format = function (token, params) { var args = R.is(params, array) ? [0][concat](params) : arguments; token && R.is(token, string) && args.length - 1 && (token = token.replace(formatrg, function (str, i) { @@ -4379,29 +3195,7 @@ })); return token || E; }; - /*\ - * Raphael.fullfill - [ method ] - ** - * A little bit more advanced format function than @Raphael.format. Replaces construction of type “`{}`” to the corresponding argument. - ** - > Parameters - ** - - token (string) string to format - - json (object) object which properties will be used as a replacement - = (string) formated string - > Usage - | // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" - | paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative width']}z", { - | x: 10, - | y: 20, - | dim: { - | width: 40, - | height: 50, - | "negative width": -40 - | } - | })); - \*/ + R.fullfill = (function () { var tokenRegex = /\{([^\}]+)\}/g, objNotationRegex = /(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g, // matches .xxxxx or ["xxxxx"] to run over object properties @@ -4425,44 +3219,12 @@ }); }; })(); - /*\ - * Raphael.ninja - [ method ] - ** - * If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable `Raphael`, but anyway.) You can use `ninja` method. - * Beware, that in this case plugins could stop working, because they are depending on global variable existance. - ** - = (object) Raphael object - > Usage - | (function (local_raphael) { - | var paper = local_raphael(10, 10, 320, 200); - | … - | })(Raphael.ninja()); - \*/ + R.ninja = function () { oldRaphael.was ? (g.win.Raphael = oldRaphael.is) : delete Raphael; return R; }; - /*\ - * Raphael.st - [ property (object) ] - ** - * You can add your own method to elements and sets. It is wise to add a set method for each element method - * you added, so you will be able to call the same method on sets too. - ** - * See also @Raphael.el. - > Usage - | Raphael.el.red = function () { - | this.attr({fill: "#f00"}); - | }; - | Raphael.st.red = function () { - | this.forEach(function () { - | this.red(); - | }); - | }; - | // then use it - | paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red(); - \*/ + R.st = setproto; // Firefox <3.6 fix: http://webreflection.blogspot.com/2009/11/195-chars-to-help-lazy-loading.html (function (doc, loaded, f) { @@ -4506,7 +3268,8 @@ window.Raphael.svg && function (R) { pow = math.pow, separator = /[, ]+/, eve = R.eve, - E = ""; + E = "", + S = " "; // SVG var xlink = "http://www.w3.org/1999/xlink", markers = { @@ -4773,36 +3536,38 @@ window.Raphael.svg && function (R) { } } }, + dasharray = { + "": [0], + "none": [0], + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + addDashes = function (o, value, params) { + value = dasharray[Str(value).toLowerCase()]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = [], + i = value.length; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(o.node, {"stroke-dasharray": dashes.join(",")}); + } + }, setFillAndStroke = function (o, params) { - var dasharray = { - "": [0], - "none": [0], - "-": [3, 1], - ".": [1, 1], - "-.": [3, 1, 1, 1], - "-..": [3, 1, 1, 1, 1, 1], - ". ": [1, 3], - "- ": [4, 3], - "--": [8, 3], - "- .": [4, 3, 1, 3], - "--.": [8, 3, 1, 3], - "--..": [8, 3, 1, 3, 1, 3] - }, - node = o.node, + var node = o.node, attrs = o.attrs, - addDashes = function (o, value) { - value = dasharray[Str(value).toLowerCase()]; - if (value) { - var width = o.attrs["stroke-width"] || "1", - butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, - dashes = [], - i = value.length; - while (i--) { - dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; - } - $(node, {"stroke-dasharray": dashes.join(",")}); - } - }; + vis = node.style.visibility; + node.style.visibility = "hidden"; for (var att in params) { if (params[has](att)) { if (!R._availableAttrs[has](att)) { @@ -4943,7 +3708,7 @@ window.Raphael.svg && function (R) { } node.setAttribute(att, value); if (attrs["stroke-dasharray"]) { - addDashes(o, attrs["stroke-dasharray"]); + addDashes(o, attrs["stroke-dasharray"], params); } if (o._.arrows) { "startString" in o._.arrows && addArrow(o, o._.arrows.startString); @@ -4951,7 +3716,7 @@ window.Raphael.svg && function (R) { } break; case "stroke-dasharray": - addDashes(o, value); + addDashes(o, value, params); break; case "fill": var isURL = Str(value).match(R._ISURL); @@ -5042,6 +3807,8 @@ window.Raphael.svg && function (R) { } tuneText(o, params); + node.style.visibility = vis; + console.log("new"); }, leading = 1.2, tuneText = function (el, params) { @@ -5084,57 +3851,16 @@ window.Raphael.svg && function (R) { Element = function (node, svg) { var X = 0, Y = 0; - /*\ - * Element.node - [ property (object) ] - ** - * Gives you a reference to the DOM object, so you can assign event handlers or just mess around. - ** - * Note: Don’t mess with it. - > Usage - | // draw a circle at coordinate 10,10 with radius of 10 - | var c = paper.circle(10, 10, 10); - | c.node.onclick = function () { - | c.attr("fill", "red"); - | }; - \*/ + this[0] = this.node = node; - /*\ - * Element.raphael - [ property (object) ] - ** - * Internal reference to @Raphael object. In case it is not available. - > Usage - | Raphael.el.red = function () { - | var hsb = this.paper.raphael.rgb2hsb(this.attr("fill")); - | hsb.h = 1; - | this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex}); - | } - \*/ + node.raphael = true; - /*\ - * Element.id - [ property (number) ] - ** - * Unique id of the element. Especially usesful when you want to listen to events of the element, - * because all events are fired in format `..`. Also useful for @Paper.getById method. - \*/ + this.id = R._oid++; node.raphaelid = this.id; this.matrix = R.matrix(); this.realPath = null; - /*\ - * Element.paper - [ property (object) ] - ** - * Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions. - > Usage - | Raphael.el.cross = function () { - | this.attr({fill: "red"}); - | this.paper.path("M10,10L50,50M50,10L10,50") - | .attr({stroke: "red"}); - | } - \*/ + this.paper = svg; this.attrs = this.attrs || {}; this._ = { @@ -5147,21 +3873,11 @@ window.Raphael.svg && function (R) { dirty: 1 }; !svg.bottom && (svg.bottom = this); - /*\ - * Element.prev - [ property (object) ] - ** - * Reference to the previous element in the hierarchy. - \*/ + this.prev = svg.top; svg.top && (svg.top.next = this); svg.top = this; - /*\ - * Element.next - [ property (object) ] - ** - * Reference to the next element in the hierarchy. - \*/ + this.next = null; }, elproto = R.el; @@ -5174,22 +3890,14 @@ window.Raphael.svg && function (R) { SVG.canvas && SVG.canvas.appendChild(el); var p = new Element(el, SVG); p.type = "path"; - setFillAndStroke(p, {fill: "none", stroke: "#000", path: pathString}); + setFillAndStroke(p, { + fill: "none", + stroke: "#000", + path: pathString + }); return p; }; - /*\ - * Element.rotate - [ method ] - ** - * Adds rotation by given angle around given point to the list of - * transformations of the element. - > Parameters - - deg (number) angle in degrees - - cx (number) #optional x coordinate of the centre of rotation - - cy (number) #optional y coordinate of the centre of rotation - * If cx & cy aren’t specified centre of the shape is used as a point of rotation. - = (object) @Element - \*/ + elproto.rotate = function (deg, cx, cy) { if (this.removed) { return this; @@ -5209,20 +3917,7 @@ window.Raphael.svg && function (R) { this.transform(this._.transform.concat([["r", deg, cx, cy]])); return this; }; - /*\ - * Element.scale - [ method ] - ** - * Adds scale by given amount relative to given point to the list of - * transformations of the element. - > Parameters - - sx (number) horisontal scale amount - - sy (number) vertical scale amount - - cx (number) #optional x coordinate of the centre of scale - - cy (number) #optional y coordinate of the centre of scale - * If cx & cy aren’t specified centre of the shape is used instead. - = (object) @Element - \*/ + elproto.scale = function (sx, sy, cx, cy) { if (this.removed) { return this; @@ -5244,16 +3939,7 @@ window.Raphael.svg && function (R) { this.transform(this._.transform.concat([["s", sx, sy, cx, cy]])); return this; }; - /*\ - * Element.translate - [ method ] - ** - * Adds translation by given amount to the list of transformations of the element. - > Parameters - - dx (number) horisontal shift - - dy (number) vertical shift - = (object) @Element - \*/ + elproto.translate = function (dx, dy) { if (this.removed) { return this; @@ -5267,41 +3953,7 @@ window.Raphael.svg && function (R) { this.transform(this._.transform.concat([["t", dx, dy]])); return this; }; - /*\ - * Element.transform - [ method ] - ** - * Adds transformation to the element which is separate to other attributes, - * i.e. translation doesn’t change `x` or `y` of the rectange. The format - * of transformation string is similar to the path string syntax: - | "t100,100r30,100,100s2,2,100,100r45s1.5" - * Each letter is a command. There are four commands: `t` is for translate, `r` is for rotate, `s` is for - * scale and `m` is for matrix. - * - * So, the example line above could be read like “translate by 100, 100; rotate 30° around 100, 100; scale twice around 100, 100; - * rotate 45° around centre; scale 1.5 times relative to centre”. As you can see rotate and scale commands have origin - * coordinates as optional parameters, the default is the centre point of the element. - * Matrix accepts six parameters. - > Usage - | var el = paper.rect(10, 20, 300, 200); - | // translate 100, 100, rotate 45°, translate -100, 0 - | el.transform("t100,100r45t-100,0"); - | // if you want you can append or prepend transformations - | el.transform("...t50,50"); - | el.transform("s2..."); - | // or even wrap - | el.transform("t50,50...t-50-50"); - | // to reset transformation call method with empty string - | el.transform(""); - | // to get current value call it without parameters - | console.log(el.transform()); - > Parameters - - tstr (string) #optional transformation string - * If tstr isn’t specified - = (string) current transformation string - * else - = (object) @Element - \*/ + elproto.transform = function (tstr) { var _ = this._; if (tstr == null) { @@ -5320,34 +3972,17 @@ window.Raphael.svg && function (R) { return this; }; - /*\ - * Element.hide - [ method ] - ** - * Makes element invisible. See @Element.show. - = (object) @Element - \*/ + elproto.hide = function () { !this.removed && this.paper.safari(this.node.style.display = "none"); return this; }; - /*\ - * Element.show - [ method ] - ** - * Makes element visible. See @Element.hide. - = (object) @Element - \*/ + elproto.show = function () { !this.removed && this.paper.safari(this.node.style.display = ""); return this; }; - /*\ - * Element.remove - [ method ] - ** - * Removes element form the paper. - \*/ + elproto.remove = function () { if (this.removed) { return; @@ -5376,87 +4011,7 @@ window.Raphael.svg && function (R) { hide && this.hide(); return bbox; }; - /*\ - * Element.attr - [ method ] - ** - * Sets the attributes of the element. - > Parameters - - attrName (string) attribute’s name - - value (string) value - * or - - params (object) object of name/value pairs - * or - - attrName (string) attribute’s name - * or - - attrNames (array) in this case method returns array of current values for given attribute names - = (object) @Element if attrsName & value or params are passed in. - = (...) value of the attribute if only attrsName is passed in. - = (array) array of values of the attribute if attrsNames is passed in. - = (object) object of attributes if nothing is passed in. - > Possible parameters - #

Please refer to the SVG specification for an explanation of these parameters.

- o arrow-end (string) arrowhead on the end of the path. The format for string is `[-[-]]`. Possible types: `classic`, `block`, `open`, `oval`, `diamond`, `none`, width: `wide`, `narrow`, `midium`, length: `long`, `short`, `midium`. - o clip-rect (string) comma or space separated values: x, y, width and height - o cursor (string) CSS type of the cursor - o cx (number) - o cy (number) - o fill (string) colour, gradient or image - o fill-opacity (number) - o font (string) - o font-family (string) - o font-size (number) font size in pixels - o font-weight (string) - o height (number) - o href (string) URL, if specified element behaves as hyperlink - o opacity (number) - o path (string) SVG path string format - o r (number) - o rx (number) - o ry (number) - o src (string) image URL, only works for @Element.image element - o stroke (string) stroke colour - o stroke-dasharray (string) [“”, “`-`”, “`.`”, “`-.`”, “`-..`”, “`. `”, “`- `”, “`--`”, “`- .`”, “`--.`”, “`--..`”] - o stroke-linecap (string) [“`butt`”, “`square`”, “`round`”] - o stroke-linejoin (string) [“`bevel`”, “`round`”, “`miter`”] - o stroke-miterlimit (number) - o stroke-opacity (number) - o stroke-width (number) stroke width in pixels, default is '1' - o target (string) used with href - o text (string) contents of the text element. Use `\n` for multiline text - o text-anchor (string) [“`start`”, “`middle`”, “`end`”], default is “`middle`” - o title (string) will create tooltip with a given text - o transform (string) see @Element.transform - o width (number) - o x (number) - o y (number) - > Gradients - * Linear gradient format: “`‹angle›-‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`90-#fff-#000`” – 90° - * gradient from white to black or “`0-#fff-#f00:20-#000`” – 0° gradient from white via red (at 20%) to black. - * - * radial gradient: “`r[(‹fx›, ‹fy›)]‹colour›[-‹colour›[:‹offset›]]*-‹colour›`”, example: “`r#fff-#000`” – - * gradient from white to black or “`r(0.25, 0.75)#fff-#000`” – gradient from white to black with focus point - * at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can only be applied to circles and ellipses. - > Path String - #

Please refer to SVG documentation regarding path string. Raphaël fully supports it.

- > Colour Parsing - #
    - #
  • Colour name (“red”, “green”, “cornflowerblue”, etc)
  • - #
  • #••• — shortened HTML colour: (“#000”, “#fc0”, etc)
  • - #
  • #•••••• — full length HTML colour: (“#000000”, “#bd2300”)
  • - #
  • rgb(•••, •••, •••) — red, green and blue channels’ values: (“rgb(200, 100, 0)”)
  • - #
  • rgb(•••%, •••%, •••%) — same as above, but in %: (“rgb(100%, 175%, 0%)”)
  • - #
  • rgba(•••, •••, •••, •••) — red, green and blue channels’ values: (“rgba(200, 100, 0, .5)”)
  • - #
  • rgba(•••%, •••%, •••%, •••%) — same as above, but in %: (“rgba(100%, 175%, 0%, 50%)”)
  • - #
  • hsb(•••, •••, •••) — hue, saturation and brightness values: (“hsb(0.5, 0.25, 1)”)
  • - #
  • hsb(•••%, •••%, •••%) — same as above, but in %
  • - #
  • hsba(•••, •••, •••, •••) — same as above, but with opacity
  • - #
  • hsl(•••, •••, •••) — almost the same as hsb, see Wikipedia page
  • - #
  • hsl(•••%, •••%, •••%) — same as above, but in %
  • - #
  • hsla(•••, •••, •••) — same as above, but with opacity
  • - #
  • Optionally for hsb and hsl you could specify hue as a degree: “hsl(240deg, 1, .5)” or, if you want to go fancy, “hsl(240°, 1, .5)”
  • - #
- \*/ + elproto.attr = function (name, value) { if (this.removed) { return this; @@ -5514,13 +4069,7 @@ window.Raphael.svg && function (R) { setFillAndStroke(this, params); return this; }; - /*\ - * Element.toFront - [ method ] - ** - * Moves the element so it is the closest to the viewer’s eyes, on top of other elements. - = (object) @Element - \*/ + elproto.toFront = function () { if (this.removed) { return this; @@ -5530,13 +4079,7 @@ window.Raphael.svg && function (R) { svg.top != this && R._tofront(this, svg); return this; }; - /*\ - * Element.toBack - [ method ] - ** - * Moves the element so it is the furthest from the viewer’s eyes, behind other elements. - = (object) @Element - \*/ + elproto.toBack = function () { if (this.removed) { return this; @@ -5548,13 +4091,7 @@ window.Raphael.svg && function (R) { } return this; }; - /*\ - * Element.insertAfter - [ method ] - ** - * Inserts current object after the given one. - = (object) @Element - \*/ + elproto.insertAfter = function (element) { if (this.removed) { return this; @@ -5568,13 +4105,7 @@ window.Raphael.svg && function (R) { R._insertafter(this, element, this.paper); return this; }; - /*\ - * Element.insertBefore - [ method ] - ** - * Inserts current object before the given one. - = (object) @Element - \*/ + elproto.insertBefore = function (element) { if (this.removed) { return this; @@ -5748,16 +4279,7 @@ window.Raphael.svg && function (R) { this._viewBox = [x, y, w, h, !!fit]; return this; }; - /*\ - * Paper.renderfix - [ method ] - ** - * Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependant - * on other elements after reflow it could shift half pixel which cause for lines to lost their crispness. - * This method fixes the issue. - ** - Special thanks to Mariusz Nowak (http://www.medikoo.com/) for this method. - \*/ + R.prototype.renderfix = function () { var cnvs = this.canvas, s = cnvs.style, @@ -5775,12 +4297,7 @@ window.Raphael.svg && function (R) { } } }; - /*\ - * Paper.clear - [ method ] - ** - * Clears the paper, i.e. removes all the elements. - \*/ + R.prototype.clear = function () { R.eve("clear", this); var c = this.canvas; @@ -5792,12 +4309,7 @@ window.Raphael.svg && function (R) { c.appendChild(this.desc); c.appendChild(this.defs = $("defs")); }; - /*\ - * Paper.remove - [ method ] - ** - * Removes the paper from the DOM. - \*/ + R.prototype.remove = function () { eve("remove", this); this.canvas.parentNode && this.canvas.parentNode.removeChild(this.canvas); @@ -5853,7 +4365,7 @@ window.Raphael.vml && function (R) { path2vml = function (path) { var total = /[ahqstv]/ig, command = R._pathToAbsolute; - Str(path).match(total) && (command = path2curve); + Str(path).match(total) && (command = R._path2curve); total = /[clmz]/g; if (command == R._pathToAbsolute && !Str(path).match(total)) { var res = Str(path).replace(bites, function (all, command, args) { @@ -6153,7 +4665,7 @@ window.Raphael.vml && function (R) { var brect = span.getBoundingClientRect(); res.W = a.w = (brect.right - brect.left) / m; res.H = a.h = (brect.bottom - brect.top) / m; - res.paper.canvas.style.display = "none"; + // res.paper.canvas.style.display = "none"; res.X = a.x; res.Y = a.y + res.H / 2; @@ -6631,7 +5143,12 @@ window.Raphael.vml && function (R) { el.coordsize = zoom + S + zoom; el.coordorigin = "0 0"; var p = new Element(el, vml), - attr = {fill: "#000", stroke: "none", font: availableAttrs.font, text: text}; + attr = { + fill: "#000", + stroke: "none", + font: R._availableAttrs.font, + text: text + }; p.shape = el; p.path = path; p.textpath = o; diff --git a/raphael.svg.js b/raphael.svg.js index 9d77c0b..320e476 100644 --- a/raphael.svg.js +++ b/raphael.svg.js @@ -18,7 +18,8 @@ window.Raphael.svg && function (R) { pow = math.pow, separator = /[, ]+/, eve = R.eve, - E = ""; + E = "", + S = " "; // SVG var xlink = "http://www.w3.org/1999/xlink", markers = { @@ -285,36 +286,38 @@ window.Raphael.svg && function (R) { } } }, + dasharray = { + "": [0], + "none": [0], + "-": [3, 1], + ".": [1, 1], + "-.": [3, 1, 1, 1], + "-..": [3, 1, 1, 1, 1, 1], + ". ": [1, 3], + "- ": [4, 3], + "--": [8, 3], + "- .": [4, 3, 1, 3], + "--.": [8, 3, 1, 3], + "--..": [8, 3, 1, 3, 1, 3] + }, + addDashes = function (o, value, params) { + value = dasharray[Str(value).toLowerCase()]; + if (value) { + var width = o.attrs["stroke-width"] || "1", + butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, + dashes = [], + i = value.length; + while (i--) { + dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; + } + $(o.node, {"stroke-dasharray": dashes.join(",")}); + } + }, setFillAndStroke = function (o, params) { - var dasharray = { - "": [0], - "none": [0], - "-": [3, 1], - ".": [1, 1], - "-.": [3, 1, 1, 1], - "-..": [3, 1, 1, 1, 1, 1], - ". ": [1, 3], - "- ": [4, 3], - "--": [8, 3], - "- .": [4, 3, 1, 3], - "--.": [8, 3, 1, 3], - "--..": [8, 3, 1, 3, 1, 3] - }, - node = o.node, + var node = o.node, attrs = o.attrs, - addDashes = function (o, value) { - value = dasharray[Str(value).toLowerCase()]; - if (value) { - var width = o.attrs["stroke-width"] || "1", - butt = {round: width, square: width, butt: 0}[o.attrs["stroke-linecap"] || params["stroke-linecap"]] || 0, - dashes = [], - i = value.length; - while (i--) { - dashes[i] = value[i] * width + ((i % 2) ? 1 : -1) * butt; - } - $(node, {"stroke-dasharray": dashes.join(",")}); - } - }; + vis = node.style.visibility; + node.style.visibility = "hidden"; for (var att in params) { if (params[has](att)) { if (!R._availableAttrs[has](att)) { @@ -455,7 +458,7 @@ window.Raphael.svg && function (R) { } node.setAttribute(att, value); if (attrs["stroke-dasharray"]) { - addDashes(o, attrs["stroke-dasharray"]); + addDashes(o, attrs["stroke-dasharray"], params); } if (o._.arrows) { "startString" in o._.arrows && addArrow(o, o._.arrows.startString); @@ -463,7 +466,7 @@ window.Raphael.svg && function (R) { } break; case "stroke-dasharray": - addDashes(o, value); + addDashes(o, value, params); break; case "fill": var isURL = Str(value).match(R._ISURL); @@ -554,6 +557,7 @@ window.Raphael.svg && function (R) { } tuneText(o, params); + node.style.visibility = vis; }, leading = 1.2, tuneText = function (el, params) { @@ -686,7 +690,11 @@ window.Raphael.svg && function (R) { SVG.canvas && SVG.canvas.appendChild(el); var p = new Element(el, SVG); p.type = "path"; - setFillAndStroke(p, {fill: "none", stroke: "#000", path: pathString}); + setFillAndStroke(p, { + fill: "none", + stroke: "#000", + path: pathString + }); return p; }; /*\ @@ -965,7 +973,7 @@ window.Raphael.svg && function (R) { #
  • hsba(•••, •••, •••, •••) — same as above, but with opacity
  • #
  • hsl(•••, •••, •••) — almost the same as hsb, see Wikipedia page
  • #
  • hsl(•••%, •••%, •••%) — same as above, but in %
  • - #
  • hsla(•••, •••, •••) — same as above, but with opacity
  • + #
  • hsla(•••, •••, •••, •••) — same as above, but with opacity
  • #
  • Optionally for hsb and hsl you could specify hue as a degree: “hsl(240deg, 1, .5)” or, if you want to go fancy, “hsl(240°, 1, .5)”
  • # \*/ diff --git a/raphael.vml.js b/raphael.vml.js index d8f4498..5582f5c 100644 --- a/raphael.vml.js +++ b/raphael.vml.js @@ -33,7 +33,7 @@ window.Raphael.vml && function (R) { path2vml = function (path) { var total = /[ahqstv]/ig, command = R._pathToAbsolute; - Str(path).match(total) && (command = path2curve); + Str(path).match(total) && (command = R._path2curve); total = /[clmz]/g; if (command == R._pathToAbsolute && !Str(path).match(total)) { var res = Str(path).replace(bites, function (all, command, args) { @@ -333,7 +333,7 @@ window.Raphael.vml && function (R) { var brect = span.getBoundingClientRect(); res.W = a.w = (brect.right - brect.left) / m; res.H = a.h = (brect.bottom - brect.top) / m; - res.paper.canvas.style.display = "none"; + // res.paper.canvas.style.display = "none"; res.X = a.x; res.Y = a.y + res.H / 2; @@ -811,7 +811,12 @@ window.Raphael.vml && function (R) { el.coordsize = zoom + S + zoom; el.coordorigin = "0 0"; var p = new Element(el, vml), - attr = {fill: "#000", stroke: "none", font: availableAttrs.font, text: text}; + attr = { + fill: "#000", + stroke: "none", + font: R._availableAttrs.font, + text: text + }; p.shape = el; p.path = path; p.textpath = o; diff --git a/reference.html b/reference.html index 6dcbbad..db7800f 100644 --- a/reference.html +++ b/reference.html @@ -1,7 +1,7 @@ -Raphaël 2.0 Reference
    1. Animation
    2. Animation.delay()
    3. Animation.repeat()
    4. Element
    5. Element.animate()
    6. Element.animateWith()
    7. Element.attr()
    8. Element.clone()
    9. Element.drag()
    10. Element.getBBox()
    11. Element.getPointAtLength()
    12. Element.getSubpath()
    13. Element.getTotalLength()
    14. Element.glow()
    15. Element.hide()
    16. Element.hover()
    17. Element.id
    18. Element.insertAfter()
    19. Element.insertBefore()
    20. Element.next
    21. Element.node
    22. Element.onDragOver()
    23. Element.paper
    24. Element.pause()
    25. Element.prev
    26. Element.raphael
    27. Element.remove()
    28. Element.resume()
    29. Element.rotate()
    30. Element.scale()
    31. Element.setTime()
    32. Element.show()
    33. Element.status()
    34. Element.stop()
    35. Element.toBack()
    36. Element.toFront()
    37. Element.transform()
    38. Element.translate()
    39. Element.undrag()
    40. Element.unhover()
    41. Matrix
    42. Matrix.add()
    43. Matrix.clone()
    44. Matrix.invert()
    45. Matrix.rotate()
    46. Matrix.scale()
    47. Matrix.split()
    48. Matrix.toTransformString()
    49. Matrix.translate()
    50. Matrix.x()
    51. Matrix.y()
    52. Paper
    53. Paper.bottom
    54. Paper.circle()
    55. Paper.clear()
    56. Paper.customAttributes
    57. Paper.ellipse()
    58. Paper.forEach()
    59. Paper.getById()
    60. Paper.getElementByPoint()
    61. Paper.image()
    62. Paper.path()
    63. Paper.raphael
    64. Paper.rect()
    65. Paper.remove()
    66. Paper.renderfix()
    67. Paper.safari()
    68. Paper.set()
    69. Paper.setFinish()
    70. Paper.setSize()
    71. Paper.setStart()
    72. Paper.setViewBox()
    73. Paper.text()
    74. Paper.top
    75. Raphael()
    76. Raphael.angle()
    77. Raphael.animation()
    78. Raphael.color()
    79. Raphael.deg()
    80. Raphael.easing_formulas
    81. Raphael.el
    82. Raphael.findDotsAtSegment()
    83. Raphael.fn
    84. Raphael.format()
    85. Raphael.fullfill()
    86. Raphael.getColor()
    87. Raphael.getColor.reset()
    88. Raphael.getPointAtLength()
    89. Raphael.getRGB()
    90. Raphael.getSubpath()
    91. Raphael.getTotalLength()
    92. Raphael.hsb()
    93. Raphael.hsb2rgb()
    94. Raphael.hsl()
    95. Raphael.hsl2rgb()
    96. Raphael.is()
    97. Raphael.matrix()
    98. Raphael.ninja()
    99. Raphael.parsePathString()
    100. Raphael.parseTransformString()
    101. Raphael.path2curve()
    102. Raphael.pathToRelative()
    103. Raphael.rad()
    104. Raphael.rgb()
    105. Raphael.rgb2hsb()
    106. Raphael.rgb2hsl()
    107. Raphael.setWindow()
    108. Raphael.snapTo()
    109. Raphael.st
    110. Raphael.svg
    111. Raphael.type
    112. Raphael.vml
    113. Set
    114. Set.forEach()
    115. Set.pop()
    116. Set.push()
    117. eve()
    118. eve.listeners()
    119. eve.nt()
    120. eve.on()
    121. eve.stop()
    122. eve.unbind()
    123. eve.version

    Raphaël 2.0 Reference

     Animation

    -

     Animation.delay(delay)

    +Raphaël 2.0 Reference
    1. Animation
    2. Animation.delay()
    3. Animation.repeat()
    4. Element
    5. Element.animate()
    6. Element.animateWith()
    7. Element.attr()
    8. Element.click()
    9. Element.clone()
    10. Element.data()
    11. Element.dblclick()
    12. Element.drag()
    13. Element.getBBox()
    14. Element.getPointAtLength()
    15. Element.getSubpath()
    16. Element.getTotalLength()
    17. Element.glow()
    18. Element.hide()
    19. Element.hover()
    20. Element.id
    21. Element.insertAfter()
    22. Element.insertBefore()
    23. Element.mousedown()
    24. Element.mousemove()
    25. Element.mouseout()
    26. Element.mouseover()
    27. Element.mouseup()
    28. Element.next
    29. Element.node
    30. Element.onDragOver()
    31. Element.paper
    32. Element.pause()
    33. Element.prev
    34. Element.raphael
    35. Element.remove()
    36. Element.removeData()
    37. Element.resume()
    38. Element.rotate()
    39. Element.scale()
    40. Element.setTime()
    41. Element.show()
    42. Element.status()
    43. Element.stop()
    44. Element.toBack()
    45. Element.toFront()
    46. Element.touchcancel()
    47. Element.touchend()
    48. Element.touchmove()
    49. Element.touchstart()
    50. Element.transform()
    51. Element.translate()
    52. Element.unclick()
    53. Element.undblclick()
    54. Element.undrag()
    55. Element.unhover()
    56. Element.unmousedown()
    57. Element.unmousemove()
    58. Element.unmouseout()
    59. Element.unmouseover()
    60. Element.unmouseup()
    61. Element.untouchcancel()
    62. Element.untouchend()
    63. Element.untouchmove()
    64. Element.untouchstart()
    65. Matrix
    66. Matrix.add()
    67. Matrix.clone()
    68. Matrix.invert()
    69. Matrix.rotate()
    70. Matrix.scale()
    71. Matrix.split()
    72. Matrix.toTransformString()
    73. Matrix.translate()
    74. Matrix.x()
    75. Matrix.y()
    76. Paper
    77. Paper.bottom
    78. Paper.circle()
    79. Paper.clear()
    80. Paper.customAttributes
    81. Paper.ellipse()
    82. Paper.forEach()
    83. Paper.getById()
    84. Paper.getElementByPoint()
    85. Paper.image()
    86. Paper.path()
    87. Paper.raphael
    88. Paper.rect()
    89. Paper.remove()
    90. Paper.renderfix()
    91. Paper.safari()
    92. Paper.set()
    93. Paper.setFinish()
    94. Paper.setSize()
    95. Paper.setStart()
    96. Paper.setViewBox()
    97. Paper.text()
    98. Paper.top
    99. Raphael()
    100. Raphael.angle()
    101. Raphael.animation()
    102. Raphael.color()
    103. Raphael.deg()
    104. Raphael.easing_formulas
    105. Raphael.el
    106. Raphael.findDotsAtSegment()
    107. Raphael.fn
    108. Raphael.format()
    109. Raphael.fullfill()
    110. Raphael.getColor()
    111. Raphael.getColor.reset()
    112. Raphael.getPointAtLength()
    113. Raphael.getRGB()
    114. Raphael.getSubpath()
    115. Raphael.getTotalLength()
    116. Raphael.hsb()
    117. Raphael.hsb2rgb()
    118. Raphael.hsl()
    119. Raphael.hsl2rgb()
    120. Raphael.is()
    121. Raphael.matrix()
    122. Raphael.ninja()
    123. Raphael.parsePathString()
    124. Raphael.parseTransformString()
    125. Raphael.path2curve()
    126. Raphael.pathToRelative()
    127. Raphael.rad()
    128. Raphael.rgb()
    129. Raphael.rgb2hsb()
    130. Raphael.rgb2hsl()
    131. Raphael.setWindow()
    132. Raphael.snapTo()
    133. Raphael.st
    134. Raphael.svg
    135. Raphael.type
    136. Raphael.vml
    137. Set
    138. Set.forEach()
    139. Set.pop()
    140. Set.push()
    141. eve()
    142. eve.listeners()
    143. eve.nt()
    144. eve.on()
    145. eve.stop()
    146. eve.unbind()
    147. eve.version

    Raphaël 2.0 Reference

     Animation

    +

     Animation.delay(delay)

    Creates a copy of existing animation object with given delay.

    Parameters @@ -11,7 +11,7 @@

    number of ms to pass between animation start and actual animation

    Returns: object new altered Animation object

    -

     Animation.repeat(repeat)

    +

     Animation.repeat(repeat)

    Creates a copy of existing animation object with given repetition.

    Parameters @@ -21,8 +21,8 @@

    number iterations of animation. For infinite animation pass Infinity

    Returns: object new altered Animation object

    -

     Element

    -

     Element.animate(…)

    +

     Element

    +

     Element.animate(…)

    Creates and starts animation for given element.

    Parameters @@ -49,7 +49,7 @@

    animation object, see Raphael.animation

    Returns: object original element

    -

     Element.animateWith(…)

    +

     Element.animateWith(…)

    Acts similar to Element.animate, but ensure that given animation runs in sync with another given element.

    Parameters @@ -76,7 +76,7 @@

    animation object, see Raphael.animation

    Returns: object original element

    -

     Element.attr(…)

    +

     Element.attr(…)

    Sets the attributes of the element.

    Parameters @@ -177,9 +177,58 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o

  • hsla(•••, •••, •••) — same as above, but with opacity
  • Optionally for hsb and hsl you could specify hue as a degree: “hsl(240deg, 1, .5)” or, if you want to go fancy, “hsl(240°, 1, .5)”
  • -

     Element.clone()

    +

     Element.click(handler)

    +

    Adds event handler for click for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.clone()

    Returns: object clone of a given element

    -

     Element.drag(onmove, onstart, onend, [mcontext], [scontext], [econtext])

    +

     Element.data(key, [value])

    +

    Adds or retrieves given value asociated with given key. +See also Element.removeData +

    +

    Parameters +

    +
    key
    +
    string
    +
    key to store data
    +
    value
    +
    optional
    +
    any
    +
    value to store
    +
    +

    Returns: object Element

    +

    or, if value is not specified: +

    +

    Returns: any value

    +

    Usage +

    +
    for (var i = 0, i < 5, i++) {
    +    paper.circle(10 + 15 * i, 10, 10)
    +         .attr({fill: "#000"})
    +         .data("i", i)
    +         .click(function () {
    +            alert(this.data("i"));
    +         });
    +}
    +
    +

     Element.dblclick(handler)

    +

    Adds event handler for double click for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.drag(onmove, onstart, onend, [mcontext], [scontext], [econtext])

    Adds event handlers for drag of the element.

    Parameters @@ -229,7 +278,7 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o

    1. eventobjectDOM event object

    Returns: object Element

    -

     Element.getBBox(isWithoutTransform)

    +

     Element.getBBox(isWithoutTransform)

    Return bounding box for a given element

    Parameters @@ -244,7 +293,7 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o

  • width:numberwidth
  • height:numberheight
  • }
  • -

     Element.getPointAtLength(length)

    +

     Element.getPointAtLength(length)

    Return coordinates of the point located at the given length on the given path. Only works for element of “path” type.

    Parameters @@ -258,7 +307,7 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o

  • y:numbery coordinate
  • alpha:numberangle of derivative
  • }
  • -

     Element.getSubpath(from, to)

    +

     Element.getSubpath(from, to)

    Return subpath of a given element from given length to given length. Only works for element of “path” type.

    Parameters @@ -271,11 +320,11 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o

    position of the end of the segment

    Returns: string pathstring for the segment

    -

     Element.getTotalLength()

    +

     Element.getTotalLength()

    Returns length of the path in pixels. Only works for element of “path” type.

    Returns: number length.

    -

     Element.glow([glow])

    +

     Element.glow([glow])

    Return set of elements that create glow-like effect around given element. See Paper.set.

    Note: Glow is not connected to the element. If you change element attributes it won’t adjust itself. @@ -295,11 +344,11 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o

  • colorstringglow colour, default is black
  • }
  • Returns: object Paper.set of elements that represents glow

    -

     Element.hide()

    +

     Element.hide()

    Makes element invisible. See Element.show.

    Returns: object Element

    -

     Element.hover(f_in, f_out, [icontext], [ocontext])

    +

     Element.hover(f_in, f_out, [icontext], [ocontext])

    Adds event handlers for hover for the element.

    Parameters @@ -320,22 +369,72 @@ at 0.25, 0.75. Focus point coordinates are in 0..1 range. Radial gradients can o

    context for hover out handler

    Returns: object Element

    -

     Element.id

    +

     Element.id

    number

    Unique id of the element. Especially usesful when you want to listen to events of the element, because all events are fired in format <module>.<action>.<id>. Also useful for Paper.getById method.

    -

     Element.insertAfter()

    +

     Element.insertAfter()

    Inserts current object after the given one.

    Returns: object Element

    -

     Element.insertBefore()

    +

     Element.insertBefore()

    Inserts current object before the given one.

    Returns: object Element

    -

     Element.next

    +

     Element.mousedown(handler)

    +

    Adds event handler for mousedown for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.mousemove(handler)

    +

    Adds event handler for mousemove for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.mouseout(handler)

    +

    Adds event handler for mouseout for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.mouseover(handler)

    +

    Adds event handler for mouseover for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.mouseup(handler)

    +

    Adds event handler for mouseup for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.next

    object

    Reference to the next element in the hierarchy.

    -

     Element.node

    +

     Element.node

    object

    Gives you a reference to the DOM object, so you can assign event handlers or just mess around. Note: Don’t mess with it.

    @@ -347,7 +446,7 @@ c.node.onclick = function () { c.attr("fill", "red"); }; -

     Element.onDragOver(f)

    +

     Element.onDragOver(f)

    Shortcut for assigning event handler for drag.over.<id> event, where id is id of the element (see Element.id).

    Parameters @@ -356,7 +455,7 @@ c.node.onclick = function () {

    function
    handler for event
    -

     Element.paper

    +

     Element.paper

    object

    Internal reference to “paper” where object drawn. Mainly for use in plugins and element extensions.

    Usage @@ -367,7 +466,7 @@ c.node.onclick = function () { .attr({stroke: "red"}); } -

     Element.pause([anim])

    +

     Element.pause([anim])

    Stops animation of the element with ability to resume it later on.

    Parameters @@ -378,10 +477,10 @@ c.node.onclick = function () {

    animation object

    Returns: object original element

    -

     Element.prev

    +

     Element.prev

    object

    Reference to the previous element in the hierarchy.

    -

     Element.raphael

    +

     Element.raphael

    object

    Internal reference to Raphael object. In case it is not available.

    Usage @@ -392,10 +491,22 @@ c.node.onclick = function () { this.attr({fill: this.paper.raphael.hsb2rgb(hsb).hex}); } -

     Element.remove()

    +

     Element.remove()

    Removes element form the paper.

    -

     Element.resume([anim])

    +

     Element.removeData([key])

    +

    Removes value associated with an element by given key. +If key is not provided, removes all the data of the element. +

    +

    Parameters +

    +
    key
    +
    optional
    +
    string
    +
    key
    +
    +

    Returns: object Element

    +

     Element.resume([anim])

    Resumes animation if it was paused with Element.pause method.

    Parameters @@ -406,7 +517,7 @@ c.node.onclick = function () {

    animation object

    Returns: object original element

    -

     Element.rotate(deg, [cx], [cy])

    +

     Element.rotate(deg, [cx], [cy])

    Adds rotation by given angle around given point to the list of transformations of the element.

    @@ -427,7 +538,7 @@ transformations of the element.

    If cx & cy aren’t specified centre of the shape is used as a point of rotation.

    Returns: object Element

    -

     Element.scale(sx, sy, [cx], [cy])

    +

     Element.scale(sx, sy, [cx], [cy])

    Adds scale by given amount relative to given point to the list of transformations of the element.

    @@ -451,7 +562,7 @@ transformations of the element.

    If cx & cy aren’t specified centre of the shape is used instead.

    Returns: object Element

    -

     Element.setTime(anim, value)

    +

     Element.setTime(anim, value)

    Sets the status of animation of the element in milliseconds. Similar to Element.status method.

    Parameters @@ -468,11 +579,11 @@ transformations of the element.

    On each animation frame event anim.frame.<id>, on start anim.start.<id> and on end anim.finish.<id>.

    -

     Element.show()

    +

     Element.show()

    Makes element visible. See Element.hide.

    Returns: object Element

    -

     Element.status([anim], [value])

    +

     Element.status([anim], [value])

    Gets or sets the status of animation of the element.

    Parameters @@ -496,7 +607,7 @@ transformations of the element.

    or

    Returns: object original element if value is specified

    -

     Element.stop([anim])

    +

     Element.stop([anim])

    Stops animation of the element.

    Parameters @@ -507,15 +618,55 @@ transformations of the element.

    animation object

    Returns: object original element

    -

     Element.toBack()

    +

     Element.toBack()

    Moves the element so it is the furthest from the viewer’s eyes, behind other elements.

    Returns: object Element

    -

     Element.toFront()

    +

     Element.toFront()

    Moves the element so it is the closest to the viewer’s eyes, on top of other elements.

    Returns: object Element

    -

     Element.transform([tstr])

    +

     Element.touchcancel(handler)

    +

    Adds event handler for touchcancel for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.touchend(handler)

    +

    Adds event handler for touchend for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.touchmove(handler)

    +

    Adds event handler for touchmove for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.touchstart(handler)

    +

    Adds event handler for touchstart for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.transform([tstr])

    Adds transformation to the element which is separate to other attributes, i.e. translation doesn’t change x or y of the rectange. The format of transformation string is similar to the path string syntax: @@ -558,7 +709,7 @@ console.log(el.transform());

    else

    Returns: object Element

    -

     Element.translate(dx, dy)

    +

     Element.translate(dx, dy)

    Adds translation by given amount to the list of transformations of the element.

    Parameters @@ -571,10 +722,30 @@ console.log(el.transform());

    vertical shift

    Returns: object Element

    -

     Element.undrag()

    +

     Element.unclick(handler)

    +

    Removes event handler for click for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.undblclick(handler)

    +

    Removes event handler for double click for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.undrag()

    Removes all drag event handlers from given element.

    -

     Element.unhover(f_in, f_out)

    +

     Element.unhover(f_in, f_out)

    Removes event handlers for hover for the element.

    Parameters @@ -587,8 +758,98 @@ console.log(el.transform());

    handler for hover out

    Returns: object Element

    -

     Matrix

    -

     Matrix.add(a, b, c, d, e, f, matrix)

    +

     Element.unmousedown(handler)

    +

    Removes event handler for mousedown for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.unmousemove(handler)

    +

    Removes event handler for mousemove for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.unmouseout(handler)

    +

    Removes event handler for mouseout for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.unmouseover(handler)

    +

    Removes event handler for mouseover for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.unmouseup(handler)

    +

    Removes event handler for mouseup for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.untouchcancel(handler)

    +

    Removes event handler for touchcancel for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.untouchend(handler)

    +

    Removes event handler for touchend for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.untouchmove(handler)

    +

    Removes event handler for touchmove for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Element.untouchstart(handler)

    +

    Removes event handler for touchstart for the element. +

    +

    Parameters +

    +
    handler
    +
    function
    +
    handler for the event
    +
    +

    Returns: object Element

    +

     Matrix

    +

     Matrix.add(a, b, c, d, e, f, matrix)

    Adds given matrix to existing one.

    Parameters @@ -615,15 +876,15 @@ console.log(el.transform());

    object
    Matrix
    -

     Matrix.clone()

    +

     Matrix.clone()

    Returns copy of the matrix

    Returns: object Matrix

    -

     Matrix.invert()

    +

     Matrix.invert()

    Returns inverted version of the matrix

    Returns: object Matrix

    -

     Matrix.rotate(a, x, y)

    +

     Matrix.rotate(a, x, y)

    Rotates the matrix

    Parameters @@ -638,7 +899,7 @@ console.log(el.transform());

    number
     
    -

     Matrix.scale(x, [y], [cx], [cy])

    +

     Matrix.scale(x, [y], [cx], [cy])

    Scales the matrix

    Parameters @@ -659,7 +920,7 @@ console.log(el.transform());

    number
     
    -

     Matrix.split()

    +

     Matrix.split()

    Splits matrix into primitive transformations

    Returns: object in format:

    @@ -671,11 +932,11 @@ console.log(el.transform());
  • rotatenumberrotation in deg
  • isSimplebooleancould it be represented via simple transformations -
  •  Matrix.toTransformString()

    +

     Matrix.toTransformString()

    Return transform string that represents given matrix

    Returns: string transform string

    -

     Matrix.translate(x, y)

    +

     Matrix.translate(x, y)

    Translate the matrix

    Parameters @@ -687,7 +948,7 @@ console.log(el.transform());

    number
     
    -

     Matrix.x(x, y)

    +

     Matrix.x(x, y)

    Return x coordinate for given point after transformation described by the matrix. See also Matrix.y

    Parameters @@ -700,7 +961,7 @@ console.log(el.transform());

     

    Returns: number x

    -

     Matrix.y(x, y)

    +

     Matrix.y(x, y)

    Return y coordinate for given point after transformation described by the matrix. See also Matrix.x

    Parameters @@ -713,11 +974,11 @@ console.log(el.transform());

     

    Returns: number y

    -

     Paper

    -

     Paper.bottom

    +

     Paper

    +

     Paper.bottom

    Points to the bottom element on the paper

    -

     Paper.circle(x, y, r)

    +

     Paper.circle(x, y, r)

    Draws a circle.

    Parameters @@ -737,10 +998,10 @@ console.log(el.transform());

    var c = paper.circle(50, 50, 40);
     
    -

     Paper.clear()

    +

     Paper.clear()

    Clears the paper, i.e. removes all the elements.

    -

     Paper.customAttributes

    +

     Paper.customAttributes

    object

    If you have a set of attributes that you would like to represent as a function of some number you can do it easily with custom attributes:

    @@ -765,7 +1026,7 @@ paper.customAttributes.hsb = function (h, s, b) { c.attr({hsb: ".5 .8 1"}); c.animate({hsb: "1 0 .5"}, 1e3); -

     Paper.ellipse(x, y, rx, ry)

    +

     Paper.ellipse(x, y, rx, ry)

    Draws an ellipse.

    Parameters @@ -788,7 +1049,7 @@ c.animate({hsb: "1 0

    var c = paper.ellipse(50, 50, 40, 20);
     
    -

     Paper.forEach(callback, thisArg)

    +

     Paper.forEach(callback, thisArg)

    Executes given function for each element on the paper

    If callback function returns false it will stop loop running. @@ -803,7 +1064,7 @@ c.animate({hsb: "1 0 context object for the callback

    Returns: object Paper object

    -

     Paper.getById(id)

    +

     Paper.getById(id)

    Returns you element by its internal ID.

    Parameters @@ -813,7 +1074,7 @@ c.animate({hsb: "1 0 id

    Returns: object Raphaël element object

    -

     Paper.getElementByPoint(x, y)

    +

     Paper.getElementByPoint(x, y)

    Returns you topmost element under given point.

    Returns: object Raphaël element object

    @@ -830,7 +1091,7 @@ c.animate({hsb: "1 0
    paper.getElementByPoint(mouseX, mouseY).attr({stroke: "#f00"});
     
    -

     Paper.image(src, x, y, width, height)

    +

     Paper.image(src, x, y, width, height)

    Embeds an image into the surface.

    Parameters @@ -856,7 +1117,7 @@ c.animate({hsb: "1 0

    var c = paper.image("apple.png", 10, 10, 80, 80);
     
    -

     Paper.path(pathString)

    +

     Paper.path(pathString)

    Creates a path element by given path data string.

    Parameters @@ -873,10 +1134,10 @@ Details of a path's data attribute's format are described in the // draw a diagonal line: // move to 10,10, line to 90,90 -

     Paper.raphael

    +

     Paper.raphael

    Points to the Raphael object/function

    -

     Paper.rect(x, y, width, height, [r])

    +

     Paper.rect(x, y, width, height, [r])

    Draws a rectangle.

    @@ -907,20 +1168,20 @@ Details of a path's data attribute's format are described in the // rectangle with rounded corners var c = paper.rect(40, 40, 50, 50, 10); -

     Paper.remove()

    +

     Paper.remove()

    Removes the paper from the DOM.

    -

     Paper.renderfix()

    +

     Paper.renderfix()

    Fixes the issue of Firefox and IE9 regarding subpixel rendering. If paper is dependant on other elements after reflow it could shift half pixel which cause for lines to lost their crispness. This method fixes the issue.

    -

     Paper.safari()

    +

     Paper.safari()

    There is an inconvenient rendering bug in Safari (WebKit): sometimes the rendering should be forced. This method should help with dealing with this bug.

    -

     Paper.set()

    +

     Paper.set()

    Creates array-like object to keep and operate several elements at once. Warning: it doesn’t create any elements for itself in the page, it just groups existing elements. Sets act as pseudo elements — all methods available to an element can be used on a set. @@ -935,11 +1196,11 @@ st.push( ); st.attr({fill: "red"}); // changes the fill of both circles -

     Paper.setFinish()

    +

     Paper.setFinish()

    See Paper.setStart. This method finishes catching and returns resulting set.

    Returns: object set

    -

     Paper.setSize(width, height)

    +

     Paper.setSize(width, height)

    If you need to change dimensions of the canvas call this method

    Parameters @@ -960,7 +1221,7 @@ st.push( ); st.attr({fill: "red"}); -

     Paper.setStart()

    +

     Paper.setStart()

    Creates Paper.set. All elements that will be created after calling this method and before calling Paper.setFinish will be added to the set.

    @@ -972,7 +1233,7 @@ paper.circle(30, 10, = paper.setFinish(); st.attr({fill: "red"}); // changes the fill of both circles -

     Paper.setViewBox(x, y, w, h, fit)

    +

     Paper.setViewBox(x, y, w, h, fit)

    Sets the view box of the paper. Practically it gives you ability to zoom and pan whole paper surface by specifying new boundaries.

    @@ -994,7 +1255,7 @@ specifying new boundaries.
    boolean
    true if you want graphics to fit into new boundary box
    -

     Paper.text(x, y, text)

    +

     Paper.text(x, y, text)

    Draws a text string. If you need line breaks, put “\n” in the string.

    Parameters @@ -1014,10 +1275,10 @@ specifying new boundaries.

    var t = paper.text(50, 50, "Raphaël\nkicks\nbutt!");
     
    -

     Paper.top

    +

     Paper.top

    Points to the topmost element on the paper

    -

     Raphael(…)

    +

     Raphael(…)

    Creates a canvas object on which to draw. You must do this first, as all future calls to drawing methods from this instance will be bound to this canvas. @@ -1100,7 +1361,7 @@ from this instance will be bound to this canvas. text: "Dump" }]); -

     Raphael.angle(x1, y1, x2, y2, [x3], [y3])

    +

     Raphael.angle(x1, y1, x2, y2, [x3], [y3])

    Returns angle between two or three points

    Parameters @@ -1127,7 +1388,7 @@ from this instance will be bound to this canvas.

    y coord of third point

    Returns: number angle in degrees.

    -

     Raphael.animation(params, ms, [easing], [callback])

    +

     Raphael.animation(params, ms, [easing], [callback])

    Creates an animation object that can be passed to the Element.animate or Element.animateWith methods. See also Animation.delay and Animation.repeat methods.

    @@ -1149,7 +1410,7 @@ See also Animation.delay and callback function. Will be called at the end of animation.

    Returns: object Animation

    -

     Raphael.color(clr)

    +

     Raphael.color(clr)

    Parses the color string and returns object with all values for the given color.

    Parameters @@ -1169,7 +1430,7 @@ See also Animation.delay and vnumbervalue (brightness),

  • lnumberlightness
  • }
  • -

     Raphael.deg(deg)

    +

     Raphael.deg(deg)

    Transform angle to degrees

    Parameters @@ -1179,7 +1440,7 @@ See also Animation.delay and angle in radians

    Returns: number angle in degrees.

    -

     Raphael.easing_formulas

    +

     Raphael.easing_formulas

    Object that contains easing formulas for animation. You could extend it with your own. By default it has following list of easing:

    See also Easing demo.

    -

     Raphael.el

    +

     Raphael.el

    object

    You can add your own method to elements. This is usefull when you want to hack default functionality or want to wrap some common transformation or attributes in one method. In difference to canvas methods, you can redefine element method at any time. Expending element methods wouldn’t affect set. @@ -1206,7 +1467,7 @@ you can redefine element method at any time. Expending element methods wouldn’ // then use it paper.circle(100, 100, 20).red(); -

     Raphael.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t)

    +

     Raphael.findDotsAtSegment(p1x, p1y, c1x, c1y, c2x, c2y, p2x, p2y, t)

    Utility method Find dot coordinates on the given cubic bezier curve at the given t.

    @@ -1253,7 +1514,7 @@ Find dot coordinates on the given cubic bezier curve at the given t.
  • y:numbery coordinate of the end of the curve
  • }
  • alpha:numberangle of the curve derivative at the point
  • }
  • -

     Raphael.fn

    +

     Raphael.fn

    object

    You can add your own method to the canvas. For example if you want to draw a pie chart, you can create your own pie chart function and ship it as a Raphaël plugin. To do this you need to extend the Raphael.fn object. Please note that you can create your own namespaces @@ -1277,7 +1538,7 @@ paper.arrow(10, 10,  Raphael.format(token, …) +

     Raphael.format(token, …)

    Simple format function. Replaces construction of type “{<number>}” to the corresponding argument.

    Parameters @@ -1299,7 +1560,7 @@ paper.mystuff.star(); // this will draw a rectangular shape equivalent to "M10,20h40v50h-40z" paper.path(Raphael.format("M{1},{2}h{3}v{4}h{5}z", x, y, width, height, -width)); -

     Raphael.fullfill(token, json)

    +

     Raphael.fullfill(token, json)

    A little bit more advanced format function than Raphael.format. Replaces construction of type “{<name>}” to the corresponding argument.

    Parameters @@ -1325,7 +1586,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w } })); -

     Raphael.getColor([value])

    +

     Raphael.getColor([value])

    On each call returns next colour in the spectrum. To reset it back to red call Raphael.getColor.reset

    Parameters @@ -1336,10 +1597,10 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

    brightness, default is 0.75

    Returns: string hex representation of the colour.

    -

     Raphael.getColor.reset()

    +

     Raphael.getColor.reset()

    Resets spectrum position for Raphael.getColor back to red.

    -

     Raphael.getPointAtLength(path, length)

    +

     Raphael.getPointAtLength(path, length)

    Return coordinates of the point located at the given length on the given path.

    Parameters @@ -1356,7 +1617,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

  • y:numbery coordinate
  • alpha:numberangle of derivative
  • }
  • -

     Raphael.getRGB(colour)

    +

     Raphael.getRGB(colour)

    Parses colour string as RGB object

    Parameters @@ -1383,7 +1644,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

  • hexstringcolor in HTML/CSS format: #••••••,
  • errorbooleantrue if string can’t be parsed
  • }
  • -

     Raphael.getSubpath(path, from, to)

    +

     Raphael.getSubpath(path, from, to)

    Return subpath of a given path from given length to given length.

    Parameters @@ -1399,7 +1660,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

    position of the end of the segment

    Returns: string pathstring for the segment

    -

     Raphael.getTotalLength(path)

    +

     Raphael.getTotalLength(path)

    Returns length of the given path in pixels.

    Parameters @@ -1409,7 +1670,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

    SVG path string.

    Returns: number length.

    -

     Raphael.hsb(h, s, b)

    +

     Raphael.hsb(h, s, b)

    Converts HSB values to hex representation of the colour.

    Parameters @@ -1425,7 +1686,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

    value or brightness

    Returns: string hex representation of the colour.

    -

     Raphael.hsb2rgb(h, s, v)

    +

     Raphael.hsb2rgb(h, s, v)

    Converts HSB values to RGB object.

    Parameters @@ -1446,7 +1707,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

  • bnumberblue,
  • hexstringcolor in HTML/CSS format: #••••••
  • }
  • -

     Raphael.hsl(h, s, l)

    +

     Raphael.hsl(h, s, l)

    Converts HSL values to hex representation of the colour.

    Parameters @@ -1462,7 +1723,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

    luminosity

    Returns: string hex representation of the colour.

    -

     Raphael.hsl2rgb(h, s, l)

    +

     Raphael.hsl2rgb(h, s, l)

    Converts HSL values to RGB object.

    Parameters @@ -1483,7 +1744,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

  • bnumberblue,
  • hexstringcolor in HTML/CSS format: #••••••
  • }
  • -

     Raphael.is(o, type)

    +

     Raphael.is(o, type)

    Handfull replacement for typeof operator.

    Parameters @@ -1496,7 +1757,7 @@ paper.path(Raphael.format("M{x},{y}h{dim.width}v{dim.height}h{dim['negative w

    name of the type, i.e. “string”, “function”, “number”, etc.

    Returns: boolean is given value is of given type

    -

     Raphael.matrix(a, b, c, d, e, f)

    +

     Raphael.matrix(a, b, c, d, e, f)

    Utility method Returns matrix based on given parameters.

    @@ -1522,7 +1783,7 @@ Returns matrix based on given parameters.
     

    Returns: object Matrix

    -

     Raphael.ninja()

    +

     Raphael.ninja()

    If you want to leave no trace of Raphaël (Well, Raphaël creates only one global variable Raphael, but anyway.) You can use ninja method. Beware, that in this case plugins could stop working, because they are depending on global variable existance.

    @@ -1534,7 +1795,7 @@ Beware, that in this case plugins could stop working, because they are depending … })(Raphael.ninja()); -

     Raphael.parsePathString(pathString)

    +

     Raphael.parsePathString(pathString)

    Utility method Parses given path string into an array of arrays of path segments.

    @@ -1545,7 +1806,7 @@ Parses given path string into an array of arrays of path segments.
    path string or array of segments (in the last case it will be returned straight away)

    Returns: array array of segments.

    -

     Raphael.parseTransformString(TString)

    +

     Raphael.parseTransformString(TString)

    Utility method Parses given path string into an array of transformations.

    @@ -1556,7 +1817,7 @@ Parses given path string into an array of transformations.
    transform string or array of transformations (in the last case it will be returned straight away)

    Returns: array array of transformations.

    -

     Raphael.path2curve(pathString)

    +

     Raphael.path2curve(pathString)

    Utility method Converts path to a new path where all segments are cubic bezier curves.

    @@ -1567,7 +1828,7 @@ Converts path to a new path where all segments are cubic bezier curves.
    path string or array of segments

    Returns: array array of segments.

    -

     Raphael.pathToRelative(pathString)

    +

     Raphael.pathToRelative(pathString)

    Utility method Converts path to relative form

    @@ -1578,7 +1839,7 @@ Converts path to relative form
    path string or array of segments

    Returns: array array of segments.

    -

     Raphael.rad(deg)

    +

     Raphael.rad(deg)

    Transform angle to radians

    Parameters @@ -1588,7 +1849,7 @@ Converts path to relative form

    angle in degrees

    Returns: number angle in radians.

    -

     Raphael.rgb(r, g, b)

    +

     Raphael.rgb(r, g, b)

    Converts RGB values to hex representation of the colour.

    Parameters @@ -1604,7 +1865,7 @@ Converts path to relative form

    blue

    Returns: string hex representation of the colour.

    -

     Raphael.rgb2hsb(r, g, b)

    +

     Raphael.rgb2hsb(r, g, b)

    Converts RGB values to HSB object.

    Parameters @@ -1624,7 +1885,7 @@ Converts path to relative form

  • snumbersaturation
  • bnumberbrightness
  • }
  • -

     Raphael.rgb2hsl(r, g, b)

    +

     Raphael.rgb2hsl(r, g, b)

    Converts RGB values to HSL object.

    Parameters @@ -1644,7 +1905,7 @@ Converts path to relative form

  • snumbersaturation
  • lnumberluminosity
  • }
  • -

     Raphael.setWindow(newwin)

    +

     Raphael.setWindow(newwin)

    Used when you need to draw in <iframe>. Switched window to the iframe one.

    Parameters @@ -1653,7 +1914,7 @@ Converts path to relative form

    window
    new window object
    -

     Raphael.snapTo(values, value, [tolerance])

    +

     Raphael.snapTo(values, value, [tolerance])

    Snaps given value to given grid.

    Parameters @@ -1670,7 +1931,7 @@ Converts path to relative form

    tolerance for snapping. Default is 10.

    Returns: number adjusted value.

    -

     Raphael.st

    +

     Raphael.st

    object

    You can add your own method to elements and sets. It is wise to add a set method for each element method you added, so you will be able to call the same method on sets too. See also Raphael.el. @@ -1688,17 +1949,17 @@ Raphael.st.red = function () { // then use it paper.set(paper.circle(100, 100, 20), paper.circle(110, 100, 20)).red(); -

     Raphael.svg

    +

     Raphael.svg

    boolean

    true if browser supports SVG.

    -

     Raphael.type

    +

     Raphael.type

    string

    Can be “SVG”, “VML” or empty, depending on browser support.

    -

     Raphael.vml

    +

     Raphael.vml

    boolean

    true if browser supports VML.

    -

     Set

    -

     Set.forEach(callback, thisArg)

    +

     Set

    +

     Set.forEach(callback, thisArg)

    Executes given function for each element in the set.

    If function returns false it will stop loop running. @@ -1713,15 +1974,15 @@ paper.set(paper.circle(100, 100, <

    context object for the callback

    Returns: object Set object

    -

     Set.pop()

    +

     Set.pop()

    Removes last element and returns it.

    Returns: object element

    -

     Set.push()

    +

     Set.push()

    Adds each argument to the current set.

    Returns: object original element

    -

     eve(name, scope, varargs)

    +

     eve(name, scope, varargs)

    Fires event with given name, given scope and other parameters.

    Arguments @@ -1736,8 +1997,8 @@ paper.set(paper.circle(100, 100, <

    ...
    the rest of arguments will be sent to event handlers
    -

    Returns: boolean false if any of callbacks return false, true otherwise

    -

     eve.listeners(name)

    +

    Returns: object array of returned values from the listeners

    +

     eve.listeners(name)

    Internal method which gives you array of all event handlers that will be triggered by the given name.

    Arguments @@ -1747,7 +2008,7 @@ paper.set(paper.circle(100, 100, <

    name of the event, dot (.) or slash (/) separated

    Returns: array array of event handlers

    -

     eve.nt([subname])

    +

     eve.nt([subname])

    Could be used inside event handler to figure out actual name of the event.

    Arguments @@ -1761,7 +2022,7 @@ paper.set(paper.circle(100, 100, <

    or

    Returns: boolean true, if current event’s name contains subname

    -

     eve.on(name, f)

    +

     eve.on(name, f)

    Binds given event handler with a given name. You can use wildcards “*” for the names:

    eve.on("*.under.*", f);
    @@ -1789,10 +2050,10 @@ eve.on("mouse", catch)(1);
     If you want to put you hadler before not indexed handlers specify negative value.
     Note: I assume most of the time you don’t need to worry about z-index, but it’s nice to have this feature “just in case”.
     

    -

     eve.stop()

    +

     eve.stop()

    Is used inside event handler to stop event

    -

     eve.unbind(name, f)

    +

     eve.unbind(name, f)

    Removes given function from the list of event listeners assigned to given name.

    Arguments @@ -1804,7 +2065,7 @@ Note: I assume most of the time you don’t need to worry about z-index, but it

    function
    event handler function
    -

     eve.version

    +

     eve.version

    string

    Current version of the library.

    -
    \ No newline at end of file +
    \ No newline at end of file -- 2.39.2