(function(n){function t(n){this.init(n)}t.prototype={value:0,size:100,startAngle:-Math.PI,thickness:"auto",fill:{gradient:["#3aeabb","#fdd250"]},emptyFill:"rgba(0, 0, 0, .1)",animation:{duration:1200,easing:"circleProgressEasing"},animationStartValue:0,reverse:!1,lineCap:"butt",constructor:t,el:null,canvas:null,ctx:null,radius:0,arcFill:null,lastFrameValue:0,init:function(t){n.extend(this,t);this.radius=this.size/2;this.initWidget();this.initFill();this.draw()},initWidget:function(){var t=this.canvas=this.canvas||n("<canvas>").prependTo(this.el)[0];t.width=this.size;t.height=this.size;this.ctx=t.getContext("2d")},initFill:function(){function a(){var t=n("<canvas>")[0];t.width=r.size;t.height=r.size;t.getContext("2d").drawImage(e,0,0,u,u);r.arcFill=r.ctx.createPattern(t,"no-repeat");r.drawFrame(r.lastFrameValue)}var r=this,t=this.fill,c=this.ctx,u=this.size,i,o,f,h,e;if(!t)throw Error("The fill is not specified!");if(t.color&&(this.arcFill=t.color),t.gradient)if(i=t.gradient,i.length==1)this.arcFill=i[0];else if(i.length>1){var s=t.gradientAngle||0,v=t.gradientDirection||[u/2*(1-Math.cos(s)),u/2*(1+Math.sin(s)),u/2*(1+Math.cos(s)),u/2*(1-Math.sin(s))],l=c.createLinearGradient.apply(c,v);for(o=0;o<i.length;o++)f=i[o],h=o/(i.length-1),n.isArray(f)&&(h=f[1],f=f[0]),l.addColorStop(h,f);this.arcFill=l}t.image&&(t.image instanceof Image?e=t.image:(e=new Image,e.src=t.image),e.complete?a():e.onload=a)},draw:function(){this.animation?this.drawAnimated(this.value):this.drawFrame(this.value)},drawFrame:function(n){this.lastFrameValue=n;this.ctx.clearRect(0,0,this.size,this.size);this.drawEmptyArc(n);this.drawArc(n)},drawArc:function(n){var t=this.ctx,i=this.radius,u=this.getThickness(),r=this.startAngle;t.save();t.beginPath();this.reverse?t.arc(i,i,i-u/2,r-Math.PI*2*n,r):t.arc(i,i,i-u/2,r,r+Math.PI*2*n);t.lineWidth=u;t.lineCap=this.lineCap;t.strokeStyle=this.arcFill;t.stroke();t.restore()},drawEmptyArc:function(n){var t=this.ctx,i=this.radius,r=this.getThickness(),u=this.startAngle;n<1&&(t.save(),t.beginPath(),n<=0?t.arc(i,i,i-r/2,0,Math.PI*2):this.reverse?t.arc(i,i,i-r/2,u,u-Math.PI*2*n):t.arc(i,i,i-r/2,u+Math.PI*2*n,u),t.lineWidth=r,t.strokeStyle=this.emptyFill,t.stroke(),t.restore())},drawAnimated:function(t){var r=this,i=this.el,u=n(this.canvas);u.stop(!0,!1);i.trigger("circle-animation-start");u.css({animationProgress:0}).animate({animationProgress:1},n.extend({},this.animation,{step:function(n){var u=r.animationStartValue*(1-n)+t*n;r.drawFrame(u);i.trigger("circle-animation-progress",[n,u])}})).promise().always(function(){i.trigger("circle-animation-end")})},getThickness:function(){return n.isNumeric(this.thickness)?this.thickness:this.size/14},getValue:function(){return this.value},setValue:function(n){this.animation&&(this.animationStartValue=this.lastFrameValue);this.value=n;this.draw()}};n.circleProgress={defaults:t.prototype};n.easing.circleProgressEasing=function(n,t,i,r,u){return(t/=u/2)<1?r/2*t*t*t+i:r/2*((t-=2)*t*t+2)+i};n.fn.circleProgress=function(i,r){var u="circle-progress",f=this.data(u),e;if(i=="widget"){if(!f)throw Error('Calling "widget" method on not initialized instance is forbidden');return f.canvas}if(i=="value"){if(!f)throw Error('Calling "value" method on not initialized instance is forbidden');return typeof r=="undefined"?f.getValue():(e=arguments[1],this.each(function(){n(this).data(u).setValue(e)}))}return this.each(function(){var e=n(this),o=e.data(u),f=n.isPlainObject(i)?i:{},r;o?o.init(f):(r=n.extend({},e.data()),typeof r.fill=="string"&&(r.fill=JSON.parse(r.fill)),typeof r.animation=="string"&&(r.animation=JSON.parse(r.animation)),f=n.extend(r,f),f.el=e,o=new t(f),e.data(u,o))})}})(jQuery)