-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathjquery.donutchart.js
111 lines (88 loc) · 3.4 KB
/
jquery.donutchart.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
(function($) {
var defaultsettings = {
'bgColor' : '#ccc',
'fgColor' : 'red',
'size' : 160,
'donutwidth': 40,
'textsize': 16,
}
var methods = {
init : function(options) {
var initcanvas=true;
if (typeof(options) == "object")
{
this.donutchartsettings = $.extend({}, defaultsettings, options);
// autoscale donutwidth and textsize
if (options["size"] && !options["donutwidth"])
this.donutchartsettings["donutwidth"]=options["size"]/4;
if (options["size"] && !options["textsize"])
this.donutchartsettings["textsize"]=options["size"]/10;
}
else
{
if (typeof(this.donutchartsettings) == "object")
initcanvas=false;
else
this.donutchartsettings = defaultsettings;
}
if (initcanvas)
{
$(this).css("position","relative");
$(this).css("width",this.donutchartsettings.size+"px");
$(this).css("height",this.donutchartsettings.size+"px");
$(this).html("<canvas width='"+this.donutchartsettings.size+"' height='"+this.donutchartsettings.size+"'></canvas><div style='position:absolute;top:0;left:0;line-height:"+this.donutchartsettings.size+"px;text-align:center;width:"+this.donutchartsettings.size+"px;font-family:Arial,sans-serif;font-size:"+this.donutchartsettings.textsize+"px;font-weight:bold;'></div>");
var canvas = $("canvas",this).get(0);
// excanvas support
if (typeof(G_vmlCanvasManager) != "undefined")
G_vmlCanvasManager.initElement(canvas);
var ctx = canvas.getContext('2d');
methods.drawBg.call(ctx, this.donutchartsettings);
}
},
drawBg : function(settings) {
this.clearRect(0,0,settings.size,settings.size);
this.beginPath();
this.fillStyle = settings.bgColor;
this.arc(settings.size/2,settings.size/2,settings.size/2,0,2*Math.PI,false);
this.arc(settings.size/2,settings.size/2,settings.size/2-settings.donutwidth,0,2*Math.PI,true);
this.fill();
},
drawFg : function(settings,percent) {
var ratio = percent/100 * 360;
var startAngle = Math.PI*-90/180;
var endAngle = Math.PI*(-90+ratio)/180;
this.beginPath();
this.fillStyle = settings.fgColor;
this.arc(settings.size/2,settings.size/2,settings.size/2,startAngle,endAngle,false);
this.arc(settings.size/2,settings.size/2,settings.size/2-settings.donutwidth,endAngle,startAngle,true);
this.fill();
},
};
$.fn.donutchart = function(method) {
return this.each(function() {
methods.init.call(this, method);
if (method=="animate")
{
var percentage = $(this).attr("data-percent");
var canvas = $(this).children("canvas").get(0);
var percenttext = $(this).children("div");
var dcs = this.donutchartsettings;
if (canvas.getContext)
{
var ctx = canvas.getContext('2d');
var j = 0;
function animateDonutChart()
{
j++;
methods.drawBg.call(ctx,dcs);
methods.drawFg.apply(ctx,[dcs,j]);
percenttext.text(j+"%");
if (j >= percentage)
clearInterval(animationID);
}
var animationID = setInterval(animateDonutChart,20);
}
}
})
}
})( jQuery );