(function($) {function init(plot) {var canvas=null;var target=null;var maxRadius=null;var centerLeft=null;var centerTop=null;var total=0;var redraw=true;var redrawAttempts=10;var shrink=0.95;var legendWidth=0;var processed=false;var raw=false;var highlights=[];plot.hooks.processOptions.push(checkPieEnabled);plot.hooks.bindEvents.push(bindEvents);function checkPieEnabled(plot,options) {if(options.series.pie.show) {options.grid.show=false;if(options.series.pie.label.show=='auto') if(options.legend.show) options.series.pie.label.show=false;else options.series.pie.label.show=true;if(options.series.pie.radius=='auto') if(options.series.pie.label.show) options.series.pie.radius=3/4;else options.series.pie.radius=1;if(options.series.pie.tilt>1) options.series.pie.tilt=1;if(options.series.pie.tilt<0) options.series.pie.tilt=0;plot.hooks.processDatapoints.push(processDatapoints);plot.hooks.drawOverlay.push(drawOverlay);plot.hooks.draw.push(draw);}} function bindEvents(plot,eventHolder) {var options=plot.getOptions();if(options.series.pie.show&&options.grid.hoverable) eventHolder.unbind('mousemove').mousemove(onMouseMove);if(options.series.pie.show&&options.grid.clickable) eventHolder.unbind('click').click(onClick);} function alertObject(obj) {var msg='';function traverse(obj,depth) {if(!depth) depth=0;for(var i=0;icanvas.width-maxRadius) centerLeft=canvas.width-maxRadius;} function fixData(data) {for(var i=0;i0) newdata.push({data:[[1,combined]],color:color,label:options.series.pie.combine.label,angle:(combined*(Math.PI*2))/total,percent:(combined/total*100)});return newdata;} function draw(plot,newCtx) {if(!target)return;ctx=newCtx;setupPie();var slices=plot.getData();var attempts=0;while(redraw&&attempts0) maxRadius*=shrink;attempts+=1;clear();if(options.series.pie.tilt<=0.8) drawShadow();drawPie();} if(attempts>=redrawAttempts){clear();target.prepend('
Could not draw pie with labels contained inside canvas
');} if(plot.setSeries&&plot.insertLegend) {plot.setSeries(slices);plot.insertLegend();} function clear() {ctx.clearRect(0,0,canvas.width,canvas.height);target.children().filter('.pieLabel, .pieLabelBackground').remove();} function drawShadow() {var shadowLeft=5;var shadowTop=15;var edge=10;var alpha=0.02;if(options.series.pie.radius>1) var radius=options.series.pie.radius;else var radius=maxRadius*options.series.pie.radius;if(radius>=(canvas.width/2)-shadowLeft||radius*options.series.pie.tilt>=(canvas.height/2)-shadowTop||radius<=edge) return;ctx.save();ctx.translate(shadowLeft,shadowTop);ctx.globalAlpha=alpha;ctx.fillStyle='#000';ctx.translate(centerLeft,centerTop);ctx.scale(1,options.series.pie.tilt);for(var i=1;i<=edge;i++) {ctx.beginPath();ctx.arc(0,0,radius,0,Math.PI*2,false);ctx.fill();radius-=i;} ctx.restore();} function drawPie() {startAngle=Math.PI*options.series.pie.startAngle;if(options.series.pie.radius>1) var radius=options.series.pie.radius;else var radius=maxRadius*options.series.pie.radius;ctx.save();ctx.translate(centerLeft,centerTop);ctx.scale(1,options.series.pie.tilt);ctx.save();var currentAngle=startAngle;for(var i=0;i0.000000001) ctx.moveTo(0,0);else if($.browser.msie) angle-=0.0001;ctx.arc(0,0,radius,currentAngle,currentAngle+angle,false);ctx.closePath();currentAngle+=angle;if(fill) ctx.fill();else ctx.stroke();} function drawLabels() {var currentAngle=startAngle;if(options.series.pie.label.radius>1) var radius=options.series.pie.label.radius;else var radius=maxRadius*options.series.pie.label.radius;for(var i=0;i=options.series.pie.label.threshold*100) drawLabel(slices[i],currentAngle,i);currentAngle+=slices[i].angle;} function drawLabel(slice,startAngle,index) {if(slice.data[0][1]==0) return;var lf=options.legend.labelFormatter,text,plf=options.series.pie.label.formatter;if(lf) text=lf(slice.label,slice);else text=slice.label;if(plf) text=plf(text,slice);var halfAngle=((startAngle+slice.angle)+startAngle)/2;var x=centerLeft+Math.round(Math.cos(halfAngle)*radius);var y=centerTop+Math.round(Math.sin(halfAngle)*radius)*options.series.pie.tilt;var html=''+text+"";target.append(html);var label=target.children('#pieLabel'+index);var labelTop=(y-label.height()/2);var labelLeft=(x-label.width()/2);label.css('top',labelTop);label.css('left',labelLeft);if(0-labelTop>0||0-labelLeft>0||canvas.height-(labelTop+label.height())<0||canvas.width-(labelLeft+label.width())<0) redraw=true;if(options.series.pie.label.background.opacity!=0){var c=options.series.pie.label.background.color;if(c==null){c=slice.color;} var pos='top:'+labelTop+'px;left:'+labelLeft+'px;';$('
').insertBefore(label).css('opacity',options.series.pie.label.background.opacity);}}}}} function drawDonutHole(layer) {if(options.series.pie.innerRadius>0) {layer.save();innerRadius=options.series.pie.innerRadius>1?options.series.pie.innerRadius:maxRadius*options.series.pie.innerRadius;layer.globalCompositeOperation='destination-out';layer.beginPath();layer.fillStyle=options.series.pie.stroke.color;layer.arc(0,0,innerRadius,0,Math.PI*2,false);layer.fill();layer.closePath();layer.restore();layer.save();layer.beginPath();layer.strokeStyle=options.series.pie.stroke.color;layer.arc(0,0,innerRadius,0,Math.PI*2,false);layer.stroke();layer.closePath();layer.restore();}} function isPointInPoly(poly,pt) {for(var c=false,i=-1,l=poly.length,j=l-1;++i1?options.series.pie.radius:maxRadius*options.series.pie.radius;for(var i=0;i1?options.series.pie.radius:maxRadius*options.series.pie.radius;octx.save();octx.translate(centerLeft,centerTop);octx.scale(1,options.series.pie.tilt);for(i=0;i0.000000001) octx.moveTo(0,0);octx.arc(0,0,radius,series.startAngle,series.startAngle+series.angle,false);octx.closePath();octx.fill();}}} var options={series:{pie:{show:false,radius:'auto',innerRadius:0,startAngle:3/2,tilt:1,offset:{top:0,left:'auto'},stroke:{color:'#FFF',width:1},label:{show:'auto',formatter:function(label,slice){return '
'+label+'
'+Math.round(slice.percent)+'%
';},radius:1,background:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,label:'Other'},highlight:{opacity:0.5}}}};$.plot.plugins.push({init:init,options:options,name:"pie",version:"1.0"});})(jQuery);