Revision 1298:4f746d8966dd .svn/pristine/4f

View differences:

.svn/pristine/4f/4f4249c007fe05ae60a997c7b935c55203608b2e.svn-base
1
/*
2
 * Raphael 1.5.2 - JavaScript Vector Library
3
 *
4
 * Copyright (c) 2010 Dmitry Baranovskiy (http://raphaeljs.com)
5
 * Licensed under the MIT (http://raphaeljs.com/license.html) license.
6
 */
7
(function(){function cC(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(B(f)<b)return e;j=(3*i*e+2*h)*e+g;if(B(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(B(f-a)<b)return e;a>f?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 cB(b){return function(c,d,e,f){var g={back:b};a.is(e,"function")?f=e:g.rot=e,c&&c.constructor==bN&&(c=c.attrs.path),c&&(g.along=c);return this.animate(g,d,f)}}function cp(){return this.x+q+this.y}function bm(a,b,c){function d(){var g=Array[e].slice.call(arguments,0),h=g[v]("►"),i=d.cache=d.cache||{},j=d.count=d.count||[];if(i[f](h))return c?c(i[h]):i[h];j[w]>=1e3&&delete i[j.shift()],j[L](h),i[h]=a[m](b,g);return c?c(i[h]):i[h]}return d}function bh(){var a=[],b=0;for(;b<32;b++)a[b]=(~~(y.random()*16))[H](16);a[12]=4,a[16]=(a[16]&3|8)[H](16);return"r-"+a[v]("")}function a(){if(a.is(arguments[0],G)){var b=arguments[0],d=bV[m](a,b.splice(0,3+a.is(b[0],E))),e=d.set();for(var g=0,h=b[w];g<h;g++){var i=b[g]||{};c[f](i.type)&&e[L](d[i.type]().attr(i))}return e}return bV[m](a,arguments)}a.version="1.5.2";var b=/[, ]+/,c={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},d=/\{(\d+)\}/g,e="prototype",f="hasOwnProperty",g=document,h=window,i={was:Object[e][f].call(h,"Raphael"),is:h.Raphael},j=function(){this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in g,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend orientationchange touchcancel gesturestart gesturechange gestureend"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v="join",w="length",x=r[e].toLowerCase,y=Math,z=y.max,A=y.min,B=y.abs,C=y.pow,D=y.PI,E="number",F="string",G="array",H="toString",I="fill",J=Object[e][H],K={},L="push",M=/^url\(['"]?([^\)]+?)['"]?\)$/i,N=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,O={NaN:1,Infinity:1,"-Infinity":1},P=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,Q=y.round,R="setAttribute",S=parseFloat,T=parseInt,U=" progid:DXImageTransform.Microsoft",V=r[e].toUpperCase,W={blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/",opacity:1,path:"M0,0",r:0,rotation:0,rx:0,ry:0,scale:"1 1",src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",translation:"0 0",width:0,x:0,y:0},X={along:"along",blur:E,"clip-rect":"csv",cx:E,cy:E,fill:"colour","fill-opacity":E,"font-size":E,height:E,opacity:E,path:"path",r:E,rotation:"csv",rx:E,ry:E,scale:"csv",stroke:"colour","stroke-opacity":E,"stroke-width":E,translation:"csv",width:E,x:E,y:E},Y="replace",Z=/^(from|to|\d+%?)$/,$=/\s*,\s*/,_={hs:1,rg:1},ba=/,?([achlmqrstvxz]),?/gi,bb=/([achlmqstvz])[\s,]*((-?\d*\.?\d*(?:e[-+]?\d+)?\s*,?\s*)+)/ig,bc=/(-?\d*\.?\d*(?:e[-+]?\d+)?)\s*,?\s*/ig,bd=/^r(?:\(([^,]+?)\s*,\s*([^\)]+?)\))?/,be=function(a,b){return a.key-b.key};a.type=h.SVGAngle||g.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bf=g.createElement("div"),bg;bf.innerHTML='<v:shape adj="1"/>',bg=bf.firstChild,bg.style.behavior="url(#default#VML)";if(!bg||typeof bg.adj!="object")return a.type=null;bf=null}a.svg=!(a.vml=a.type=="VML"),j[e]=a[e],k=j[e],a._id=0,a._oid=0,a.fn={},a.is=function(a,b){b=x.call(b);if(b=="finite")return!O[f](+a);return b=="null"&&a===null||b==typeof a||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||J.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((h<0)*180+y.atan(-i/-h)*180/D+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*D/180},a.deg=function(a){return a*180/D%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,G)){var e=b.length;while(e--)if(B(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c},a.setWindow=function(a){h=a,g=h.document};var bi=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var h=d.createTextRange();bi=bm(function(a){try{d.style.color=r(a)[Y](c,p);var b=h.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b[H](16)).slice(-6)}catch(e){return"none"}})}else{var i=g.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",g.body[l](i),bi=bm(function(a){i.style.color=a;return g.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bi(b)},bj=function(){return"hsb("+[this.h,this.s,this.b]+")"},bk=function(){return"hsl("+[this.h,this.s,this.l]+")"},bl=function(){return this.hex};a.hsb2rgb=function(b,c,d,e){a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b&&(d=b.b,c=b.s,b=b.h,e=b.o);return a.hsl2rgb(b,c,d/2,e)},a.hsl2rgb=function(b,c,d,e){a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b&&(d=b.l,c=b.s,b=b.h);if(b>1||c>1||d>1)b/=360,c/=100,d/=100;var f={},g=["r","g","b"],h,i,j,k,l,m;if(!c)f={r:d,g:d,b:d};else{d<.5?h=d*(1+c):h=d+c-d*c,i=2*d-h;for(var n=0;n<3;n++)j=b+1/3*-(n-1),j<0&&j++,j>1&&j--,j*6<1?f[g[n]]=i+(h-i)*6*j:j*2<1?f[g[n]]=h:j*3<2?f[g[n]]=i+(h-i)*(2/3-j)*6:f[g[n]]=i}f.r*=255,f.g*=255,f.b*=255,f.hex="#"+(16777216|f.b|f.g<<8|f.r<<16).toString(16).slice(1),a.is(e,"finite")&&(f.opacity=e),f.toString=bl;return f},a.rgb2hsb=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,F)){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;var f=z(b,c,d),g=A(b,c,d),h,i,j=f;if(g==f)return{h:0,s:0,b:f,toString:bj};var k=f-g;i=k/f,b==f?h=(c-d)/k:c==f?h=2+(d-b)/k:h=4+(b-c)/k,h/=6,h<0&&h++,h>1&&h--;return{h:h,s:i,b:j,toString:bj}},a.rgb2hsl=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,F)){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;var f=z(b,c,d),g=A(b,c,d),h,i,j=(f+g)/2,k;if(g==f)k={h:0,s:0,l:j};else{var l=f-g;i=j<.5?l/(f+g):l/(2-f-g),b==f?h=(c-d)/l:c==f?h=2+(d-b)/l:h=4+(b-c)/l,h/=6,h<0&&h++,h>1&&h--,k={h:h,s:i,l:j}}k.toString=bk;return k},a._path2string=function(){return this.join(",")[Y](ba,"$1")},a.getRGB=bm(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none"};!_[f](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bi(b));var c,d,e,g,h,i,j,k=b.match(N);if(k){k[2]&&(g=T(k[2].substring(5),16),e=T(k[2].substring(3,5),16),d=T(k[2].substring(1,3),16)),k[3]&&(g=T((i=k[3].charAt(3))+i,16),e=T((i=k[3].charAt(2))+i,16),d=T((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s]($),d=S(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=S(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=S(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=S(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s]($),d=S(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=S(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=S(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=S(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,g,h)}if(k[6]){j=k[6][s]($),d=S(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=S(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),g=S(j[2]),j[2].slice(-1)=="%"&&(g*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=S(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,g,h)}k={r:d,g:e,b:g},k.hex="#"+(16777216|g|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}},a),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=bm(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,G)&&a.is(b[0],G)&&(d=bo(b)),d[w]||r(b)[Y](bb,function(a,b,e){var f=[],g=x.call(b);e[Y](bc,function(a,b){b&&f[L](+b)}),g=="m"&&f[w]>2&&(d[L]([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");while(f[w]>=c[g]){d[L]([b][n](f.splice(0,c[g])));if(!c[g])break}}),d[H]=a._path2string;return d}),a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,l=C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(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-y.atan((m-o)/(n-p))*180/D;(m>o||n<p)&&(u+=180);return{x:k,y:l,m:{x:m,y:n},n:{x:o,y:p},start:{x:q,y:r},end:{x:s,y:t},alpha:u}};var bn=bm(function(a){if(!a)return{x:0,y:0,width:0,height:0};a=bw(a);var b=0,c=0,d=[],e=[],f;for(var g=0,h=a[w];g<h;g++){f=a[g];if(f[0]=="M")b=f[1],c=f[2],d[L](b),e[L](c);else{var i=bv(b,c,f[1],f[2],f[3],f[4],f[5],f[6]);d=d[n](i.min.x,i.max.x),e=e[n](i.min.y,i.max.y),b=f[5],c=f[6]}}var j=A[m](0,d),k=A[m](0,e);return{x:j,y:k,width:z[m](0,d)-j,height:z[m](0,e)-k}}),bo=function(b){var c=[];if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);for(var d=0,e=b[w];d<e;d++){c[d]=[];for(var f=0,g=b[d][w];f<g;f++)c[d][f]=b[d][f]}c[H]=a._path2string;return c},bp=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=b[0][1],e=b[0][2],f=d,g=e,h++,c[L](["M",d,e]));for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=x.call(l[0])){k[0]=x.call(l[0]);switch(k[0]){case"a":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]-d).toFixed(3),k[7]=+(l[7]-e).toFixed(3);break;case"v":k[1]=+(l[1]-e).toFixed(3);break;case"m":f=l[1],g=l[2];default:for(var m=1,n=l[w];m<n;m++)k[m]=+(l[m]-(m%2?d:e)).toFixed(3)}}else{k=c[i]=[],l[0]=="m"&&(f=l[1]+d,g=l[2]+e);for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o]}var q=c[i][w];switch(c[i][0]){case"z":d=f,e=g;break;case"h":d+=+c[i][q-1];break;case"v":e+=+c[i][q-1];break;default:d+=+c[i][q-2],e+=+c[i][q-1]}}c[H]=a._path2string;return c},0,bo),bq=bm(function(b){if(!a.is(b,G)||!a.is(b&&b[0],G))b=a.parsePathString(b);var c=[],d=0,e=0,f=0,g=0,h=0;b[0][0]=="M"&&(d=+b[0][1],e=+b[0][2],f=d,g=e,h++,c[0]=["M",d,e]);for(var i=h,j=b[w];i<j;i++){var k=c[i]=[],l=b[i];if(l[0]!=V.call(l[0])){k[0]=V.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+d),k[7]=+(l[7]+e);break;case"V":k[1]=+l[1]+e;break;case"H":k[1]=+l[1]+d;break;case"M":f=+l[1]+d,g=+l[2]+e;default:for(var m=1,n=l[w];m<n;m++)k[m]=+l[m]+(m%2?d:e)}}else for(var o=0,p=l[w];o<p;o++)c[i][o]=l[o];switch(k[0]){case"Z":d=f,e=g;break;case"H":d=k[1];break;case"V":e=k[1];break;case"M":f=c[i][c[i][w]-2],g=c[i][c[i][w]-1];default:d=c[i][c[i][w]-2],e=c[i][c[i][w]-1]}}c[H]=a._path2string;return c},null,bo),br=function(a,b,c,d){return[a,b,c,d,c,d]},bs=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bt=function(a,b,c,d,e,f,g,h,i,j){var k=D*120/180,l=D/180*(+e||0),m=[],o,p=bm(function(a,b,c){var d=a*y.cos(c)-b*y.sin(c),e=a*y.sin(c)+b*y.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=y.cos(D/180*e),r=y.sin(D/180*e),t=(a-h)/2,u=(b-i)/2,x=t*t/(c*c)+u*u/(d*d);x>1&&(x=y.sqrt(x),c=x*c,d=x*d);var z=c*c,A=d*d,C=(f==g?-1:1)*y.sqrt(B((z*A-z*u*u-A*t*t)/(z*u*u+A*t*t))),E=C*c*u/d+(a+h)/2,F=C*-d*t/c+(b+i)/2,G=y.asin(((b-F)/d).toFixed(9)),H=y.asin(((i-F)/d).toFixed(9));G=a<E?D-G:G,H=h<E?D-H:H,G<0&&(G=D*2+G),H<0&&(H=D*2+H),g&&G>H&&(G=G-D*2),!g&&H>G&&(H=H-D*2)}else G=j[0],H=j[1],E=j[2],F=j[3];var I=H-G;if(B(I)>k){var J=H,K=h,L=i;H=G+k*(g&&H>G?1:-1),h=E+c*y.cos(H),i=F+d*y.sin(H),m=bt(h,i,c,d,e,0,g,K,L,[H,J,E,F])}I=H-G;var M=y.cos(G),N=y.sin(G),O=y.cos(H),P=y.sin(H),Q=y.tan(I/4),R=4/3*c*Q,S=4/3*d*Q,T=[a,b],U=[a+R*N,b-S*M],V=[h+R*P,i-S*O],W=[h,i];U[0]=2*T[0]-U[0],U[1]=2*T[1]-U[1];if(j)return[U,V,W][n](m);m=[U,V,W][n](m)[v]()[s](",");var X=[];for(var Y=0,Z=m[w];Y<Z;Y++)X[Y]=Y%2?p(m[Y-1],m[Y],l).y:p(m[Y],m[Y+1],l).x;return X},bu=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:C(j,3)*a+C(j,2)*3*i*c+j*3*i*i*e+C(i,3)*g,y:C(j,3)*b+C(j,2)*3*i*d+j*3*i*i*f+C(i,3)*h}},bv=bm(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+y.sqrt(j*j-4*i*k))/2/i,n=(-j-y.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;B(l)>"1e12"&&(l=.5),B(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bu(a,b,c,d,e,f,g,h,l),p[L](q.x),o[L](q.y)),n>0&&n<1&&(q=bu(a,b,c,d,e,f,g,h,n),p[L](q.x),o[L](q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+y.sqrt(j*j-4*i*k))/2/i,n=(-j-y.sqrt(j*j-4*i*k))/2/i,B(l)>"1e12"&&(l=.5),B(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bu(a,b,c,d,e,f,g,h,l),p[L](q.x),o[L](q.y)),n>0&&n<1&&(q=bu(a,b,c,d,e,f,g,h,n),p[L](q.x),o[L](q.y));return{min:{x:A[m](0,p),y:A[m](0,o)},max:{x:z[m](0,p),y:z[m](0,o)}}}),bw=bm(function(a,b){var c=bq(a),d=b&&bq(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](bt[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](bs(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](bs(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](br(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](br(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](br(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](br(b.x,b.y,b.X,b.Y))}return a},h=function(a,b){if(a[b][w]>7){a[b].shift();var e=a[b];while(e[w])a.splice(b++,0,["C"][n](e.splice(0,6)));a.splice(b,1),k=z(c[w],d&&d[w]||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=z(c[w],d&&d[w]||0))};for(var j=0,k=z(c[w],d&&d[w]||0);j<k;j++){c[j]=g(c[j],e),h(c,j),d&&(d[j]=g(d[j],f)),d&&h(d,j),i(c,d,e,f,j),i(d,c,f,e,j);var l=c[j],o=d&&d[j],p=l[w],q=d&&o[w];e.x=l[p-2],e.y=l[p-1],e.bx=S(l[p-4])||e.x,e.by=S(l[p-3])||e.y,f.bx=d&&(S(o[q-4])||f.x),f.by=d&&(S(o[q-3])||f.y),f.x=d&&o[q-2],f.y=d&&o[q-1]}return d?[c,d]:c},null,bo),bx=bm(function(b){var c=[];for(var d=0,e=b[w];d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c[L](f)}for(d=1,e=c[w]-1;d<e;d++)if(!c[d].offset){var h=S(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=S(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),by=function(b,c,d,e){var f;if(!a.is(b,F)&&!a.is(b,"object"))return{container:1,x:b,y:c,width:d,height:e};f=a.is(b,F)?g.getElementById(b):b;if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d}},bz=function(a,b){var c=this;for(var d in b)if(b[f](d)&&!(d in a))switch(typeof b[d]){case"function":(function(b){a[d]=a===c?b:function(){return b[m](c,arguments)}})(b[d]);break;case"object":a[d]=a[d]||{},bz.call(this,a[d],b[d]);break;default:a[d]=b[d]}},bA=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bB=function(a,b){b.top!==a&&(bA(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bC=function(a,b){b.bottom!==a&&(bA(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bD=function(a,b,c){bA(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bE=function(a,b,c){bA(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bF=function(a){return function(){throw new Error("Raphaël: you are calling to method “"+a+"” of removed object")}};a.pathToRelative=bp;if(a.svg){k.svgns="http://www.w3.org/2000/svg",k.xlink="http://www.w3.org/1999/xlink",Q=function(a){return+a+(~~a===a)*.5};var bG=function(a,b){if(!b){a=g.createElementNS(k.svgns,a),a.style.webkitTapHighlightColor="rgba(0,0,0,0)";return a}for(var c in b)b[f](c)&&a[R](c,r(b[c]))};a[H]=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var bH=function(a,b){var c=bG("path");b.canvas&&b.canvas[l](c);var d=new bN(c,b);d.type="path",bK(d,{fill:"none",stroke:"#000",path:a});return d},bI=function(a,b,c){var d="linear",e=.5,f=.5,h=a.style;b=r(b)[Y](bd,function(a,b,c){d="radial";if(b&&c){e=S(b),f=S(c);var g=(f>.5)*2-1;C(e-.5,2)+C(f-.5,2)>.25&&(f=y.sqrt(.25-C(e-.5,2))*g+.5)&&f!=.5&&(f=f.toFixed(5)-1e-5*g)}return p}),b=b[s](/\s*\-\s*/);if(d=="linear"){var i=b.shift();i=-S(i);if(isNaN(i))return null;var j=[0,0,y.cos(i*D/180),y.sin(i*D/180)],k=1/(z(B(j[2]),B(j[3]))||1);j[2]*=k,j[3]*=k,j[2]<0&&(j[0]=-j[2],j[2]=0),j[3]<0&&(j[1]=-j[3],j[3]=0)}var m=bx(b);if(!m)return null;var n=a.getAttribute(I);n=n.match(/^url\(#(.*)\)$/),n&&c.defs.removeChild(g.getElementById(n[1]));var o=bG(d+"Gradient");o.id=bh(),bG(o,d=="radial"?{fx:e,fy:f}:{x1:j[0],y1:j[1],x2:j[2],y2:j[3]}),c.defs[l](o);for(var q=0,t=m[w];q<t;q++){var u=bG("stop");bG(u,{offset:m[q].offset?m[q].offset:q?"100%":"0%","stop-color":m[q].color||"#fff"}),o[l](u)}bG(a,{fill:"url(#"+o.id+")",opacity:1,"fill-opacity":1}),h.fill=p,h.opacity=1,h.fillOpacity=1;return 1},bJ=function(b){var c=b.getBBox();bG(b.pattern,{patternTransform:a.format("translate({0},{1})",c.x,c.y)})},bK=function(c,d){var e={"":[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]},h=c.node,i=c.attrs,j=c.rotate(),k=function(a,b){b=e[x.call(b)];if(b){var c=a.attrs["stroke-width"]||"1",f=({round:c,square:c,butt:0})[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],i=b[w];while(i--)g[i]=b[i]*c+(i%2?1:-1)*f;bG(h,{"stroke-dasharray":g[v](",")})}};d[f]("rotation")&&(j=d.rotation);var m=r(j)[s](b);m.length-1?(m[1]=+m[1],m[2]=+m[2]):m=null,S(j)&&c.rotate(0,!0);for(var n in d)if(d[f](n)){if(!W[f](n))continue;var o=d[n];i[n]=o;switch(n){case"blur":c.blur(o);break;case"rotation":c.rotate(o,!0);break;case"href":case"title":case"target":var t=h.parentNode;if(x.call(t.tagName)!="a"){var u=bG("a");t.insertBefore(u,h),u[l](h),t=u}n=="target"&&o=="blank"?t.setAttributeNS(c.paper.xlink,"show","new"):t.setAttributeNS(c.paper.xlink,n,o);break;case"cursor":h.style.cursor=o;break;case"clip-rect":var y=r(o)[s](b);if(y[w]==4){c.clip&&c.clip.parentNode.parentNode.removeChild(c.clip.parentNode);var z=bG("clipPath"),A=bG("rect");z.id=bh(),bG(A,{x:y[0],y:y[1],width:y[2],height:y[3]}),z[l](A),c.paper.defs[l](z),bG(h,{"clip-path":"url(#"+z.id+")"}),c.clip=A}if(!o){var B=g.getElementById(h.getAttribute("clip-path")[Y](/(^url\(#|\)$)/g,p));B&&B.parentNode.removeChild(B),bG(h,{"clip-path":p}),delete c.clip}break;case"path":c.type=="path"&&bG(h,{d:o?i.path=bq(o):"M0,0"});break;case"width":h[R](n,o);if(i.fx)n="x",o=i.x;else break;case"x":i.fx&&(o=-i.x-(i.width||0));case"rx":if(n=="rx"&&c.type=="rect")break;case"cx":m&&(n=="x"||n=="cx")&&(m[1]+=o-i[n]),h[R](n,o),c.pattern&&bJ(c);break;case"height":h[R](n,o);if(i.fy)n="y",o=i.y;else break;case"y":i.fy&&(o=-i.y-(i.height||0));case"ry":if(n=="ry"&&c.type=="rect")break;case"cy":m&&(n=="y"||n=="cy")&&(m[2]+=o-i[n]),h[R](n,o),c.pattern&&bJ(c);break;case"r":c.type=="rect"?bG(h,{rx:o,ry:o}):h[R](n,o);break;case"src":c.type=="image"&&h.setAttributeNS(c.paper.xlink,"href",o);break;case"stroke-width":h.style.strokeWidth=o,h[R](n,o),i["stroke-dasharray"]&&k(c,i["stroke-dasharray"]);break;case"stroke-dasharray":k(c,o);break;case"translation":var C=r(o)[s](b);C[0]=+C[0]||0,C[1]=+C[1]||0,m&&(m[1]+=C[0],m[2]+=C[1]),cA.call(c,C[0],C[1]);break;case"scale":C=r(o)[s](b),c.scale(+C[0]||1,+C[1]||+C[0]||1,isNaN(S(C[2]))?null:+C[2],isNaN(S(C[3]))?null:+C[3]);break;case I:var D=r(o).match(M);if(D){z=bG("pattern");var E=bG("image");z.id=bh(),bG(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),bG(E,{x:0,y:0}),E.setAttributeNS(c.paper.xlink,"href",D[1]),z[l](E);var F=g.createElement("img");F.style.cssText="position:absolute;left:-9999em;top-9999em",F.onload=function(){bG(z,{width:this.offsetWidth,height:this.offsetHeight}),bG(E,{width:this.offsetWidth,height:this.offsetHeight}),g.body.removeChild(this),c.paper.safari()},g.body[l](F),F.src=D[1],c.paper.defs[l](z),h.style.fill="url(#"+z.id+")",bG(h,{fill:"url(#"+z.id+")"}),c.pattern=z,c.pattern&&bJ(c);break}var G=a.getRGB(o);if(!G.error)delete d.gradient,delete i.gradient,!a.is(i.opacity,"undefined")&&a.is(d.opacity,"undefined")&&bG(h,{opacity:i.opacity}),!a.is(i["fill-opacity"],"undefined")&&a.is(d["fill-opacity"],"undefined")&&bG(h,{"fill-opacity":i["fill-opacity"]});else if((({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper)){i.gradient=o,i.fill="none";break}G[f]("opacity")&&bG(h,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(o),h[R](n,G.hex),n=="stroke"&&G[f]("opacity")&&bG(h,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity});break;case"gradient":(({circle:1,ellipse:1})[f](c.type)||r(o).charAt()!="r")&&bI(h,o,c.paper);break;case"opacity":i.gradient&&!i[f]("stroke-opacity")&&bG(h,{"stroke-opacity":o>1?o/100:o});case"fill-opacity":if(i.gradient){var H=g.getElementById(h.getAttribute(I)[Y](/^url\(#|\)$/g,p));if(H){var J=H.getElementsByTagName("stop");J[J[w]-1][R]("stop-opacity",o)}break};default:n=="font-size"&&(o=T(o,10)+"px");var K=n[Y](/(\-.)/g,function(a){return V.call(a.substring(1))});h.style[K]=o,h[R](n,o)}}bM(c,d),m?c.rotate(m.join(q)):S(j)&&c.rotate(j,!0)},bL=1.2,bM=function(b,c){if(b.type=="text"&&!!(c[f]("text")||c[f]("font")||c[f]("font-size")||c[f]("x")||c[f]("y"))){var d=b.attrs,e=b.node,h=e.firstChild?T(g.defaultView.getComputedStyle(e.firstChild,p).getPropertyValue("font-size"),10):10;if(c[f]("text")){d.text=c.text;while(e.firstChild)e.removeChild(e.firstChild);var i=r(c.text)[s]("\n");for(var j=0,k=i[w];j<k;j++)if(i[j]){var m=bG("tspan");j&&bG(m,{dy:h*bL,x:d.x}),m[l](g.createTextNode(i[j])),e[l](m)}}else{i=e.getElementsByTagName("tspan");for(j=0,k=i[w];j<k;j++)j&&bG(i[j],{dy:h*bL,x:d.x})}bG(e,{y:d.y});var n=b.getBBox(),o=d.y-(n.y+n.height/2);o&&a.is(o,"finite")&&bG(e,{y:d.y+o})}},bN=function(b,c){var d=0,e=0;this[0]=b,this.id=a._oid++,this.node=b,b.raphael=this,this.paper=c,this.attrs=this.attrs||{},this.transformations=[],this._={tx:0,ty:0,rt:{deg:0,cx:0,cy:0},sx:1,sy:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},bO=bN[e];bN[e].rotate=function(c,d,e){if(this.removed)return this;if(c==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}var f=this.getBBox();c=r(c)[s](b),c[w]-1&&(d=S(c[1]),e=S(c[2])),c=S(c[0]),d!=null&&d!==!1?this._.rt.deg=c:this._.rt.deg+=c,e==null&&(d=null),this._.rt.cx=d,this._.rt.cy=e,d=d==null?f.x+f.width/2:d,e=e==null?f.y+f.height/2:e,this._.rt.deg?(this.transformations[0]=a.format("rotate({0} {1} {2})",this._.rt.deg,d,e),this.clip&&bG(this.clip,{transform:a.format("rotate({0} {1} {2})",-this._.rt.deg,d,e)})):(this.transformations[0]=p,this.clip&&bG(this.clip,{transform:p})),bG(this.node,{transform:this.transformations[v](q)});return this},bN[e].hide=function(){!this.removed&&(this.node.style.display="none");return this},bN[e].show=function(){!this.removed&&(this.node.style.display="");return this},bN[e].remove=function(){if(!this.removed){bA(this,this.paper),this.node.parentNode.removeChild(this.node);for(var a in this)delete this[a];this.removed=!0}},bN[e].getBBox=function(){if(this.removed)return this;if(this.type=="path")return bn(this.attrs.path);if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}if(this.type=="text"){b={x:b.x,y:Infinity,width:0,height:0};for(var d=0,e=this.node.getNumberOfChars();d<e;d++){var f=this.node.getExtentOfChar(d);f.y<b.y&&(b.y=f.y),f.y+f.height-b.y>b.height&&(b.height=f.y+f.height-b.y),f.x+f.width-b.x>b.width&&(b.width=f.x+f.width-b.x)}}a&&this.hide();return b},bN[e].attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate()),(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale()),d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,F)){if(b=="translation")return cA.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(c==null&&a.is(b,G)){var g={};for(var h=0,i=b.length;h<i;h++)g[b[h]]=this.attr(b[h]);return g}if(c!=null){var j={};j[b]=c}else b!=null&&a.is(b,"object")&&(j=b);for(var k in this.paper.customAttributes)if(this.paper.customAttributes[f](k)&&j[f](k)&&a.is(this.paper.customAttributes[k],"function")){var l=this.paper.customAttributes[k].apply(this,[][n](j[k]));this.attrs[k]=j[k];for(var m in l)l[f](m)&&(j[m]=l[m])}bK(this,j);return this},bN[e].toFront=function(){if(this.removed)return this;this.node.parentNode[l](this.node);var a=this.paper;a.top!=this&&bB(this,a);return this},bN[e].toBack=function(){if(this.removed)return this;if(this.node.parentNode.firstChild!=this.node){this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),bC(this,this.paper);var a=this.paper}return this},bN[e].insertAfter=function(a){if(this.removed)return this;var b=a.node||a[a.length-1].node;b.nextSibling?b.parentNode.insertBefore(this.node,b.nextSibling):b.parentNode[l](this.node),bD(this,a,this.paper);return this},bN[e].insertBefore=function(a){if(this.removed)return this;var b=a.node||a[0].node;b.parentNode.insertBefore(this.node,b),bE(this,a,this.paper);return this},bN[e].blur=function(a){var b=this;if(+a!==0){var c=bG("filter"),d=bG("feGaussianBlur");b.attrs.blur=a,c.id=bh(),bG(d,{stdDeviation:+a||1.5}),c.appendChild(d),b.paper.defs.appendChild(c),b._blur=c,bG(b.node,{filter:"url(#"+c.id+")"})}else b._blur&&(b._blur.parentNode.removeChild(b._blur),delete b._blur,delete b.attrs.blur),b.node.removeAttribute("filter")};var bP=function(a,b,c,d){var e=bG("circle");a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",bG(e,f.attrs);return f},bQ=function(a,b,c,d,e,f){var g=bG("rect");a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",bG(g,h.attrs);return h},bR=function(a,b,c,d,e){var f=bG("ellipse");a.canvas&&a.canvas[l](f);var g=new bN(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",bG(f,g.attrs);return g},bS=function(a,b,c,d,e,f){var g=bG("image");bG(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(a.xlink,"href",b),a.canvas&&a.canvas[l](g);var h=new bN(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},bT=function(a,b,c,d){var e=bG("text");bG(e,{x:b,y:c,"text-anchor":"middle"}),a.canvas&&a.canvas[l](e);var f=new bN(e,a);f.attrs={x:b,y:c,"text-anchor":"middle",text:d,font:W.font,stroke:"none",fill:"#000"},f.type="text",bK(f,f.attrs);return f},bU=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas[R]("width",this.width),this.canvas[R]("height",this.height);return this},bV=function(){var b=by[m](0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,h=b.height;if(!c)throw new Error("SVG container not found.");var i=bG("svg");d=d||0,e=e||0,f=f||512,h=h||342,bG(i,{xmlns:"http://www.w3.org/2000/svg",version:1.1,width:f,height:h}),c==1?(i.style.cssText="position:absolute;left:"+d+"px;top:"+e+"px",g.body[l](i)):c.firstChild?c.insertBefore(i,c.firstChild):c[l](i),c=new j,c.width=f,c.height=h,c.canvas=i,bz.call(c,c,a.fn),c.clear();return c};k.clear=function(){var a=this.canvas;while(a.firstChild)a.removeChild(a.firstChild);this.bottom=this.top=null,(this.desc=bG("desc"))[l](g.createTextNode("Created with Raphaël")),a[l](this.desc),a[l](this.defs=bG("defs"))},k.remove=function(){this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a)}}if(a.vml){var bW={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},bX=/([clmz]),?([^clmz]*)/gi,bY=/ progid:\S+Blur\([^\)]+\)/g,bZ=/-?[^,\s-]+/g,b$=1e3+q+1e3,b_=10,ca={path:1,rect:1},cb=function(a){var b=/[ahqstv]/ig,c=bq;r(a).match(b)&&(c=bw),b=/[clmz]/g;if(c==bq&&!r(a).match(b)){var d=r(a)[Y](bX,function(a,b,c){var d=[],e=x.call(b)=="m",f=bW[b];c[Y](bZ,function(a){e&&d[w]==2&&(f+=d+bW[b=="m"?"l":"L"],d=[]),d[L](Q(a*b_))});return f+d});return d}var e=c(a),f,g;d=[];for(var h=0,i=e[w];h<i;h++){f=e[h],g=x.call(e[h][0]),g=="z"&&(g="x");for(var j=1,k=f[w];j<k;j++)g+=Q(f[j]*b_)+(j!=k-1?",":p);d[L](g)}return d[v](q)};a[H]=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version},bH=function(a,b){var c=cd("group");c.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px",c.coordsize=b.coordsize,c.coordorigin=b.coordorigin;var d=cd("shape"),e=d.style;e.width=b.width+"px",e.height=b.height+"px",d.coordsize=b$,d.coordorigin=b.coordorigin,c[l](d);var f=new bN(d,c,b),g={fill:"none",stroke:"#000"};a&&(g.path=a),f.type="path",f.path=[],f.Path=p,bK(f,g),b.canvas[l](c);var h=cd("skew");h.on=!0,d.appendChild(h),f.skew=h;return f},bK=function(c,d){c.attrs=c.attrs||{};var e=c.node,h=c.attrs,i=e.style,j,k=(d.x!=h.x||d.y!=h.y||d.width!=h.width||d.height!=h.height||d.r!=h.r)&&c.type=="rect",m=c;for(var n in d)d[f](n)&&(h[n]=d[n]);k&&(h.path=cc(h.x,h.y,h.width,h.height,h.r),c.X=h.x,c.Y=h.y,c.W=h.width,c.H=h.height),d.href&&(e.href=d.href),d.title&&(e.title=d.title),d.target&&(e.target=d.target),d.cursor&&(i.cursor=d.cursor),"blur"in d&&c.blur(d.blur);if(d.path&&c.type=="path"||k)e.path=cb(h.path);d.rotation!=null&&c.rotate(d.rotation,!0),d.translation&&(j=r(d.translation)[s](b),cA.call(c,j[0],j[1]),c._.rt.cx!=null&&(c._.rt.cx+=+j[0],c._.rt.cy+=+j[1],c.setBox(c.attrs,j[0],j[1]))),d.scale&&(j=r(d.scale)[s](b),c.scale(+j[0]||1,+j[1]||+j[0]||1,+j[2]||null,+j[3]||null));if("clip-rect"in d){var o=r(d["clip-rect"])[s](b);if(o[w]==4){o[2]=+o[2]+ +o[0],o[3]=+o[3]+ +o[1];var q=e.clipRect||g.createElement("div"),t=q.style,u=e.parentNode;t.clip=a.format("rect({1}px {2}px {3}px {0}px)",o),e.clipRect||(t.position="absolute",t.top=0,t.left=0,t.width=c.paper.width+"px",t.height=c.paper.height+"px",u.parentNode.insertBefore(q,u),q[l](u),e.clipRect=q)}d["clip-rect"]||e.clipRect&&(e.clipRect.style.clip=p)}c.type=="image"&&d.src&&(e.src=d.src),c.type=="image"&&d.opacity&&(e.filterOpacity=U+".Alpha(opacity="+d.opacity*100+")",i.filter=(e.filterMatrix||p)+(e.filterOpacity||p)),d.font&&(i.font=d.font),d["font-family"]&&(i.fontFamily='"'+d["font-family"][s](",")[0][Y](/^['"]+|['"]+$/g,p)+'"'),d["font-size"]&&(i.fontSize=d["font-size"]),d["font-weight"]&&(i.fontWeight=d["font-weight"]),d["font-style"]&&(i.fontStyle=d["font-style"]);if(d.opacity!=null||d["stroke-width"]!=null||d.fill!=null||d.stroke!=null||d["stroke-width"]!=null||d["stroke-opacity"]!=null||d["fill-opacity"]!=null||d["stroke-dasharray"]!=null||d["stroke-miterlimit"]!=null||d["stroke-linejoin"]!=null||d["stroke-linecap"]!=null){e=c.shape||e;var v=e.getElementsByTagName(I)&&e.getElementsByTagName(I)[0],x=!1;!v&&(x=v=cd(I));if("fill-opacity"in d||"opacity"in d){var y=((+h["fill-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+a.getRGB(d.fill).o+1||2)-1);y=A(z(y,0),1),v.opacity=y}d.fill&&(v.on=!0);if(v.on==null||d.fill=="none")v.on=!1;if(v.on&&d.fill){var B=d.fill.match(M);B?(v.src=B[1],v.type="tile"):(v.color=a.getRGB(d.fill).hex,v.src=p,v.type="solid",a.getRGB(d.fill).error&&(m.type in{circle:1,ellipse:1}||r(d.fill).charAt()!="r")&&bI(m,d.fill)&&(h.fill="none",h.gradient=d.fill))}x&&e[l](v);var C=e.getElementsByTagName("stroke")&&e.getElementsByTagName("stroke")[0],D=!1;!C&&(D=C=cd("stroke"));if(d.stroke&&d.stroke!="none"||d["stroke-width"]||d["stroke-opacity"]!=null||d["stroke-dasharray"]||d["stroke-miterlimit"]||d["stroke-linejoin"]||d["stroke-linecap"])C.on=!0;(d.stroke=="none"||C.on==null||d.stroke==0||d["stroke-width"]==0)&&(C.on=!1);var E=a.getRGB(d.stroke);C.on&&d.stroke&&(C.color=E.hex),y=((+h["stroke-opacity"]+1||2)-1)*((+h.opacity+1||2)-1)*((+E.o+1||2)-1);var F=(S(d["stroke-width"])||1)*.75;y=A(z(y,0),1),d["stroke-width"]==null&&(F=h["stroke-width"]),d["stroke-width"]&&(C.weight=F),F&&F<1&&(y*=F)&&(C.weight=1),C.opacity=y,d["stroke-linejoin"]&&(C.joinstyle=d["stroke-linejoin"]||"miter"),C.miterlimit=d["stroke-miterlimit"]||8,d["stroke-linecap"]&&(C.endcap=d["stroke-linecap"]=="butt"?"flat":d["stroke-linecap"]=="square"?"square":"round");if(d["stroke-dasharray"]){var G={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};C.dashstyle=G[f](d["stroke-dasharray"])?G[d["stroke-dasharray"]]:p}D&&e[l](C)}if(m.type=="text"){i=m.paper.span.style,h.font&&(i.font=h.font),h["font-family"]&&(i.fontFamily=h["font-family"]),h["font-size"]&&(i.fontSize=h["font-size"]),h["font-weight"]&&(i.fontWeight=h["font-weight"]),h["font-style"]&&(i.fontStyle=h["font-style"]),m.node.string&&(m.paper.span.innerHTML=r(m.node.string)[Y](/</g,"&#60;")[Y](/&/g,"&#38;")[Y](/\n/g,"<br>")),m.W=h.w=m.paper.span.offsetWidth,m.H=h.h=m.paper.span.offsetHeight,m.X=h.x,m.Y=h.y+Q(m.H/2);switch(h["text-anchor"]){case"start":m.node.style["v-text-align"]="left",m.bbx=Q(m.W/2);break;case"end":m.node.style["v-text-align"]="right",m.bbx=-Q(m.W/2);break;default:m.node.style["v-text-align"]="center"}}},bI=function(a,b){a.attrs=a.attrs||{};var c=a.attrs,d,e="linear",f=".5 .5";a.attrs.gradient=b,b=r(b)[Y](bd,function(a,b,c){e="radial",b&&c&&(b=S(b),c=S(c),C(b-.5,2)+C(c-.5,2)>.25&&(c=y.sqrt(.25-C(b-.5,2))*((c>.5)*2-1)+.5),f=b+q+c);return p}),b=b[s](/\s*\-\s*/);if(e=="linear"){var g=b.shift();g=-S(g);if(isNaN(g))return null}var h=bx(b);if(!h)return null;a=a.shape||a.node,d=a.getElementsByTagName(I)[0]||cd(I),!d.parentNode&&a.appendChild(d);if(h[w]){d.on=!0,d.method="none",d.color=h[0].color,d.color2=h[h[w]-1].color;var i=[];for(var j=0,k=h[w];j<k;j++)h[j].offset&&i[L](h[j].offset+q+h[j].color);d.colors&&(d.colors.value=i[w]?i[v]():"0% "+d.color),e=="radial"?(d.type="gradientradial",d.focus="100%",d.focussize=f,d.focusposition=f):(d.type="gradient",d.angle=(270-g)%360)}return 1},bN=function(b,c,d){var e=0,f=0,g=0,h=1;this[0]=b,this.id=a._oid++,this.node=b,b.raphael=this,this.X=0,this.Y=0,this.attrs={},this.Group=c,this.paper=d,this._={tx:0,ty:0,rt:{deg:0},sx:1,sy:1},!d.bottom&&(d.bottom=this),this.prev=d.top,d.top&&(d.top.next=this),d.top=this,this.next=null},bO=bN[e],bO.rotate=function(a,c,d){if(this.removed)return this;if(a==null){if(this._.rt.cx)return[this._.rt.deg,this._.rt.cx,this._.rt.cy][v](q);return this._.rt.deg}a=r(a)[s](b),a[w]-1&&(c=S(a[1]),d=S(a[2])),a=S(a[0]),c!=null?this._.rt.deg=a:this._.rt.deg+=a,d==null&&(c=null),this._.rt.cx=c,this._.rt.cy=d,this.setBox(this.attrs,c,d),this.Group.style.rotation=this._.rt.deg;return this},bO.setBox=function(a,b,c){if(this.removed)return this;var d=this.Group.style,e=this.shape&&this.shape.style||this.node.style;a=a||{};for(var g in a)a[f](g)&&(this.attrs[g]=a[g]);b=b||this._.rt.cx,c=c||this._.rt.cy;var h=this.attrs,i,j,k,l;switch(this.type){case"circle":i=h.cx-h.r,j=h.cy-h.r,k=l=h.r*2;break;case"ellipse":i=h.cx-h.rx,j=h.cy-h.ry,k=h.rx*2,l=h.ry*2;break;case"image":i=+h.x,j=+h.y,k=h.width||0,l=h.height||0;break;case"text":this.textpath.v=["m",Q(h.x),", ",Q(h.y-2),"l",Q(h.x)+1,", ",Q(h.y-2)][v](p),i=h.x-Q(this.W/2),j=h.y-this.H/2,k=this.W,l=this.H;break;case"rect":case"path":if(!this.attrs.path)i=0,j=0,k=this.paper.width,l=this.paper.height;else{var m=bn(this.attrs.path);i=m.x,j=m.y,k=m.width,l=m.height}break;default:i=0,j=0,k=this.paper.width,l=this.paper.height}b=b==null?i+k/2:b,c=c==null?j+l/2:c;var n=b-this.paper.width/2,o=c-this.paper.height/2,q;d.left!=(q=n+"px")&&(d.left=q),d.top!=(q=o+"px")&&(d.top=q),this.X=ca[f](this.type)?-n:i,this.Y=ca[f](this.type)?-o:j,this.W=k,this.H=l,ca[f](this.type)?(e.left!=(q=-n*b_+"px")&&(e.left=q),e.top!=(q=-o*b_+"px")&&(e.top=q)):this.type=="text"?(e.left!=(q=-n+"px")&&(e.left=q),e.top!=(q=-o+"px")&&(e.top=q)):(d.width!=(q=this.paper.width+"px")&&(d.width=q),d.height!=(q=this.paper.height+"px")&&(d.height=q),e.left!=(q=i-n+"px")&&(e.left=q),e.top!=(q=j-o+"px")&&(e.top=q),e.width!=(q=k+"px")&&(e.width=q),e.height!=(q=l+"px")&&(e.height=q))},bO.hide=function(){!this.removed&&(this.Group.style.display="none");return this},bO.show=function(){!this.removed&&(this.Group.style.display="block");return this},bO.getBBox=function(){if(this.removed)return this;if(ca[f](this.type))return bn(this.attrs.path);return{x:this.X+(this.bbx||0),y:this.Y,width:this.W,height:this.H}},bO.remove=function(){if(!this.removed){bA(this,this.paper),this.node.parentNode.removeChild(this.node),this.Group.parentNode.removeChild(this.Group),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var a in this)delete this[a];this.removed=!0}},bO.attr=function(b,c){if(this.removed)return this;if(b==null){var d={};for(var e in this.attrs)this.attrs[f](e)&&(d[e]=this.attrs[e]);this._.rt.deg&&(d.rotation=this.rotate()),(this._.sx!=1||this._.sy!=1)&&(d.scale=this.scale()),d.gradient&&d.fill=="none"&&(d.fill=d.gradient)&&delete d.gradient;return d}if(c==null&&a.is(b,"string")){if(b=="translation")return cA.call(this);if(b=="rotation")return this.rotate();if(b=="scale")return this.scale();if(b==I&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;return this.attrs[b]}if(this.attrs&&c==null&&a.is(b,G)){var g,h={};for(e=0,g=b[w];e<g;e++)h[b[e]]=this.attr(b[e]);return h}var i;c!=null&&(i={},i[b]=c),c==null&&a.is(b,"object")&&(i=b);if(i){for(var j in this.paper.customAttributes)if(this.paper.customAttributes[f](j)&&i[f](j)&&a.is(this.paper.customAttributes[j],"function")){var k=this.paper.customAttributes[j].apply(this,[][n](i[j]));this.attrs[j]=i[j];for(var l in k)k[f](l)&&(i[l]=k[l])}i.text&&this.type=="text"&&(this.node.string=i.text),bK(this,i),i.gradient&&(({circle:1,ellipse:1})[f](this.type)||r(i.gradient).charAt()!="r")&&bI(this,i.gradient),(!ca[f](this.type)||this._.rt.deg)&&this.setBox(this.attrs)}return this},bO.toFront=function(){!this.removed&&this.Group.parentNode[l](this.Group),this.paper.top!=this&&bB(this,this.paper);return this},bO.toBack=function(){if(this.removed)return this;this.Group.parentNode.firstChild!=this.Group&&(this.Group.parentNode.insertBefore(this.Group,this.Group.parentNode.firstChild),bC(this,this.paper));return this},bO.insertAfter=function(a){if(this.removed)return this;a.constructor==cD&&(a=a[a.length-1]),a.Group.nextSibling?a.Group.parentNode.insertBefore(this.Group,a.Group.nextSibling):a.Group.parentNode[l](this.Group),bD(this,a,this.paper);return this},bO.insertBefore=function(a){if(this.removed)return this;a.constructor==cD&&(a=a[0]),a.Group.parentNode.insertBefore(this.Group,a.Group),bE(this,a,this.paper);return this},bO.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(bY,p),+b!==0?(this.attrs.blur=b,c.filter=d+q+U+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",Q(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},bP=function(a,b,c,d){var e=cd("group"),f=cd("oval"),g=f.style;e.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px",e.coordsize=b$,e.coordorigin=a.coordorigin,e[l](f);var h=new bN(f,e,a);h.type="circle",bK(h,{stroke:"#000",fill:"none"}),h.attrs.cx=b,h.attrs.cy=c,h.attrs.r=d,h.setBox({x:b-d,y:c-d,width:d*2,height:d*2}),a.canvas[l](e);return h};function cc(b,c,d,e,f){return f?a.format("M{0},{1}l{2},0a{3},{3},0,0,1,{3},{3}l0,{5}a{3},{3},0,0,1,{4},{3}l{6},0a{3},{3},0,0,1,{4},{4}l0,{7}a{3},{3},0,0,1,{3},{4}z",b+f,c,d-f*2,f,-f,e-f*2,f*2-d,f*2-e):a.format("M{0},{1}l{2},0,0,{3},{4},0z",b,c,d,e,-d)}bQ=function(a,b,c,d,e,f){var g=cc(b,c,d,e,f),h=a.path(g),i=h.attrs;h.X=i.x=b,h.Y=i.y=c,h.W=i.width=d,h.H=i.height=e,i.r=f,i.path=g,h.type="rect";return h},bR=function(a,b,c,d,e){var f=cd("group"),g=cd("oval"),h=g.style;f.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px",f.coordsize=b$,f.coordorigin=a.coordorigin,f[l](g);var i=new bN(g,f,a);i.type="ellipse",bK(i,{stroke:"#000"}),i.attrs.cx=b,i.attrs.cy=c,i.attrs.rx=d,i.attrs.ry=e,i.setBox({x:b-d,y:c-e,width:d*2,height:e*2}),a.canvas[l](f);return i},bS=function(a,b,c,d,e,f){var g=cd("group"),h=cd("image");g.style.cssText="position:absolute;left:0;top:0;width:"+a.width+"px;height:"+a.height+"px",g.coordsize=b$,g.coordorigin=a.coordorigin,h.src=b,g[l](h);var i=new bN(h,g,a);i.type="image",i.attrs.src=b,i.attrs.x=c,i.attrs.y=d,i.attrs.w=e,i.attrs.h=f,i.setBox({x:c,y:d,width:e,height:f}),a.canvas[l](g);var j=cd("skew");j.on=!0,h.appendChild(j),i.skew=j;return i},bT=function(b,c,d,e){var f=cd("group"),g=cd("shape"),h=g.style,i=cd("path"),j=i.style,k=cd("textpath");f.style.cssText="position:absolute;left:0;top:0;width:"+b.width+"px;height:"+b.height+"px",f.coordsize=b$,f.coordorigin=b.coordorigin,i.v=a.format("m{0},{1}l{2},{1}",Q(c*10),Q(d*10),Q(c*10)+1),i.textpathok=!0,h.width=b.width,h.height=b.height,k.string=r(e),k.on=!0,g[l](k),g[l](i),f[l](g);var m=new bN(k,f,b);m.shape=g,m.textpath=i,m.type="text",m.attrs.text=e,m.attrs.x=c,m.attrs.y=d,m.attrs.w=1,m.attrs.h=1,bK(m,{font:W.font,stroke:"none",fill:"#000"}),m.setBox(),b.canvas[l](f);return m},bU=function(a,b){var c=this.canvas.style;a==+a&&(a+="px"),b==+b&&(b+="px"),c.width=a,c.height=b,c.clip="rect(0 "+a+" "+b+" 0)";return this};var cd;g.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!g.namespaces.rvml&&g.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),cd=function(a){return g.createElement("<rvml:"+a+' class="rvml">')}}catch(ce){cd=function(a){return g.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}bV=function(){var b=by[m](0,arguments),c=b.container,d=b.height,e,f=b.width,h=b.x,i=b.y;if(!c)throw new Error("VML container not found.");var k=new j,n=k.canvas=g.createElement("div"),o=n.style;h=h||0,i=i||0,f=f||512,d=d||342,f==+f&&(f+="px"),d==+d&&(d+="px"),k.width=1e3,k.height=1e3,k.coordsize=b_*1e3+q+b_*1e3,k.coordorigin="0 0",k.span=g.createElement("span"),k.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",n[l](k.span),o.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?(g.body[l](n),o.left=h+"px",o.top=i+"px",o.position="absolute"):c.firstChild?c.insertBefore(n,c.firstChild):c[l](n),bz.call(k,k,a.fn);return k},k.clear=function(){this.canvas.innerHTML=p,this.span=g.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas[l](this.span),this.bottom=this.top=null},k.remove=function(){this.canvas.parentNode.removeChild(this.canvas);for(var a in this)this[a]=bF(a);return!0}}var cf=navigator.userAgent.match(/Version\/(.*?)\s/);navigator.vendor=="Apple Computer, Inc."&&(cf&&cf[1]<4||navigator.platform.slice(0,2)=="iP")?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});h.setTimeout(function(){a.remove()})}:k.safari=function(){};var cg=function(){this.returnValue=!1},ch=function(){return this.originalEvent.preventDefault()},ci=function(){this.cancelBubble=!0},cj=function(){return this.originalEvent.stopPropagation()},ck=function(){if(g.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,g=function(e){if(o&&u[f](b))for(var g=0,h=e.targetTouches&&e.targetTouches.length;g<h;g++)if(e.targetTouches[g].target==a){var i=e;e=e.targetTouches[g],e.originalEvent=i,e.preventDefault=ch,e.stopPropagation=cj;break}return c.call(d,e)};a.addEventListener(e,g,!1);return function(){a.removeEventListener(e,g,!1);return!0}};if(g.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.event,a.preventDefault=a.preventDefault||cg,a.stopPropagation=a.stopPropagation||ci;return c.call(d,a)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),cl=[],cm=function(a){var b=a.clientX,c=a.clientY,d=g.documentElement.scrollTop||g.body.scrollTop,e=g.documentElement.scrollLeft||g.body.scrollLeft,f,h=cl.length;while(h--){f=cl[h];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();b+=e,c+=d,f.move&&f.move.call(f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},cn=function(b){a.unmousemove(cm).unmouseup(cn);var c=cl.length,d;while(c--)d=cl[c],d.el._drag={},d.end&&d.end.call(d.end_scope||d.start_scope||d.move_scope||d.el,b);cl=[]};for(var co=t[w];co--;)(function(b){a[b]=bN[e][b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:ck(this.shape||this.node||g,b,c,d||this)}));return this},a["un"+b]=bN[e]["un"+b]=function(a){var c=this.events,d=c[w];while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(t[co]);bO.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},bO.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)},bO.drag=function(b,c,d,e,f,h){this._drag={},this.mousedown(function(i){(i.originalEvent||i).preventDefault();var j=g.documentElement.scrollTop||g.body.scrollTop,k=g.documentElement.scrollLeft||g.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,c&&c.call(f||e||this,i.clientX+k,i.clientY+j,i),!cl.length&&a.mousemove(cm).mouseup(cn),cl.push({el:this,move:b,end:d,move_scope:e,start_scope:f,end_scope:h})});return this},bO.undrag=function(b,c,d){var e=cl.length;while(e--)cl[e].el==this&&cl[e].move==b&&cl[e].end==d&&cl.splice(e++,1);!cl.length&&a.unmousemove(cm).unmouseup(cn)},k.circle=function(a,b,c){return bP(this,a||0,b||0,c||0)},k.rect=function(a,b,c,d,e){return bQ(this,a||0,b||0,c||0,d||0,e||0)},k.ellipse=function(a,b,c,d){return bR(this,a||0,b||0,c||0,d||0)},k.path=function(b){b&&!a.is(b,F)&&!a.is(b[0],G)&&(b+=p);return bH(a.format[m](a,arguments),this)},k.image=function(a,b,c,d,e){return bS(this,a||"about:blank",b||0,c||0,d||0,e||0)},k.text=function(a,b,c){return bT(this,a||0,b||0,r(c))},k.set=function(a){arguments[w]>1&&(a=Array[e].splice.call(arguments,0,arguments[w]));return new cD(a)},k.setSize=bU,k.top=k.bottom=null,k.raphael=a,bO.resetScale=function(){if(this.removed)return this;this._.sx=1,this._.sy=1,this.attrs.scale="1 1"},bO.scale=function(a,b,c,d){if(this.removed)return this;if(a==null&&b==null)return{x:this._.sx,y:this._.sy,toString:cp};b=b||a,!+b&&(b=a);var e,f,g,h,i=this.attrs;if(a!=0){var j=this.getBBox(),k=j.x+j.width/2,l=j.y+j.height/2,m=B(a/this._.sx),o=B(b/this._.sy);c=+c||c==0?c:k,d=+d||d==0?d:l;var r=this._.sx>0,s=this._.sy>0,t=~~(a/B(a)),u=~~(b/B(b)),x=m*t,y=o*u,z=this.node.style,A=c+B(k-c)*x*(k>c==r?1:-1),C=d+B(l-d)*y*(l>d==s?1:-1),D=a*t>b*u?o:m;switch(this.type){case"rect":case"image":var E=i.width*m,F=i.height*o;this.attr({height:F,r:i.r*D,width:E,x:A-E/2,y:C-F/2});break;case"circle":case"ellipse":this.attr({rx:i.rx*m,ry:i.ry*o,r:i.r*D,cx:A,cy:C});break;case"text":this.attr({x:A,y:C});break;case"path":var G=bp(i.path),H=!0,I=r?x:m,J=s?y:o;for(var K=0,L=G[w];K<L;K++){var M=G[K],N=V.call(M[0]);if(N=="M"&&H)continue;H=!1;if(N=="A")M[G[K][w]-2]*=I,M[G[K][w]-1]*=J,M[1]*=m,M[2]*=o,M[5]=+(t+u?!!+M[5]:!+M[5]);else if(N=="H")for(var O=1,P=M[w];O<P;O++)M[O]*=I;else if(N=="V")for(O=1,P=M[w];O<P;O++)M[O]*=J;else for(O=1,P=M[w];O<P;O++)M[O]*=O%2?I:J}var Q=bn(G);e=A-Q.x-Q.width/2,f=C-Q.y-Q.height/2,G[0][1]+=e,G[0][2]+=f,this.attr({path:G})}this.type in{text:1,image:1}&&(t!=1||u!=1)?this.transformations?(this.transformations[2]="scale("[n](t,",",u,")"),this.node[R]("transform",this.transformations[v](q)),e=t==-1?-i.x-(E||0):i.x,f=u==-1?-i.y-(F||0):i.y,this.attr({x:e,y:f}),i.fx=t-1,i.fy=u-1):(this.node.filterMatrix=U+".Matrix(M11="[n](t,", M12=0, M21=0, M22=",u,", Dx=0, Dy=0, sizingmethod='auto expand', filtertype='bilinear')"),z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)):this.transformations?(this.transformations[2]=p,this.node[R]("transform",this.transformations[v](q)),i.fx=0,i.fy=0):(this.node.filterMatrix=p,z.filter=(this.node.filterMatrix||p)+(this.node.filterOpacity||p)),i.scale=[a,b,c,d][v](q),this._.sx=a,this._.sy=b}return this},bO.clone=function(){if(this.removed)return null;var a=this.attr();delete a.scale,delete a.translation;return this.paper[this.type]().attr(a)};var cq={},cr=function(b,c,d,e,f,g,h,i,j){var k=0,l=100,m=[b,c,d,e,f,g,h,i].join(),n=cq[m],o,p;!n&&(cq[m]=n={data:[]}),n.timer&&clearTimeout(n.timer),n.timer=setTimeout(function(){delete cq[m]},2e3);if(j!=null){var q=cr(b,c,d,e,f,g,h,i);l=~~q*10}for(var r=0;r<l+1;r++){n.data[j]>r?p=n.data[r*l]:(p=a.findDotsAtSegment(b,c,d,e,f,g,h,i,r/l),n.data[r]=p),r&&(k+=C(C(o.x-p.x,2)+C(o.y-p.y,2),.5));if(j!=null&&k>=j)return p;o=p}if(j==null)return k},cs=function(b,c){return function(d,e,f){d=bw(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cr(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cr(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]][v](),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cr(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}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}},ct=cs(1),cu=cs(),cv=cs(0,1);bO.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return ct(this.attrs.path)}},bO.getPointAtLength=function(a){if(this.type=="path")return cu(this.attrs.path,a)},bO.getSubpath=function(a,b){if(this.type=="path"){if(B(this.getTotalLength()-b)<"1e-6")return cv(this.attrs.path,a).end;var c=cv(this.attrs.path,b,1);return a?cv(c,a).end:c}},a.easing_formulas={linear:function(a){return a},"<":function(a){return C(a,3)},">":function(a){return C(a-1,3)+1},"<>":function(a){a=a*2;if(a<1)return C(a,3)/2;a-=2;return(C(a,3)+2)/2},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==0||a==1)return a;var b=.3,c=b/4;return C(2,-10*a)*y.sin((a-c)*2*D/b)+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}};var cw=[],cx=function(){var b=+(new Date);for(var c=0;c<cw[w];c++){var d=cw[c];if(d.stop||d.el.removed)continue;var e=b-d.start,g=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,n={},o;if(e<g){var r=h(e/g);for(var s in i)if(i[f](s)){switch(X[s]){case"along":o=r*g*j[s],k.back&&(o=k.len-o);var t=cu(k[s],o);m.translate(j.sx-j.x||0,j.sy-j.y||0),j.x=t.x,j.y=t.y,m.translate(t.x-j.sx,t.y-j.sy),k.rot&&m.rotate(j.r+t.alpha,t.x,t.y);break;case E:o=+i[s]+r*g*j[s];break;case"colour":o="rgb("+[cz(Q(i[s].r+r*g*j[s].r)),cz(Q(i[s].g+r*g*j[s].g)),cz(Q(i[s].b+r*g*j[s].b))][v](",")+")";break;case"path":o=[];for(var u=0,x=i[s][w];u<x;u++){o[u]=[i[s][u][0]];for(var y=1,z=i[s][u][w];y<z;y++)o[u][y]=+i[s][u][y]+r*g*j[s][u][y];o[u]=o[u][v](q)}o=o[v](q);break;case"csv":switch(s){case"translation":var A=r*g*j[s][0]-l.x,B=r*g*j[s][1]-l.y;l.x+=A,l.y+=B,o=A+q+B;break;case"rotation":o=+i[s][0]+r*g*j[s][0],i[s][1]&&(o+=","+i[s][1]+","+i[s][2]);break;case"scale":o=[+i[s][0]+r*g*j[s][0],+i[s][1]+r*g*j[s][1],2 in k[s]?k[s][2]:p,3 in k[s]?k[s][3]:p][v](q);break;case"clip-rect":o=[],u=4;while(u--)o[u]=+i[s][u]+r*g*j[s][u]}break;default:var C=[].concat(i[s]);o=[],u=m.paper.customAttributes[s].length;while(u--)o[u]=+C[u]+r*g*j[s][u]}n[s]=o}m.attr(n),m._run&&m._run.call(m)}else k.along&&(t=cu(k.along,k.len*!k.back),m.translate(j.sx-(j.x||0)+t.x-j.sx,j.sy-(j.y||0)+t.y-j.sy),k.rot&&m.rotate(j.r+t.alpha,t.x,t.y)),(l.x||l.y)&&m.translate(-l.x,-l.y),k.scale&&(k.scale+=p),m.attr(k),cw.splice(c--,1)}a.svg&&m&&m.paper&&m.paper.safari(),cw[w]&&setTimeout(cx)},cy=function(b,c,d,e,f){var g=d-e;c.timeouts.push(setTimeout(function(){a.is(f,"function")&&f.call(c),c.animate(b,g,b.easing)},e))},cz=function(a){return z(A(a,255),0)},cA=function(a,b){if(a==null)return{x:this._.tx,y:this._.ty,toString:cp};this._.tx+=+a,this._.ty+=+b;switch(this.type){case"circle":case"ellipse":this.attr({cx:+a+this.attrs.cx,cy:+b+this.attrs.cy});break;case"rect":case"image":case"text":this.attr({x:+a+this.attrs.x,y:+b+this.attrs.y});break;case"path":var c=bp(this.attrs.path);c[0][1]+=+a,c[0][2]+=+b,this.attr({path:c})}return this};bO.animateWith=function(a,b,c,d,e){for(var f=0,g=cw.length;f<g;f++)cw[f].el.id==a.id&&(b.start=cw[f].start);return this.animate(b,c,d,e)},bO.animateAlong=cB(),bO.animateAlongBack=cB(1),bO.onAnimation=function(a){this._run=a||0;return this},bO.animate=function(c,d,e,g){var h=this;h.timeouts=h.timeouts||[];if(a.is(e,"function")||!e)g=e||null;if(h.removed){g&&g.call(h);return h}var i={},j={},k=!1,l={};for(var m in c)if(c[f](m))if(X[f](m)||h.paper.customAttributes[f](m)){k=!0,i[m]=h.attr(m),i[m]==null&&(i[m]=W[m]),j[m]=c[m];switch(X[m]){case"along":var n=ct(c[m]),o=cu(c[m],n*!!c.back),p=h.getBBox();l[m]=n/d,l.tx=p.x,l.ty=p.y,l.sx=o.x,l.sy=o.y,j.rot=c.rot,j.back=c.back,j.len=n,c.rot&&(l.r=S(h.rotate())||0);break;case E:l[m]=(j[m]-i[m])/d;break;case"colour":i[m]=a.getRGB(i[m]);var q=a.getRGB(j[m]);l[m]={r:(q.r-i[m].r)/d,g:(q.g-i[m].g)/d,b:(q.b-i[m].b)/d};break;case"path":var t=bw(i[m],j[m]);i[m]=t[0];var u=t[1];l[m]=[];for(var v=0,x=i[m][w];v<x;v++){l[m][v]=[0];for(var y=1,z=i[m][v][w];y<z;y++)l[m][v][y]=(u[v][y]-i[m][v][y])/d}break;case"csv":var A=r(c[m])[s](b),B=r(i[m])[s](b);switch(m){case"translation":i[m]=[0,0],l[m]=[A[0]/d,A[1]/d];break;case"rotation":i[m]=B[1]==A[1]&&B[2]==A[2]?B:[0,A[1],A[2]],l[m]=[(A[0]-i[m][0])/d,0,0];break;case"scale":c[m]=A,i[m]=r(i[m])[s](b),l[m]=[(A[0]-i[m][0])/d,(A[1]-i[m][1])/d,0,0];break;case"clip-rect":i[m]=r(i[m])[s](b),l[m]=[],v=4;while(v--)l[m][v]=(A[v]-i[m][v])/d}j[m]=A;break;default:A=[].concat(c[m]),B=[].concat(i[m]),l[m]=[],v=h.paper.customAttributes[m][w];while(v--)l[m][v]=((A[v]||0)-(B[v]||0))/d}}if(!k){var C=[],D;for(var F in c)c[f](F)&&Z.test(F)&&(m={value:c[F]},F=="from"&&(F=0),F=="to"&&(F=100),m.key=T(F,10),C.push(m));C.sort(be),C[0].key&&C.unshift({key:0,value:h.attrs});for(v=0,x=C[w];v<x;v++)cy(C[v].value,h,d/100*C[v].key,d/100*(C[v-1]&&C[v-1].key||0),C[v-1]&&C[v-1].value.callback);D=C[C[w]-1].value.callback,D&&h.timeouts.push(setTimeout(function(){D.call(h)},d))}else{var G=a.easing_formulas[e];if(!G){G=r(e).match(P);if(G&&G[w]==5){var H=G;G=function(a){return cC(a,+H[1],+H[2],+H[3],+H[4],d)}}else G=function(a){return a}}cw.push({start:c.start||+(new Date),ms:d,easing:G,from:i,diff:l,to:j,el:h,t:{x:0,y:0}}),a.is(g,"function")&&(h._ac=setTimeout(function(){g.call(h)},d)),cw[w]==1&&setTimeout(cx)}return this},bO.stop=function(){for(var a=0;a<cw.length;a++)cw[a].el.id==this.id&&cw.splice(a--,1);for(a=0,ii=this.timeouts&&this.timeouts.length;a<ii;a++)clearTimeout(this.timeouts[a]);this.timeouts=[],clearTimeout(this._ac),delete this._ac;return this},bO.translate=function(a,b){return this.attr({translation:a+" "+b})},bO[H]=function(){return"Raphaël’s object"},a.ae=cw;var cD=function(a){this.items=[],this[w]=0,this.type="set";if(a)for(var b=0,c=a[w];b<c;b++)a[b]&&(a[b].constructor==bN||a[b].constructor==cD)&&(this[this.items[w]]=this.items[this.items[w]]=a[b],this[w]++)};cD[e][L]=function(){var a,b;for(var c=0,d=arguments[w];c<d;c++)a=arguments[c],a&&(a.constructor==bN||a.constructor==cD)&&(b=this.items[w],this[b]=this.items[b]=a,this[w]++);return this},cD[e].pop=function(){delete this[this[w]--];return this.items.pop()};for(var cE in bO)bO[f](cE)&&(cD[e][cE]=function(a){return function(){for(var b=0,c=this.items[w];b<c;b++)this.items[b][a][m](this.items[b],arguments);return this}}(cE));cD[e].attr=function(b,c){if(b&&a.is(b,G)&&a.is(b[0],"object"))for(var d=0,e=b[w];d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items[w];f<g;f++)this.items[f].attr(b,c);return this},cD[e].animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items[w],g=f,h,i=this,j;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,F)?d:j,h=this.items[--g].animate(b,c,d,j);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,b,c,d,j);return this},cD[e].insertAfter=function(a){var b=this.items[w];while(b--)this.items[b].insertAfter(a);return this},cD[e].getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items[w];e--;){var f=this.items[e].getBBox();a[L](f.x),b[L](f.y),c[L](f.x+f.width),d[L](f.y+f.height)}a=A[m](0,a),b=A[m](0,b);return{x:a,y:b,width:z[m](0,c)-a,height:z[m](0,d)-b}},cD[e].clone=function(a){a=new cD;for(var b=0,c=this.items[w];b<c;b++)a[L](this.items[b].clone());return a},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[f](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c][L](b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=T(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[f](e)){var g=a.glyphs[e];b.glyphs[e]={w:g.w,k:{},d:g.d&&"M"+g.d[Y](/[mlcxtrv]/g,function(a){return({l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"})[a]||"M"})+"z"};if(g.k)for(var h in g.k)g[f](h)&&(b.glyphs[e].k[h]=g.k[h])}}return a},k.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||({normal:400,bold:700,lighter:300,bolder:800})[c]||400;if(!!a.fonts){var g=a.fonts[b];if(!g){var h=new RegExp("(^|\\s)"+b[Y](/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[f](i)&&h.test(i)){g=a.fonts[i];break}}var j;if(g)for(var k=0,l=g[w];k<l;k++){j=g[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},k.print=function(c,d,e,f,g,h,i){h=h||"middle",i=z(A(i||0,1),-1);var j=this.set(),k=r(e)[s](p),l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox.split(b),q=+o[0],t=+o[1]+(h=="baseline"?o[3]-o[1]+ +f.face.descent:(o[3]-o[1])/2);for(var u=0,v=k[w];u<v;u++){var x=u&&f.glyphs[k[u-1]]||{},y=f.glyphs[k[u]];l+=u?(x.w||f.w)+(x.k&&x.k[k[u]]||0)+f.w*i:0,y&&y.d&&j[L](this.path(y.d).attr({fill:"#000",stroke:"none",translation:[l,0]}))}j.scale(n,n,q,t).translate(c-q,d-t)}return j},a.format=function(b,c){var e=a.is(c,G)?[0][n](c):arguments;b&&a.is(b,F)&&e[w]-1&&(b=b[Y](d,function(a,b){return e[++b]==null?p:e[b]}));return b||p},a.ninja=function(){i.was?h.Raphael=i.is:delete Raphael;return a},a.el=bO,a.st=cD[e],i.was?h.Raphael=a:Raphael=a})()
.svn/pristine/4f/4f5e9921a01dd7f12e2d5965f28343e0c44ae269.svn-base
1
# Portuguese localization for Ruby on Rails
2
# by Ricardo Otero <oterosantos@gmail.com>
3
# by Alberto Ferreira <toraxic@gmail.com>
4
pt:
5
  support:
6
    array:
7
      sentence_connector: "e"
8
      skip_last_comma: true
9

  
10
  direction: ltr
11
  date:
12
    formats:
13
      default: "%d/%m/%Y"
14
      short: "%d de %B"
15
      long: "%d de %B de %Y"
16
      only_day: "%d"
17
    day_names: [Domingo, Segunda, Terça, Quarta, Quinta, Sexta, Sábado]
18
    abbr_day_names: [Dom, Seg, Ter, Qua, Qui, Sex, Sáb]
19
    month_names: [~, Janeiro, Fevereiro, Março, Abril, Maio, Junho, Julho, Agosto, Setembro, Outubro, Novembro, Dezembro]
20
    abbr_month_names: [~, Jan, Fev, Mar, Abr, Mai, Jun, Jul, Ago, Set, Out, Nov, Dez]
21
    order:
22
      - :day
23
      - :month
24
      - :year
25

  
26
  time:
27
    formats:
28
      default: "%A, %d de %B de %Y, %H:%Mh"
29
      time: "%H:%M"
30
      short: "%d/%m, %H:%M hs"
31
      long: "%A, %d de %B de %Y, %H:%Mh"
32
    am: ''
33
    pm: ''
34

  
35
  datetime:
36
    distance_in_words:
37
      half_a_minute: "meio minuto"
38
      less_than_x_seconds:
39
        one: "menos de 1 segundo"
40
        other: "menos de %{count} segundos"
41
      x_seconds:
42
        one: "1 segundo"
43
        other: "%{count} segundos"
44
      less_than_x_minutes:
45
        one: "menos de um minuto"
46
        other: "menos de %{count} minutos"
47
      x_minutes:
48
        one: "1 minuto"
49
        other: "%{count} minutos"
50
      about_x_hours:
51
        one: "aproximadamente 1 hora"
52
        other: "aproximadamente %{count} horas"
53
      x_days:
54
        one: "1 dia"
55
        other: "%{count} dias"
56
      about_x_months:
57
        one: "aproximadamente 1 mês"
58
        other: "aproximadamente %{count} meses"
59
      x_months:
60
        one: "1 mês"
61
        other: "%{count} meses"
62
      about_x_years:
63
        one: "aproximadamente 1 ano"
64
        other: "aproximadamente %{count} anos"
65
      over_x_years:
66
        one: "mais de 1 ano"
67
        other: "mais de %{count} anos"
68
      almost_x_years:
69
        one:   "almost 1 year"
70
        other: "almost %{count} years"
71

  
72
  number:
73
    format:
74
      precision: 3
75
      separator: ','
76
      delimiter: '.'
77
    currency:
78
      format:
79
        unit: '€'
80
        precision: 2
81
        format: "%u %n"
82
        separator: ','
83
        delimiter: '.'
84
    percentage:
85
      format:
86
        delimiter: ''
87
    precision:
88
      format:
89
        delimiter: ''
90
    human:
91
      format:
92
        precision: 1
93
        delimiter: ''
94
      storage_units:
95
        format: "%n %u"
96
        units:
97
          byte:
98
            one: "Byte"
99
            other: "Bytes"
100
          kb: "KB"
101
          mb: "MB"
102
          gb: "GB"
103
          tb: "TB"
104

  
105
  activerecord:
106
    errors:
107
      template:
108
        header:
109
          one: "Não foi possível guardar %{model}: 1 erro"
110
          other: "Não foi possível guardar %{model}: %{count} erros"
111
        body: "Por favor, verifique os seguintes campos:"
112
      messages:
113
        inclusion: "não está incluído na lista"
114
        exclusion: "não está disponível"
115
        invalid: "não é válido"
116
        confirmation: "não está de acordo com a confirmação"
117
        accepted:  "precisa de ser aceite"
118
        empty: "não pode estar em branco"
119
        blank: "não pode estar em branco"
120
        too_long: "tem demasiados caracteres (máximo: %{count} caracteres)"
121
        too_short: "tem poucos caracteres (mínimo: %{count} caracteres)"
122
        wrong_length: "não é do tamanho correcto (necessita de ter %{count} caracteres)"
123
        taken: "não está disponível"
124
        not_a_number: "não é um número"
125
        greater_than: "tem de ser maior do que %{count}"
126
        greater_than_or_equal_to: "tem de ser maior ou igual a %{count}"
127
        equal_to: "tem de ser igual a %{count}"
128
        less_than: "tem de ser menor do que %{count}"
129
        less_than_or_equal_to: "tem de ser menor ou igual a %{count}"
130
        odd: "tem de ser ímpar"
131
        even: "tem de ser par"
132
        greater_than_start_date: "deve ser maior que a data inicial"
133
        not_same_project: "não pertence ao mesmo projecto"
134
        circular_dependency: "Esta relação iria criar uma dependência circular"
135
        cant_link_an_issue_with_a_descendant: "Não é possível ligar uma tarefa a uma sub-tarefa que lhe é pertencente"
136

  
137
  ## Translated by: Pedro Araújo <phcrva19@hotmail.com>
138
  actionview_instancetag_blank_option: Seleccione
139

  
140
  general_text_No: 'Não'
141
  general_text_Yes: 'Sim'
142
  general_text_no: 'não'
143
  general_text_yes: 'sim'
144
  general_lang_name: 'Português'
145
  general_csv_separator: ';'
146
  general_csv_decimal_separator: ','
147
  general_csv_encoding: ISO-8859-15
148
  general_pdf_encoding: UTF-8
149
  general_first_day_of_week: '1'
150

  
151
  notice_account_updated: A conta foi actualizada com sucesso.
152
  notice_account_invalid_creditentials: Utilizador ou palavra-chave inválidos.
153
  notice_account_password_updated: A palavra-chave foi alterada com sucesso.
154
  notice_account_wrong_password: Palavra-chave errada.
155
  notice_account_register_done: A conta foi criada com sucesso.
156
  notice_account_unknown_email: Utilizador desconhecido.
157
  notice_can_t_change_password: Esta conta utiliza uma fonte de autenticação externa. Não é possível alterar a palavra-chave.
158
  notice_account_lost_email_sent: Foi-lhe enviado um e-mail com as instruções para escolher uma nova palavra-chave.
159
  notice_account_activated: A sua conta foi activada. É agora possível autenticar-se.
160
  notice_successful_create: Criado com sucesso.
161
  notice_successful_update: Alterado com sucesso.
162
  notice_successful_delete: Apagado com sucesso.
163
  notice_successful_connection: Ligado com sucesso.
164
  notice_file_not_found: A página que está a tentar aceder não existe ou foi removida.
165
  notice_locking_conflict: Os dados foram actualizados por outro utilizador.
166
  notice_not_authorized: Não está autorizado a visualizar esta página.
167
  notice_email_sent: "Foi enviado um e-mail para %{value}"
168
  notice_email_error: "Ocorreu um erro ao enviar o e-mail (%{value})"
169
  notice_feeds_access_key_reseted: A sua chave de RSS foi inicializada.
170
  notice_failed_to_save_issues: "Não foi possível guardar %{count} tarefa(s) das %{total} seleccionadas: %{ids}."
171
  notice_no_issue_selected: "Nenhuma tarefa seleccionada! Por favor, seleccione as tarefas que quer editar."
172
  notice_account_pending: "A sua conta foi criada e está agora à espera de aprovação do administrador."
173
  notice_default_data_loaded: Configuração padrão carregada com sucesso.
174
  notice_unable_delete_version: Não foi possível apagar a versão.
175

  
176
  error_can_t_load_default_data: "Não foi possível carregar a configuração padrão: %{value}"
177
  error_scm_not_found: "A entrada ou revisão não foi encontrada no repositório."
178
  error_scm_command_failed: "Ocorreu um erro ao tentar aceder ao repositório: %{value}"
179
  error_scm_annotate: "A entrada não existe ou não pode ser anotada."
180
  error_issue_not_found_in_project: 'A tarefa não foi encontrada ou não pertence a este projecto.'
181

  
182
  mail_subject_lost_password: "Palavra-chave de %{value}"
183
  mail_body_lost_password: 'Para mudar a sua palavra-chave, clique na ligação abaixo:'
184
  mail_subject_register: "Activação de conta de %{value}"
185
  mail_body_register: 'Para activar a sua conta, clique na ligação abaixo:'
186
  mail_body_account_information_external: "Pode utilizar a conta %{value} para autenticar-se."
187
  mail_body_account_information: Informação da sua conta
188
  mail_subject_account_activation_request: "Pedido de activação da conta %{value}"
189
  mail_body_account_activation_request: "Um novo utilizador (%{value}) registou-se. A sua conta está à espera de aprovação:"
190
  mail_subject_reminder: "%{count} tarefa(s) para entregar nos próximos %{days} dias"
191
  mail_body_reminder: "%{count} tarefa(s) que estão atribuídas a si estão agendadas para estarem completas nos próximos %{days} dias:"
192

  
193
  gui_validation_error: 1 erro
194
  gui_validation_error_plural: "%{count} erros"
195

  
196
  field_name: Nome
197
  field_description: Descrição
198
  field_summary: Sumário
199
  field_is_required: Obrigatório
200
  field_firstname: Nome
201
  field_lastname: Apelido
202
  field_mail: E-mail
203
  field_filename: Ficheiro
204
  field_filesize: Tamanho
205
  field_downloads: Downloads
206
  field_author: Autor
207
  field_created_on: Criado
208
  field_updated_on: Alterado
209
  field_field_format: Formato
210
  field_is_for_all: Para todos os projectos
211
  field_possible_values: Valores possíveis
212
  field_regexp: Expressão regular
213
  field_min_length: Tamanho mínimo
214
  field_max_length: Tamanho máximo
215
  field_value: Valor
216
  field_category: Categoria
217
  field_title: Título
218
  field_project: Projecto
219
  field_issue: Tarefa
220
  field_status: Estado
221
  field_notes: Notas
222
  field_is_closed: Tarefa fechada
223
  field_is_default: Valor por omissão
224
  field_tracker: Tipo
225
  field_subject: Assunto
226
  field_due_date: Data fim
227
  field_assigned_to: Atribuído a
228
  field_priority: Prioridade
229
  field_fixed_version: Versão
230
  field_user: Utilizador
231
  field_role: Função
232
  field_homepage: Página
233
  field_is_public: Público
234
  field_parent: Sub-projecto de
235
  field_is_in_roadmap: Tarefas mostradas no mapa de planificação
236
  field_login: Nome de utilizador
237
  field_mail_notification: Notificações por e-mail
238
  field_admin: Administrador
239
  field_last_login_on: Última visita
240
  field_language: Língua
241
  field_effective_date: Data
242
  field_password: Palavra-chave
243
  field_new_password: Nova palavra-chave
244
  field_password_confirmation: Confirmação
245
  field_version: Versão
246
  field_type: Tipo
247
  field_host: Servidor
248
  field_port: Porta
249
  field_account: Conta
250
  field_base_dn: Base DN
251
  field_attr_login: Atributo utilizador
252
  field_attr_firstname: Atributo nome próprio
253
  field_attr_lastname: Atributo último nome
254
  field_attr_mail: Atributo e-mail
255
  field_onthefly: Criação imediata de utilizadores
256
  field_start_date: Data início
257
  field_done_ratio: "% Completo"
258
  field_auth_source: Modo de autenticação
259
  field_hide_mail: Esconder endereço de e-mail
260
  field_comments: Comentário
261
  field_url: URL
262
  field_start_page: Página inicial
263
  field_subproject: Subprojecto
264
  field_hours: Horas
265
  field_activity: Actividade
266
  field_spent_on: Data
267
  field_identifier: Identificador
268
  field_is_filter: Usado como filtro
269
  field_issue_to: Tarefa relacionada
270
  field_delay: Atraso
271
  field_assignable: As tarefas podem ser associadas a esta função
272
  field_redirect_existing_links: Redireccionar ligações existentes
273
  field_estimated_hours: Tempo estimado
274
  field_column_names: Colunas
275
  field_time_zone: Fuso horário
276
  field_searchable: Procurável
277
  field_default_value: Valor por omissão
278
  field_comments_sorting: Mostrar comentários
279
  field_parent_title: Página pai
280

  
281
  setting_app_title: Título da aplicação
282
  setting_app_subtitle: Sub-título da aplicação
283
  setting_welcome_text: Texto de boas vindas
284
  setting_default_language: Língua por omissão
285
  setting_login_required: Autenticação obrigatória
286
  setting_self_registration: Auto-registo
287
  setting_attachment_max_size: Tamanho máximo do anexo
288
  setting_issues_export_limit: Limite de exportação das tarefas
289
  setting_mail_from: E-mail enviado de
290
  setting_bcc_recipients: Recipientes de BCC
291
  setting_host_name: Hostname
292
  setting_text_formatting: Formatação do texto
293
  setting_wiki_compression: Compressão do histórico do Wiki
294
  setting_feeds_limit: Limite de conteúdo do feed
295
  setting_default_projects_public: Projectos novos são públicos por omissão
296
  setting_autofetch_changesets: Buscar automaticamente commits
297
  setting_sys_api_enabled: Activar Web Service para gestão do repositório
298
  setting_commit_ref_keywords: Palavras-chave de referência
299
  setting_commit_fix_keywords: Palavras-chave de fecho
300
  setting_autologin: Login automático
301
  setting_date_format: Formato da data
302
  setting_time_format: Formato do tempo
303
  setting_cross_project_issue_relations: Permitir relações entre tarefas de projectos diferentes
304
  setting_issue_list_default_columns: Colunas na lista de tarefas por omissão
305
  setting_emails_footer: Rodapé do e-mails
306
  setting_protocol: Protocolo
307
  setting_per_page_options: Opções de objectos por página
308
  setting_user_format: Formato de apresentaão de utilizadores
309
  setting_activity_days_default: Dias mostrados na actividade do projecto
310
  setting_display_subprojects_issues: Mostrar as tarefas dos sub-projectos nos projectos principais
311
  setting_enabled_scm: Activar SCM
312
  setting_mail_handler_api_enabled: Activar Web Service para e-mails recebidos
313
  setting_mail_handler_api_key: Chave da API
314
  setting_sequential_project_identifiers: Gerar identificadores de projecto sequênciais
315

  
316
  project_module_issue_tracking: Tarefas
317
  project_module_time_tracking: Registo de tempo
318
  project_module_news: Notícias
319
  project_module_documents: Documentos
320
  project_module_files: Ficheiros
321
  project_module_wiki: Wiki
322
  project_module_repository: Repositório
323
  project_module_boards: Forum
324

  
325
  label_user: Utilizador
326
  label_user_plural: Utilizadores
327
  label_user_new: Novo utilizador
328
  label_project: Projecto
329
  label_project_new: Novo projecto
330
  label_project_plural: Projectos
331
  label_x_projects:
332
    zero:  no projects
333
    one:   1 project
334
    other: "%{count} projects"
335
  label_project_all: Todos os projectos
336
  label_project_latest: Últimos projectos
337
  label_issue: Tarefa
338
  label_issue_new: Nova tarefa
339
  label_issue_plural: Tarefas
340
  label_issue_view_all: Ver todas as tarefas
341
  label_issues_by: "Tarefas por %{value}"
342
  label_issue_added: Tarefa adicionada
343
  label_issue_updated: Tarefa actualizada
344
  label_document: Documento
345
  label_document_new: Novo documento
346
  label_document_plural: Documentos
347
  label_document_added: Documento adicionado
348
  label_role: Função
349
  label_role_plural: Funções
350
  label_role_new: Nova função
351
  label_role_and_permissions: Funções e permissões
352
  label_member: Membro
353
  label_member_new: Novo membro
354
  label_member_plural: Membros
355
  label_tracker: Tipo
356
  label_tracker_plural: Tipos
357
  label_tracker_new: Novo tipo
358
  label_workflow: Fluxo de trabalho
359
  label_issue_status: Estado da tarefa
360
  label_issue_status_plural: Estados da tarefa
361
  label_issue_status_new: Novo estado
362
  label_issue_category: Categoria de tarefa
363
  label_issue_category_plural: Categorias de tarefa
364
  label_issue_category_new: Nova categoria
365
  label_custom_field: Campo personalizado
366
  label_custom_field_plural: Campos personalizados
367
  label_custom_field_new: Novo campo personalizado
368
  label_enumerations: Enumerações
369
  label_enumeration_new: Novo valor
370
  label_information: Informação
371
  label_information_plural: Informações
372
  label_please_login: Por favor autentique-se
373
  label_register: Registar
374
  label_password_lost: Perdi a palavra-chave
375
  label_home: Página Inicial
376
  label_my_page: Página Pessoal
377
  label_my_account: Minha conta
378
  label_my_projects: Meus projectos
379
  label_administration: Administração
380
  label_login: Entrar
381
  label_logout: Sair
382
  label_help: Ajuda
383
  label_reported_issues: Tarefas criadas
384
  label_assigned_to_me_issues: Tarefas atribuídas a mim
385
  label_last_login: Último acesso
386
  label_registered_on: Registado em
387
  label_activity: Actividade
388
  label_overall_activity: Actividade geral
389
  label_new: Novo
390
  label_logged_as: Ligado como
391
  label_environment: Ambiente
392
  label_authentication: Autenticação
393
  label_auth_source: Modo de autenticação
394
  label_auth_source_new: Novo modo de autenticação
395
  label_auth_source_plural: Modos de autenticação
396
  label_subproject_plural: Sub-projectos
397
  label_and_its_subprojects: "%{value} e sub-projectos"
398
  label_min_max_length: Tamanho mínimo-máximo
399
  label_list: Lista
400
  label_date: Data
401
  label_integer: Inteiro
402
  label_float: Decimal
403
  label_boolean: Booleano
404
  label_string: Texto
405
  label_text: Texto longo
406
  label_attribute: Atributo
407
  label_attribute_plural: Atributos
408
  label_download: "%{count} Download"
409
  label_download_plural: "%{count} Downloads"
410
  label_no_data: Sem dados para mostrar
411
  label_change_status: Mudar estado
412
  label_history: Histórico
413
  label_attachment: Ficheiro
414
  label_attachment_new: Novo ficheiro
415
  label_attachment_delete: Apagar ficheiro
416
  label_attachment_plural: Ficheiros
417
  label_file_added: Ficheiro adicionado
418
  label_report: Relatório
419
  label_report_plural: Relatórios
420
  label_news: Notícia
421
  label_news_new: Nova notícia
422
  label_news_plural: Notícias
423
  label_news_latest: Últimas notícias
424
  label_news_view_all: Ver todas as notícias
425
  label_news_added: Notícia adicionada
426
  label_settings: Configurações
427
  label_overview: Visão geral
428
  label_version: Versão
429
  label_version_new: Nova versão
430
  label_version_plural: Versões
431
  label_confirmation: Confirmação
432
  label_export_to: 'Também disponível em:'
433
  label_read: Ler...
434
  label_public_projects: Projectos públicos
435
  label_open_issues: aberto
436
  label_open_issues_plural: abertos
437
  label_closed_issues: fechado
438
  label_closed_issues_plural: fechados
439
  label_x_open_issues_abbr_on_total:
440
    zero:  0 open / %{total}
441
    one:   1 open / %{total}
442
    other: "%{count} open / %{total}"
443
  label_x_open_issues_abbr:
444
    zero:  0 open
445
    one:   1 open
446
    other: "%{count} open"
447
  label_x_closed_issues_abbr:
448
    zero:  0 closed
449
    one:   1 closed
450
    other: "%{count} closed"
451
  label_total: Total
452
  label_permissions: Permissões
453
  label_current_status: Estado actual
454
  label_new_statuses_allowed: Novos estados permitidos
455
  label_all: todos
456
  label_none: nenhum
457
  label_nobody: ninguém
458
  label_next: Próximo
459
  label_previous: Anterior
460
  label_used_by: Usado por
461
  label_details: Detalhes
462
  label_add_note: Adicionar nota
463
  label_per_page: Por página
464
  label_calendar: Calendário
465
  label_months_from: meses de
466
  label_gantt: Gantt
467
  label_internal: Interno
468
  label_last_changes: "últimas %{count} alterações"
469
  label_change_view_all: Ver todas as alterações
470
  label_personalize_page: Personalizar esta página
471
  label_comment: Comentário
472
  label_comment_plural: Comentários
473
  label_x_comments:
474
    zero: no comments
475
    one: 1 comment
476
    other: "%{count} comments"
477
  label_comment_add: Adicionar comentário
478
  label_comment_added: Comentário adicionado
479
  label_comment_delete: Apagar comentários
480
  label_query: Consulta personalizada
481
  label_query_plural: Consultas personalizadas
482
  label_query_new: Nova consulta
483
  label_filter_add: Adicionar filtro
484
  label_filter_plural: Filtros
485
  label_equals: é
486
  label_not_equals: não é
487
  label_in_less_than: em menos de
488
  label_in_more_than: em mais de
489
  label_in: em
490
  label_today: hoje
491
  label_all_time: sempre
492
  label_yesterday: ontem
493
  label_this_week: esta semana
494
  label_last_week: semana passada
495
  label_last_n_days: "últimos %{count} dias"
496
  label_this_month: este mês
497
  label_last_month: mês passado
498
  label_this_year: este ano
499
  label_date_range: Date range
500
  label_less_than_ago: menos de dias atrás
501
  label_more_than_ago: mais de dias atrás
502
  label_ago: dias atrás
503
  label_contains: contém
504
  label_not_contains: não contém
505
  label_day_plural: dias
506
  label_repository: Repositório
507
  label_repository_plural: Repositórios
508
  label_browse: Navegar
509
  label_modification: "%{count} alteração"
510
  label_modification_plural: "%{count} alterações"
511
  label_revision: Revisão
512
  label_revision_plural: Revisões
513
  label_associated_revisions: Revisões associadas
514
  label_added: adicionado
515
  label_modified: modificado
516
  label_copied: copiado
517
  label_renamed: renomeado
518
  label_deleted: apagado
519
  label_latest_revision: Última revisão
520
  label_latest_revision_plural: Últimas revisões
521
  label_view_revisions: Ver revisões
522
  label_max_size: Tamanho máximo
523
  label_sort_highest: Mover para o início
524
  label_sort_higher: Mover para cima
525
  label_sort_lower: Mover para baixo
526
  label_sort_lowest: Mover para o fim
527
  label_roadmap: Planificação
528
  label_roadmap_due_in: "Termina em %{value}"
529
  label_roadmap_overdue: "Atrasado %{value}"
530
  label_roadmap_no_issues: Sem tarefas para esta versão
531
  label_search: Procurar
532
  label_result_plural: Resultados
533
  label_all_words: Todas as palavras
534
  label_wiki: Wiki
535
  label_wiki_edit: Edição da Wiki
536
  label_wiki_edit_plural: Edições da Wiki
537
  label_wiki_page: Página da Wiki
538
  label_wiki_page_plural: Páginas da Wiki
539
  label_index_by_title: Índice por título
540
  label_index_by_date: Índice por data
541
  label_current_version: Versão actual
542
  label_preview: Pré-visualizar
543
  label_feed_plural: Feeds
544
  label_changes_details: Detalhes de todas as mudanças
545
  label_issue_tracking: Tarefas
546
  label_spent_time: Tempo gasto
547
  label_f_hour: "%{value} hora"
548
  label_f_hour_plural: "%{value} horas"
549
  label_time_tracking: Registo de tempo
550
  label_change_plural: Mudanças
551
  label_statistics: Estatísticas
552
  label_commits_per_month: Commits por mês
553
  label_commits_per_author: Commits por autor
554
  label_view_diff: Ver diferenças
555
  label_diff_inline: inline
556
  label_diff_side_by_side: lado a lado
557
  label_options: Opções
558
  label_copy_workflow_from: Copiar fluxo de trabalho de
559
  label_permissions_report: Relatório de permissões
560
  label_watched_issues: Tarefas observadas
561
  label_related_issues: Tarefas relacionadas
562
  label_applied_status: Estado aplicado
563
  label_loading: A carregar...
564
  label_relation_new: Nova relação
565
  label_relation_delete: Apagar relação
566
  label_relates_to: relacionado a
567
  label_duplicates: duplica
568
  label_duplicated_by: duplicado por
569
  label_blocks: bloqueia
570
  label_blocked_by: bloqueado por
571
  label_precedes: precede
572
  label_follows: segue
573
  label_end_to_start: fim a início
574
  label_end_to_end: fim a fim
575
  label_start_to_start: início a início
576
  label_start_to_end: início a fim
577
  label_stay_logged_in: Guardar sessão
578
  label_disabled: desactivado
579
  label_show_completed_versions: Mostrar versões acabadas
580
  label_me: eu
581
  label_board: Forum
582
  label_board_new: Novo forum
583
  label_board_plural: Forums
584
  label_topic_plural: Tópicos
585
  label_message_plural: Mensagens
586
  label_message_last: Última mensagem
587
  label_message_new: Nova mensagem
588
  label_message_posted: Mensagem adicionada
589
  label_reply_plural: Respostas
590
  label_send_information: Enviar dados da conta para o utilizador
591
  label_year: Ano
592
  label_month: mês
593
  label_week: Semana
594
  label_date_from: De
595
  label_date_to: Para
596
  label_language_based: Baseado na língua do utilizador
597
  label_sort_by: "Ordenar por %{value}"
598
  label_send_test_email: enviar um e-mail de teste
599
  label_feeds_access_key_created_on: "Chave RSS criada há %{value} atrás"
600
  label_module_plural: Módulos
601
  label_added_time_by: "Adicionado por %{author} há %{age} atrás"
602
  label_updated_time: "Alterado há %{value} atrás"
603
  label_jump_to_a_project: Ir para o projecto...
604
  label_file_plural: Ficheiros
605
  label_changeset_plural: Changesets
606
  label_default_columns: Colunas por omissão
607
  label_no_change_option: (sem alteração)
608
  label_bulk_edit_selected_issues: Editar tarefas seleccionadas em conjunto
609
  label_theme: Tema
610
  label_default: Padrão
611
  label_search_titles_only: Procurar apenas em títulos
612
  label_user_mail_option_all: "Para qualquer evento em todos os meus projectos"
613
  label_user_mail_option_selected: "Para qualquer evento apenas nos projectos seleccionados..."
614
  label_user_mail_no_self_notified: "Não quero ser notificado de alterações feitas por mim"
615
  label_registration_activation_by_email: Activação da conta por e-mail
616
  label_registration_manual_activation: Activação manual da conta
617
  label_registration_automatic_activation: Activação automática da conta
618
  label_display_per_page: "Por página: %{value}"
619
  label_age: Idade
620
  label_change_properties: Mudar propriedades
621
  label_general: Geral
622
  label_more: Mais
623
  label_scm: SCM
624
  label_plugins: Extensões
625
  label_ldap_authentication: Autenticação LDAP
626
  label_downloads_abbr: D/L
627
  label_optional_description: Descrição opcional
628
  label_add_another_file: Adicionar outro ficheiro
629
  label_preferences: Preferências
630
  label_chronological_order: Em ordem cronológica
631
  label_reverse_chronological_order: Em ordem cronológica inversa
632
  label_planning: Planeamento
633
  label_incoming_emails: E-mails a chegar
634
  label_generate_key: Gerar uma chave
635
  label_issue_watchers: Observadores
636

  
637
  button_login: Entrar
638
  button_submit: Submeter
639
  button_save: Guardar
640
  button_check_all: Marcar tudo
641
  button_uncheck_all: Desmarcar tudo
642
  button_delete: Apagar
643
  button_create: Criar
644
  button_test: Testar
645
  button_edit: Editar
646
  button_add: Adicionar
647
  button_change: Alterar
648
  button_apply: Aplicar
649
  button_clear: Limpar
650
  button_lock: Bloquear
651
  button_unlock: Desbloquear
652
  button_download: Download
653
  button_list: Listar
654
  button_view: Ver
655
  button_move: Mover
656
  button_back: Voltar
657
  button_cancel: Cancelar
658
  button_activate: Activar
659
  button_sort: Ordenar
660
  button_log_time: Tempo de trabalho
661
  button_rollback: Voltar para esta versão
662
  button_watch: Observar
663
  button_unwatch: Deixar de observar
664
  button_reply: Responder
665
  button_archive: Arquivar
666
  button_unarchive: Desarquivar
667
  button_reset: Reinicializar
668
  button_rename: Renomear
669
  button_change_password: Mudar palavra-chave
670
  button_copy: Copiar
671
  button_annotate: Anotar
672
  button_update: Actualizar
673
  button_configure: Configurar
674
  button_quote: Citar
675

  
676
  status_active: activo
677
  status_registered: registado
678
  status_locked: bloqueado
679

  
680
  text_select_mail_notifications: Seleccionar as acções que originam uma notificação por e-mail.
681
  text_regexp_info: ex. ^[A-Z0-9]+$
682
  text_min_max_length_info: 0 siginifica sem restrição
683
  text_project_destroy_confirmation: Tem a certeza que deseja apagar o projecto e todos os dados relacionados?
684
  text_subprojects_destroy_warning: "O(s) seu(s) sub-projecto(s): %{value} também será/serão apagado(s)."
685
  text_workflow_edit: Seleccione uma função e um tipo de tarefa para editar o fluxo de trabalho
686
  text_are_you_sure: Tem a certeza?
687
  text_tip_issue_begin_day: tarefa a começar neste dia
688
  text_tip_issue_end_day: tarefa a acabar neste dia
689
  text_tip_issue_begin_end_day: tarefa a começar e acabar neste dia
690
  text_project_identifier_info: 'Apenas são permitidos letras minúsculas (a-z), números e hífens.<br />Uma vez guardado, o identificador não poderá ser alterado.'
691
  text_caracters_maximum: "máximo %{count} caracteres."
692
  text_caracters_minimum: "Deve ter pelo menos %{count} caracteres."
693
  text_length_between: "Deve ter entre %{min} e %{max} caracteres."
694
  text_tracker_no_workflow: Sem fluxo de trabalho definido para este tipo de tarefa.
695
  text_unallowed_characters: Caracteres não permitidos
696
  text_comma_separated: Permitidos múltiplos valores (separados por vírgula).
697
  text_issues_ref_in_commit_messages: Referenciando e fechando tarefas em mensagens de commit
698
  text_issue_added: "Tarefa %{id} foi criada por %{author}."
699
  text_issue_updated: "Tarefa %{id} foi actualizada por %{author}."
700
  text_wiki_destroy_confirmation: Tem a certeza que deseja apagar este wiki e todo o seu conteúdo?
701
  text_issue_category_destroy_question: "Algumas tarefas (%{count}) estão atribuídas a esta categoria. O que quer fazer?"
702
  text_issue_category_destroy_assignments: Remover as atribuições à categoria
703
  text_issue_category_reassign_to: Re-atribuir as tarefas para esta categoria
704
  text_user_mail_option: "Para projectos não seleccionados, apenas receberá notificações acerca de coisas que está a observar ou está envolvido (ex. tarefas das quais foi o criador ou lhes foram atribuídas)."
705
  text_no_configuration_data: "Perfis, tipos de tarefas, estados das tarefas e workflows ainda não foram configurados.\nÉ extremamente recomendado carregar as configurações padrão. Será capaz de as modificar depois de estarem carregadas."
706
  text_load_default_configuration: Carregar as configurações padrão
707
  text_status_changed_by_changeset: "Aplicado no changeset %{value}."
708
  text_issues_destroy_confirmation: 'Tem a certeza que deseja apagar a(s) tarefa(s) seleccionada(s)?'
709
  text_select_project_modules: 'Seleccione os módulos a activar para este projecto:'
710
  text_default_administrator_account_changed: Conta default de administrador alterada.
711
  text_file_repository_writable: Repositório de ficheiros com permissões de escrita
712
  text_rmagick_available: RMagick disponível (opcional)
713
  text_destroy_time_entries_question: "%{hours} horas de trabalho foram atribuídas a estas tarefas que vai apagar. O que deseja fazer?"
714
  text_destroy_time_entries: Apagar as horas
715
  text_assign_time_entries_to_project: Atribuir as horas ao projecto
716
  text_reassign_time_entries: 'Re-atribuir as horas para esta tarefa:'
717
  text_user_wrote: "%{value} escreveu:"
718
  text_enumeration_destroy_question: "%{count} objectos estão atribuídos a este valor."
719
  text_enumeration_category_reassign_to: 'Re-atribuí-los para este valor:'
720
  text_email_delivery_not_configured: "Entrega por e-mail não está configurada, e as notificação estão desactivadas.\nConfigure o seu servidor de SMTP em config/configuration.yml e reinicie a aplicação para activar estas funcionalidades."
721

  
722
  default_role_manager: Gestor
723
  default_role_developer: Programador
724
  default_role_reporter: Repórter
725
  default_tracker_bug: Bug
726
  default_tracker_feature: Funcionalidade
727
  default_tracker_support: Suporte
728
  default_issue_status_new: Novo
729
  default_issue_status_in_progress: Em curso
730
  default_issue_status_resolved: Resolvido
731
  default_issue_status_feedback: Feedback
732
  default_issue_status_closed: Fechado
733
  default_issue_status_rejected: Rejeitado
734
  default_doc_category_user: Documentação de utilizador
735
  default_doc_category_tech: Documentação técnica
736
  default_priority_low: Baixa
737
  default_priority_normal: Normal
738
  default_priority_high: Alta
739
  default_priority_urgent: Urgente
740
  default_priority_immediate: Imediata
741
  default_activity_design: Planeamento
742
  default_activity_development: Desenvolvimento
743

  
744
  enumeration_issue_priorities: Prioridade de tarefas
745
  enumeration_doc_categories: Categorias de documentos
746
  enumeration_activities: Actividades (Registo de tempo)
747
  setting_plain_text_mail: Apenas texto simples (sem HTML)
748
  permission_view_files: Ver ficheiros
749
  permission_edit_issues: Editar tarefas
750
  permission_edit_own_time_entries: Editar horas pessoais
751
  permission_manage_public_queries: Gerir queries públicas
752
  permission_add_issues: Adicionar tarefas
753
  permission_log_time: Registar tempo gasto
754
  permission_view_changesets: Ver changesets
755
  permission_view_time_entries: Ver tempo gasto
756
  permission_manage_versions: Gerir versões
757
  permission_manage_wiki: Gerir wiki
758
  permission_manage_categories: Gerir categorias de tarefas
759
  permission_protect_wiki_pages: Proteger páginas de wiki
760
  permission_comment_news: Comentar notícias
761
  permission_delete_messages: Apagar mensagens
762
  permission_select_project_modules: Seleccionar módulos do projecto
763
  permission_manage_documents: Gerir documentos
764
  permission_edit_wiki_pages: Editar páginas de wiki
765
  permission_add_issue_watchers: Adicionar observadores
766
  permission_view_gantt: ver diagrama de Gantt
767
  permission_move_issues: Mover tarefas
768
  permission_manage_issue_relations: Gerir relações de tarefas
769
  permission_delete_wiki_pages: Apagar páginas de wiki
770
  permission_manage_boards: Gerir forums
771
  permission_delete_wiki_pages_attachments: Apagar anexos
772
  permission_view_wiki_edits: Ver histórico da wiki
773
  permission_add_messages: Submeter mensagens
774
  permission_view_messages: Ver mensagens
775
  permission_manage_files: Gerir ficheiros
776
  permission_edit_issue_notes: Editar notas de tarefas
777
  permission_manage_news: Gerir notícias
778
  permission_view_calendar: Ver calendário
779
  permission_manage_members: Gerir membros
780
  permission_edit_messages: Editar mensagens
781
  permission_delete_issues: Apagar tarefas
782
  permission_view_issue_watchers: Ver lista de observadores
783
  permission_manage_repository: Gerir repositório
784
  permission_commit_access: Acesso a submissão
785
  permission_browse_repository: Navegar em repositório
786
  permission_view_documents: Ver documentos
787
  permission_edit_project: Editar projecto
788
  permission_add_issue_notes: Adicionar notas a tarefas
789
  permission_save_queries: Guardar queries
790
  permission_view_wiki_pages: Ver wiki
791
  permission_rename_wiki_pages: Renomear páginas de wiki
792
  permission_edit_time_entries: Editar entradas de tempo
793
  permission_edit_own_issue_notes: Editar as prórpias notas
794
  setting_gravatar_enabled: Utilizar ícones Gravatar
795
  label_example: Exemplo
796
  text_repository_usernames_mapping: "Seleccionar ou actualizar o utilizador de Redmine mapeado a cada nome de utilizador encontrado no repositório.\nUtilizadores com o mesmo nome de utilizador ou email no Redmine e no repositório são mapeados automaticamente."
797
  permission_edit_own_messages: Editar as próprias mensagens
798
  permission_delete_own_messages: Apagar as próprias mensagens
799
  label_user_activity: "Actividade de %{value}"
800
  label_updated_time_by: "Actualizado por %{author} há %{age}"
801
  text_diff_truncated: '... Este diff foi truncado porque excede o tamanho máximo que pode ser mostrado.'
802
  setting_diff_max_lines_displayed: Número máximo de linhas de diff mostradas
803
  text_plugin_assets_writable: Escrita na pasta de activos dos módulos de extensão possível
804
  warning_attachments_not_saved: "Não foi possível gravar %{count} ficheiro(s) ."
805
  button_create_and_continue: Criar e continuar
806
  text_custom_field_possible_values_info: 'Uma linha para cada valor'
807
  label_display: Mostrar
808
  field_editable: Editável
809
  setting_repository_log_display_limit: Número máximo de revisões exibido no relatório de ficheiro
810
  setting_file_max_size_displayed: Tamanho máximo dos ficheiros de texto exibidos inline
811
  field_watcher: Observador
812
  setting_openid: Permitir início de sessão e registo com OpenID
813
  field_identity_url: URL do OpenID
814
  label_login_with_open_id_option: ou início de sessão com OpenID
815
  field_content: Conteúdo
816
  label_descending: Descendente
817
  label_sort: Ordenar
818
  label_ascending: Ascendente
819
  label_date_from_to: De %{start} a %{end}
820
  label_greater_or_equal: ">="
821
  label_less_or_equal: <=
822
  text_wiki_page_destroy_question: Esta página tem %{descendants} página(s) subordinada(s) e descendente(s). O que deseja fazer?
823
  text_wiki_page_reassign_children: Reatribuir páginas subordinadas a esta página principal
824
  text_wiki_page_nullify_children: Manter páginas subordinadas como páginas raíz
825
  text_wiki_page_destroy_children: Apagar as páginas subordinadas e todos os seus descendentes
826
  setting_password_min_length: Tamanho mínimo de palavra-chave
827
  field_group_by: Agrupar resultados por
828
  mail_subject_wiki_content_updated: "A página Wiki '%{id}' foi actualizada"
829
  label_wiki_content_added: Página Wiki adicionada
830
  mail_subject_wiki_content_added: "A página Wiki '%{id}' foi adicionada"
831
  mail_body_wiki_content_added: A página Wiki '%{id}' foi adicionada por %{author}.
832
  label_wiki_content_updated: Página Wiki actualizada
833
  mail_body_wiki_content_updated: A página Wiki '%{id}' foi actualizada por %{author}.
834
  permission_add_project: Criar projecto
835
  setting_new_project_user_role_id: Função atribuída a um utilizador não-administrador que cria um projecto
836
  label_view_all_revisions: Ver todas as revisões
837
  label_tag: Etiqueta
838
  label_branch: Ramo
839
  error_no_tracker_in_project: Este projecto não tem associado nenhum tipo de tarefas. Verifique as definições do projecto.
840
  error_no_default_issue_status: Não está definido um estado padrão para as tarefas. Verifique a sua configuração (dirija-se a "Administração -> Estados da tarefa").
841
  label_group_plural: Grupos
842
  label_group: Grupo
843
  label_group_new: Novo grupo
844
  label_time_entry_plural: Tempo registado
845
  text_journal_changed: "%{label} alterado de %{old} para %{new}"
846
  text_journal_set_to: "%{label} configurado como %{value}"
847
  text_journal_deleted: "%{label} apagou (%{old})"
848
  text_journal_added: "%{label} %{value} adicionado"
849
  field_active: Activo
850
  enumeration_system_activity: Actividade de sistema
851
  permission_delete_issue_watchers: Apagar observadores
852
  version_status_closed: fechado
853
  version_status_locked: protegido
854
  version_status_open: aberto
855
  error_can_not_reopen_issue_on_closed_version: Não é possível voltar a abrir uma tarefa atribuída a uma versão fechada
856
  label_user_anonymous: Anónimo
857
  button_move_and_follow: Mover e seguir
858
  setting_default_projects_modules: Módulos activos por predefinição para novos projectos
859
  setting_gravatar_default: Imagem Gravatar predefinida
860
  field_sharing: Partilha
861
  label_version_sharing_hierarchy: Com hierarquia do projecto
862
  label_version_sharing_system: Com todos os projectos
863
  label_version_sharing_descendants: Com os sub-projectos
864
  label_version_sharing_tree: Com árvore do projecto
865
  label_version_sharing_none: Não partilhado
866
  error_can_not_archive_project: Não é possível arquivar este projecto
867
  button_duplicate: Duplicar
868
  button_copy_and_follow: Copiar e seguir
869
  label_copy_source: Origem
870
  setting_issue_done_ratio: Calcular a percentagem de progresso da tarefa
871
  setting_issue_done_ratio_issue_status: Através do estado da tarefa
872
  error_issue_done_ratios_not_updated: Percentagens de progresso da tarefa não foram actualizadas.
873
  error_workflow_copy_target: Seleccione os tipos de tarefas e funções desejadas
874
  setting_issue_done_ratio_issue_field: Através do campo da tarefa
875
  label_copy_same_as_target: Mesmo que o alvo
876
  label_copy_target: Alvo
877
  notice_issue_done_ratios_updated: Percentagens de progresso da tarefa actualizadas.
878
  error_workflow_copy_source: Seleccione um tipo de tarefa ou função de origem
879
  label_update_issue_done_ratios: Actualizar percentagens de progresso da tarefa
880
  setting_start_of_week: Iniciar calendários a
881
  permission_view_issues: Ver tarefas
882
  label_display_used_statuses_only: Só exibir estados empregues por este tipo de tarefa
883
  label_revision_id: Revisão %{value}
884
  label_api_access_key: Chave de acesso API
885
  label_api_access_key_created_on: Chave de acesso API criada há %{value}
886
  label_feeds_access_key: Chave de acesso RSS
887
  notice_api_access_key_reseted: A sua chave de acesso API foi reinicializada.
888
  setting_rest_api_enabled: Activar serviço Web REST
889
  label_missing_api_access_key: Chave de acesso API em falta
890
  label_missing_feeds_access_key: Chave de acesso RSS em falta
891
  button_show: Mostrar
892
  text_line_separated: Vários valores permitidos (uma linha para cada valor).
893
  setting_mail_handler_body_delimiters: Truncar mensagens de correio electrónico após uma destas linhas
894
  permission_add_subprojects: Criar sub-projectos
895
  label_subproject_new: Novo sub-projecto
896
  text_own_membership_delete_confirmation: |-
897
    Está prestes a eliminar parcial ou totalmente as suas permissões. É possível que não possa editar o projecto após esta acção.
898
    Tem a certeza de que deseja continuar?
899
  label_close_versions: Fechar versões completas
900
  label_board_sticky: Fixar mensagem
901
  label_board_locked: Proteger
902
  permission_export_wiki_pages: Exportar páginas Wiki
903
  setting_cache_formatted_text: Colocar formatação do texto na memória cache
904
  permission_manage_project_activities: Gerir actividades do projecto
905
  error_unable_delete_issue_status: Não foi possível apagar o estado da tarefa
906
  label_profile: Perfil
907
  permission_manage_subtasks: Gerir sub-tarefas
908
  field_parent_issue: Tarefa principal
909
  label_subtask_plural: Sub-tarefa
910
  label_project_copy_notifications: Enviar notificações por e-mail durante a cópia do projecto
911
  error_can_not_delete_custom_field: Não foi possível apagar o campo personalizado
912
  error_unable_to_connect: Não foi possível ligar (%{value})
913
  error_can_not_remove_role: Esta função está actualmente em uso e não pode ser apagada.
914
  error_can_not_delete_tracker: Existem ainda tarefas nesta categoria. Não é possível apagar este tipo de tarefa.
915
  field_principal: Principal
916
  label_my_page_block: Bloco da minha página
917
  notice_failed_to_save_members: "Erro ao guardar o(s) membro(s): %{errors}."
918
  text_zoom_out: Ampliar
919
  text_zoom_in: Reduzir
920
  notice_unable_delete_time_entry: Não foi possível apagar a entrada de tempo registado.
921
  label_overall_spent_time: Total de tempo registado
922
  field_time_entries: Tempo registado
923
  project_module_gantt: Gantt
924
  project_module_calendar: Calendário
925
  button_edit_associated_wikipage: "Editar página Wiki associada: %{page_title}"
926
  text_are_you_sure_with_children: Apagar tarefa e todas as sub-tarefas?
927
  field_text: Campo de texto
928
  label_user_mail_option_only_owner: Apenas para tarefas das quais sou proprietário
929
  setting_default_notification_option: Opção predefinida de notificação
930
  label_user_mail_option_only_my_events: Apenas para tarefas que observo ou em que estou envolvido
931
  label_user_mail_option_only_assigned: Apenas para tarefas que me foram atribuídas
932
  label_user_mail_option_none: Sem eventos
933
  field_member_of_group: Grupo do detentor de atribuição
934
  field_assigned_to_role: Papel do detentor de atribuição
935
  notice_not_authorized_archived_project: O projecto a que tentou aceder foi arquivado.
936
  label_principal_search: "Procurar utilizador ou grupo:"
937
  label_user_search: "Procurar utilizador:"
938
  field_visible: Visível
939
  setting_emails_header: Cabeçalho dos e-mails
940
  setting_commit_logtime_activity_id: Actividade para tempo registado
941
  text_time_logged_by_changeset: Aplicado no conjunto de alterações %{value}.
942
  setting_commit_logtime_enabled: Activar registo de tempo
943
  notice_gantt_chart_truncated: O gráfico foi truncado porque excede o número máximo de itens visível (%{máx.})
944
  setting_gantt_items_limit: Número máximo de itens exibidos no gráfico Gantt
945
  field_warn_on_leaving_unsaved: Warn me when leaving a page with unsaved text
946
  text_warn_on_leaving_unsaved: The current page contains unsaved text that will be lost if you leave this page.
947
  label_my_queries: My custom queries
948
  text_journal_changed_no_detail: "%{label} updated"
949
  label_news_comment_added: Comment added to a news
950
  button_expand_all: Expand all
951
  button_collapse_all: Collapse all
952
  label_additional_workflow_transitions_for_assignee: Additional transitions allowed when the user is the assignee
953
  label_additional_workflow_transitions_for_author: Additional transitions allowed when the user is the author
954
  label_bulk_edit_selected_time_entries: Bulk edit selected time entries
955
  text_time_entries_destroy_confirmation: Are you sure you want to delete the selected time entr(y/ies)?
956
  label_role_anonymous: Anonymous
957
  label_role_non_member: Non member
958
  label_issue_note_added: Note added
959
  label_issue_status_updated: Status updated
960
  label_issue_priority_updated: Priority updated
961
  label_issues_visibility_own: Issues created by or assigned to the user
962
  field_issues_visibility: Issues visibility
963
  label_issues_visibility_all: All issues
964
  permission_set_own_issues_private: Set own issues public or private
965
  field_is_private: Private
966
  permission_set_issues_private: Set issues public or private
967
  label_issues_visibility_public: All non private issues
968
  text_issues_destroy_descendants_confirmation: This will also delete %{count} subtask(s).
969
  field_commit_logs_encoding: Encoding das mensagens de commit
970
  field_scm_path_encoding: Path encoding
971
  text_scm_path_encoding_note: "Default: UTF-8"
972
  field_path_to_repository: Path to repository
973
  field_root_directory: Root directory
974
  field_cvs_module: Module
975
  field_cvsroot: CVSROOT
976
  text_mercurial_repository_note: Local repository (e.g. /hgrepo, c:\hgrepo)
977
  text_scm_command: Command
978
  text_scm_command_version: Version
979
  label_git_report_last_commit: Report last commit for files and directories
980
  text_scm_config: You can configure your scm commands in config/configuration.yml. Please restart the application after editing it.
981
  text_scm_command_not_available: Scm command is not available. Please check settings on the administration panel.
982
  notice_issue_successful_create: Issue %{id} created.
983
  label_between: between
984
  setting_issue_group_assignment: Allow issue assignment to groups
985
  label_diff: diff
986
  text_git_repository_note: Repository is bare and local (e.g. /gitrepo, c:\gitrepo)
987
  description_query_sort_criteria_direction: Sort direction
988
  description_project_scope: Search scope
989
  description_filter: Filter
990
  description_user_mail_notification: Mail notification settings
991
  description_date_from: Enter start date
992
  description_message_content: Message content
993
  description_available_columns: Available Columns
994
  description_date_range_interval: Choose range by selecting start and end date
995
  description_issue_category_reassign: Choose issue category
996
  description_search: Searchfield
997
  description_notes: Notes
998
  description_date_range_list: Choose range from list
999
  description_choose_project: Projects
1000
  description_date_to: Enter end date
1001
  description_query_sort_criteria_attribute: Sort attribute
1002
  description_wiki_subpages_reassign: Choose new parent page
1003
  description_selected_columns: Selected Columns
1004
  label_parent_revision: Parent
1005
  label_child_revision: Child
1006
  error_scm_annotate_big_text_file: The entry cannot be annotated, as it exceeds the maximum text file size.
1007
  setting_default_issue_start_date_to_creation_date: Use current date as start date for new issues
1008
  button_edit_section: Edit this section
1009
  setting_repositories_encodings: Attachments and repositories encodings
1010
  description_all_columns: All Columns
1011
  button_export: Export
1012
  label_export_options: "%{export_format} export options"
1013
  error_attachment_too_big: This file cannot be uploaded because it exceeds the maximum allowed file size (%{max_size})
.svn/pristine/4f/4f68d76f852340754bcbaa389f8acdaba7e60be4.svn-base
1
# Redmine - project management software
2
# Copyright (C) 2006-2013  Jean-Philippe Lang
3
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17

  
18
require File.expand_path('../../test_helper', __FILE__)
19

  
20
class ProjectEnumerationsControllerTest < ActionController::TestCase
21
  fixtures :projects, :trackers, :issue_statuses, :issues,
22
           :enumerations, :users, :issue_categories,
23
           :projects_trackers,
24
           :roles,
25
           :member_roles,
26
           :members,
27
           :enabled_modules,
28
           :custom_fields, :custom_fields_projects,
29
           :custom_fields_trackers, :custom_values,
30
           :time_entries
31

  
32
  self.use_transactional_fixtures = false
33

  
34
  def setup
35
    @request.session[:user_id] = nil
36
    Setting.default_language = 'en'
37
  end
38

  
39
  def test_update_to_override_system_activities
40
    @request.session[:user_id] = 2 # manager
41
    billable_field = TimeEntryActivityCustomField.find_by_name("Billable")
42

  
43
    put :update, :project_id => 1, :enumerations => {
44
      "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # Design, De-activate
45
      "10"=> {"parent_id"=>"10", "custom_field_values"=>{"7"=>"0"}, "active"=>"1"}, # Development, Change custom value
46
      "14"=>{"parent_id"=>"14", "custom_field_values"=>{"7"=>"1"}, "active"=>"1"}, # Inactive Activity, Activate with custom value
47
      "11"=>{"parent_id"=>"11", "custom_field_values"=>{"7"=>"1"}, "active"=>"1"} # QA, no changes
48
    }
49

  
50
    assert_response :redirect
51
    assert_redirected_to '/projects/ecookbook/settings/activities'
52

  
53
    # Created project specific activities...
54
    project = Project.find('ecookbook')
55

  
56
    # ... Design
57
    design = project.time_entry_activities.find_by_name("Design")
58
    assert design, "Project activity not found"
59

  
60
    assert_equal 9, design.parent_id # Relate to the system activity
61
    assert_not_equal design.parent.id, design.id # Different records
62
    assert_equal design.parent.name, design.name # Same name
63
    assert !design.active?
64

  
65
    # ... Development
66
    development = project.time_entry_activities.find_by_name("Development")
67
    assert development, "Project activity not found"
68

  
69
    assert_equal 10, development.parent_id # Relate to the system activity
70
    assert_not_equal development.parent.id, development.id # Different records
71
    assert_equal development.parent.name, development.name # Same name
72
    assert development.active?
73
    assert_equal "0", development.custom_value_for(billable_field).value
74

  
75
    # ... Inactive Activity
76
    previously_inactive = project.time_entry_activities.find_by_name("Inactive Activity")
77
    assert previously_inactive, "Project activity not found"
78

  
79
    assert_equal 14, previously_inactive.parent_id # Relate to the system activity
80
    assert_not_equal previously_inactive.parent.id, previously_inactive.id # Different records
81
    assert_equal previously_inactive.parent.name, previously_inactive.name # Same name
82
    assert previously_inactive.active?
83
    assert_equal "1", previously_inactive.custom_value_for(billable_field).value
84

  
85
    # ... QA
86
    assert_equal nil, project.time_entry_activities.find_by_name("QA"), "Custom QA activity created when it wasn't modified"
87
  end
88

  
89
  def test_update_will_update_project_specific_activities
90
    @request.session[:user_id] = 2 # manager
91

  
92
    project_activity = TimeEntryActivity.new({
93
                                               :name => 'Project Specific',
94
                                               :parent => TimeEntryActivity.first,
95
                                               :project => Project.find(1),
96
                                               :active => true
97
                                             })
98
    assert project_activity.save
99
    project_activity_two = TimeEntryActivity.new({
100
                                                   :name => 'Project Specific Two',
101
                                                   :parent => TimeEntryActivity.last,
102
                                                   :project => Project.find(1),
103
                                                   :active => true
104
                                                 })
105
    assert project_activity_two.save
106

  
107

  
108
    put :update, :project_id => 1, :enumerations => {
109
      project_activity.id => {"custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # De-activate
110
      project_activity_two.id => {"custom_field_values"=>{"7" => "1"}, "active"=>"0"} # De-activate
111
    }
112

  
113
    assert_response :redirect
114
    assert_redirected_to '/projects/ecookbook/settings/activities'
115

  
116
    # Created project specific activities...
117
    project = Project.find('ecookbook')
118
    assert_equal 2, project.time_entry_activities.count
119

  
120
    activity_one = project.time_entry_activities.find_by_name(project_activity.name)
121
    assert activity_one, "Project activity not found"
122
    assert_equal project_activity.id, activity_one.id
123
    assert !activity_one.active?
124

  
125
    activity_two = project.time_entry_activities.find_by_name(project_activity_two.name)
126
    assert activity_two, "Project activity not found"
127
    assert_equal project_activity_two.id, activity_two.id
128
    assert !activity_two.active?
129
  end
130

  
131
  def test_update_when_creating_new_activities_will_convert_existing_data
132
    assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size
133

  
134
    @request.session[:user_id] = 2 # manager
135
    put :update, :project_id => 1, :enumerations => {
136
      "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"} # Design, De-activate
137
    }
138
    assert_response :redirect
139

  
140
    # No more TimeEntries using the system activity
141
    assert_equal 0, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "Time Entries still assigned to system activities"
142
    # All TimeEntries using project activity
143
    project_specific_activity = TimeEntryActivity.find_by_parent_id_and_project_id(9, 1)
144
    assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(project_specific_activity.id, 1).size, "No Time Entries assigned to the project activity"
145
  end
146

  
147
  def test_update_when_creating_new_activities_will_not_convert_existing_data_if_an_exception_is_raised
148
    # TODO: Need to cause an exception on create but these tests
149
    # aren't setup for mocking.  Just create a record now so the
150
    # second one is a dupicate
151
    parent = TimeEntryActivity.find(9)
152
    TimeEntryActivity.create!({:name => parent.name, :project_id => 1, :position => parent.position, :active => true})
153
    TimeEntry.create!({:project_id => 1, :hours => 1.0, :user => User.find(1), :issue_id => 3, :activity_id => 10, :spent_on => '2009-01-01'})
154

  
155
    assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size
156
    assert_equal 1, TimeEntry.find_all_by_activity_id_and_project_id(10, 1).size
157

  
158
    @request.session[:user_id] = 2 # manager
159
    put :update, :project_id => 1, :enumerations => {
160
      "9"=> {"parent_id"=>"9", "custom_field_values"=>{"7" => "1"}, "active"=>"0"}, # Design
161
      "10"=> {"parent_id"=>"10", "custom_field_values"=>{"7"=>"0"}, "active"=>"1"} # Development, Change custom value
162
    }
163
    assert_response :redirect
164

  
165
    # TimeEntries shouldn't have been reassigned on the failed record
166
    assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "Time Entries are not assigned to system activities"
167
    # TimeEntries shouldn't have been reassigned on the saved record either
168
    assert_equal 1, TimeEntry.find_all_by_activity_id_and_project_id(10, 1).size, "Time Entries are not assigned to system activities"
169
  end
170

  
171
  def test_destroy
172
    @request.session[:user_id] = 2 # manager
173
    project_activity = TimeEntryActivity.new({
174
                                               :name => 'Project Specific',
175
                                               :parent => TimeEntryActivity.first,
176
                                               :project => Project.find(1),
177
                                               :active => true
178
                                             })
179
    assert project_activity.save
180
    project_activity_two = TimeEntryActivity.new({
181
                                                   :name => 'Project Specific Two',
182
                                                   :parent => TimeEntryActivity.last,
183
                                                   :project => Project.find(1),
184
                                                   :active => true
185
                                                 })
186
    assert project_activity_two.save
187

  
188
    delete :destroy, :project_id => 1
189
    assert_response :redirect
190
    assert_redirected_to '/projects/ecookbook/settings/activities'
191

  
192
    assert_nil TimeEntryActivity.find_by_id(project_activity.id)
193
    assert_nil TimeEntryActivity.find_by_id(project_activity_two.id)
194
  end
195

  
196
  def test_destroy_should_reassign_time_entries_back_to_the_system_activity
197
    @request.session[:user_id] = 2 # manager
198
    project_activity = TimeEntryActivity.new({
199
                                               :name => 'Project Specific Design',
200
                                               :parent => TimeEntryActivity.find(9),
201
                                               :project => Project.find(1),
202
                                               :active => true
203
                                             })
204
    assert project_activity.save
205
    assert TimeEntry.update_all("activity_id = '#{project_activity.id}'", ["project_id = ? AND activity_id = ?", 1, 9])
206
    assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(project_activity.id, 1).size
207

  
208
    delete :destroy, :project_id => 1
209
    assert_response :redirect
210
    assert_redirected_to '/projects/ecookbook/settings/activities'
211

  
212
    assert_nil TimeEntryActivity.find_by_id(project_activity.id)
213
    assert_equal 0, TimeEntry.find_all_by_activity_id_and_project_id(project_activity.id, 1).size, "TimeEntries still assigned to project specific activity"
214
    assert_equal 3, TimeEntry.find_all_by_activity_id_and_project_id(9, 1).size, "TimeEntries still assigned to project specific activity"
215
  end
216

  
217
end
.svn/pristine/4f/4f7c43bee38a0086927663fbc7e435338678ebfe.svn-base
1
<h2><%=l(:label_version)%></h2>
2

  
3
<% labelled_tabular_form_for @version do |f| %>
4
<%= render :partial => 'form', :locals => { :f => f } %>
5
<%= submit_tag l(:button_save) %>
6
<% end %>
7

  
.svn/pristine/4f/4f91e1e0bb038b11d88f8da5ac2ec5d27ca2031c.svn-base
1
# Redmine - project management software
2
# Copyright (C) 2006-2011  Jean-Philippe Lang
3
#
4
# This program is free software; you can redistribute it and/or
5
# modify it under the terms of the GNU General Public License
6
# as published by the Free Software Foundation; either version 2
7
# of the License, or (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17

  
18
class UserCustomField < CustomField
19
  def type_name
20
    :label_user_plural
21
  end
22
end
23

  
.svn/pristine/4f/4f9b6989936a59570ee254faff0b99a606637086.svn-base
1
class InsertBuiltinRoles < ActiveRecord::Migration
2
  def self.up
3
    nonmember = Role.new(:name => 'Non member', :position => 0)
4
    nonmember.builtin = Role::BUILTIN_NON_MEMBER
5
    nonmember.save
6

  
7
    anonymous = Role.new(:name => 'Anonymous', :position => 0)
8
    anonymous.builtin = Role::BUILTIN_ANONYMOUS
9
    anonymous.save
10
  end
11

  
12
  def self.down
13
    Role.destroy_all 'builtin <> 0'
14
  end
15
end
.svn/pristine/4f/4fb5582b9423d32809fbaa513dda130c44491b13.svn-base
1
desc 'Generates a configuration file for cookie store sessions.'
2

  
3
file 'config/initializers/session_store.rb' do
4
  path = File.join(Rails.root, 'config', 'initializers', 'session_store.rb')
5
  secret = ActiveSupport::SecureRandom.hex(40)
6
  File.open(path, 'w') do |f|
7
    f.write <<"EOF"
8
# This file was generated by 'rake config/initializers/session_store.rb',
9
# and should not be made visible to public.
10
# If you have a load-balancing Redmine cluster, you will need to use the
11
# same version of this file on each machine. And be sure to restart your
12
# server when you modify this file.
13

  
14
# Your secret key for verifying cookie session data integrity. If you
15
# change this key, all old sessions will become invalid! Make sure the
16
# secret is at least 30 characters and all random, no regular words or
17
# you'll be exposed to dictionary attacks.
18
ActionController::Base.session = {
19
  :key => '_redmine_session',
20
  #
21
  # Uncomment and edit the :session_path below if are hosting your Redmine
22
  # at a suburi and don't want the top level path to access the cookies
23
  #
24
  # See: http://www.redmine.org/issues/3968
25
  #
26
  # :session_path => '/url_path_to/your/redmine/',
27
  :secret => '#{secret}'
28
}
29
EOF
30
  end
31
end
32

  
33
desc 'Generates a configuration file for cookie store sessions.'
34
task :generate_session_store => ['config/initializers/session_store.rb']
.svn/pristine/4f/4fb8c835126f8a63271f8bd86689461f1834a855.svn-base
1
--- 
2
roles_001: 
3
  name: Manager
4
  id: 1
5
  builtin: 0
6
  issues_visibility: all
7
  permissions: |
8
    --- 
9
    - :add_project
10
    - :edit_project
11
    - :close_project
12
    - :select_project_modules
13
    - :manage_members
14
    - :manage_versions
15
    - :manage_categories
16
    - :view_issues
17
    - :add_issues
18
    - :edit_issues
19
    - :manage_issue_relations
20
    - :manage_subtasks
21
    - :add_issue_notes
22
    - :move_issues
23
    - :delete_issues
24
    - :view_issue_watchers
25
    - :add_issue_watchers
26
    - :set_issues_private
27
    - :set_notes_private
28
    - :view_private_notes
29
    - :delete_issue_watchers
30
    - :manage_public_queries
31
    - :save_queries
32
    - :view_gantt
33
    - :view_calendar
34
    - :log_time
35
    - :view_time_entries
36
    - :edit_time_entries
37
    - :delete_time_entries
38
    - :manage_news
39
    - :comment_news
40
    - :view_documents
41
    - :add_documents
42
    - :edit_documents
43
    - :delete_documents
44
    - :view_wiki_pages
45
    - :export_wiki_pages
46
    - :view_wiki_edits
47
    - :edit_wiki_pages
48
    - :delete_wiki_pages_attachments
49
    - :protect_wiki_pages
50
    - :delete_wiki_pages
51
    - :rename_wiki_pages
52
    - :add_messages
53
    - :edit_messages
54
    - :delete_messages
55
    - :manage_boards
56
    - :view_files
57
    - :manage_files
58
    - :browse_repository
59
    - :manage_repository
60
    - :view_changesets
61
    - :manage_related_issues
62
    - :manage_project_activities
63

  
64
  position: 1
65
roles_002: 
66
  name: Developer
67
  id: 2
68
  builtin: 0
69
  issues_visibility: default
70
  permissions: |
71
    --- 
72
    - :edit_project
73
    - :manage_members
74
    - :manage_versions
75
    - :manage_categories
76
    - :view_issues
77
    - :add_issues
78
    - :edit_issues
79
    - :manage_issue_relations
80
    - :manage_subtasks
81
    - :add_issue_notes
82
    - :move_issues
83
    - :delete_issues
84
    - :view_issue_watchers
85
    - :save_queries
86
    - :view_gantt
87
    - :view_calendar
88
    - :log_time
89
    - :view_time_entries
90
    - :edit_own_time_entries
91
    - :manage_news
92
    - :comment_news
93
    - :view_documents
94
    - :add_documents
95
    - :edit_documents
96
    - :delete_documents
97
    - :view_wiki_pages
98
    - :view_wiki_edits
99
    - :edit_wiki_pages
100
    - :protect_wiki_pages
101
    - :delete_wiki_pages
102
    - :add_messages
103
    - :edit_own_messages
104
    - :delete_own_messages
105
    - :manage_boards
106
    - :view_files
107
    - :manage_files
108
    - :browse_repository
109
    - :view_changesets
110

  
111
  position: 2
112
roles_003: 
113
  name: Reporter
114
  id: 3
115
  builtin: 0
116
  issues_visibility: default
117
  permissions: |
118
    --- 
119
    - :edit_project
120
    - :manage_members
121
    - :manage_versions
122
    - :manage_categories
123
    - :view_issues
124
    - :add_issues
125
    - :edit_issues
126
    - :manage_issue_relations
127
    - :add_issue_notes
128
    - :move_issues
129
    - :view_issue_watchers
130
    - :save_queries
131
    - :view_gantt
132
    - :view_calendar
133
    - :log_time
134
    - :view_time_entries
135
    - :manage_news
136
    - :comment_news
137
    - :view_documents
138
    - :add_documents
139
    - :edit_documents
140
    - :delete_documents
141
    - :view_wiki_pages
142
    - :view_wiki_edits
143
    - :edit_wiki_pages
144
    - :delete_wiki_pages
145
    - :add_messages
146
    - :manage_boards
147
    - :view_files
148
    - :manage_files
149
    - :browse_repository
150
    - :view_changesets
151

  
152
  position: 3
153
roles_004: 
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff