| 7 (function($){var REDRAW_ATTEMPTS=10;var REDRAW_SHRINK=.95;function init(plot){va
r canvas=null,target=null,options=null,maxRadius=null,centerLeft=null,centerTop=
null,processed=false,ctx=null;var highlights=[];plot.hooks.processOptions.push(f
unction(plot,options){if(options.series.pie.show){options.grid.show=false;if(opt
ions.series.pie.label.show=="auto"){if(options.legend.show){options.series.pie.l
abel.show=false}else{options.series.pie.label.show=true}}if(options.series.pie.r
adius=="auto"){if(options.series.pie.label.show){options.series.pie.radius=3/4}e
lse{options.series.pie.radius=1}}if(options.series.pie.tilt>1){options.series.pi
e.tilt=1}else if(options.series.pie.tilt<0){options.series.pie.tilt=0}}});plot.h
ooks.bindEvents.push(function(plot,eventHolder){var options=plot.getOptions();if
(options.series.pie.show){if(options.grid.hoverable){eventHolder.unbind("mousemo
ve").mousemove(onMouseMove)}if(options.grid.clickable){eventHolder.unbind("click
").click(onClick)}}});plot.hooks.processDatapoints.push(function(plot,series,dat
a,datapoints){var options=plot.getOptions();if(options.series.pie.show){processD
atapoints(plot,series,data,datapoints)}});plot.hooks.drawOverlay.push(function(p
lot,octx){var options=plot.getOptions();if(options.series.pie.show){drawOverlay(
plot,octx)}});plot.hooks.draw.push(function(plot,newCtx){var options=plot.getOpt
ions();if(options.series.pie.show){draw(plot,newCtx)}});function processDatapoin
ts(plot,series,datapoints){if(!processed){processed=true;canvas=plot.getCanvas()
;target=$(canvas).parent();options=plot.getOptions();plot.setData(combine(plot.g
etData()))}}function combine(data){var total=0,combined=0,numCombined=0,color=op
tions.series.pie.combine.color,newdata=[];for(var i=0;i<data.length;++i){var val
ue=data[i].data;if($.isArray(value)&&value.length==1){value=value[0]}if($.isArra
y(value)){if(!isNaN(parseFloat(value[1]))&&isFinite(value[1])){value[1]=+value[1
]}else{value[1]=0}}else if(!isNaN(parseFloat(value))&&isFinite(value)){value=[1,
+value]}else{value=[1,0]}data[i].data=[value]}for(var i=0;i<data.length;++i){tot
al+=data[i].data[0][1]}for(var i=0;i<data.length;++i){var value=data[i].data[0][
1];if(value/total<=options.series.pie.combine.threshold){combined+=value;numComb
ined++;if(!color){color=data[i].color}}}for(var i=0;i<data.length;++i){var value
=data[i].data[0][1];if(numCombined<2||value/total>options.series.pie.combine.thr
eshold){newdata.push($.extend(data[i],{data:[[1,value]],color:data[i].color,labe
l:data[i].label,angle:value*Math.PI*2/total,percent:value/(total/100)}))}}if(num
Combined>1){newdata.push({data:[[1,combined]],color:color,label:options.series.p
ie.combine.label,angle:combined*Math.PI*2/total,percent:combined/(total/100)})}r
eturn newdata}function draw(plot,newCtx){if(!target){return}var canvasWidth=plot
.getPlaceholder().width(),canvasHeight=plot.getPlaceholder().height(),legendWidt
h=target.children().filter(".legend").children().width()||0;ctx=newCtx;processed
=false;maxRadius=Math.min(canvasWidth,canvasHeight/options.series.pie.tilt)/2;ce
nterTop=canvasHeight/2+options.series.pie.offset.top;centerLeft=canvasWidth/2;if
(options.series.pie.offset.left=="auto"){if(options.legend.position.match("w")){
centerLeft+=legendWidth/2}else{centerLeft-=legendWidth/2}if(centerLeft<maxRadius
){centerLeft=maxRadius}else if(centerLeft>canvasWidth-maxRadius){centerLeft=canv
asWidth-maxRadius}}else{centerLeft+=options.series.pie.offset.left}var slices=pl
ot.getData(),attempts=0;do{if(attempts>0){maxRadius*=REDRAW_SHRINK}attempts+=1;c
lear();if(options.series.pie.tilt<=.8){drawShadow()}}while(!drawPie()&&attempts<
REDRAW_ATTEMPTS);if(attempts>=REDRAW_ATTEMPTS){clear();target.prepend("<div clas
s='error'>Could not draw pie with labels contained inside canvas</div>")}if(plot
.setSeries&&plot.insertLegend){plot.setSeries(slices);plot.insertLegend()}functi
on clear(){ctx.clearRect(0,0,canvasWidth,canvasHeight);target.children().filter(
".pieLabel, .pieLabelBackground").remove()}function drawShadow(){var shadowLeft=
options.series.pie.shadow.left;var shadowTop=options.series.pie.shadow.top;var e
dge=10;var alpha=options.series.pie.shadow.alpha;var radius=options.series.pie.r
adius>1?options.series.pie.radius:maxRadius*options.series.pie.radius;if(radius>
=canvasWidth/2-shadowLeft||radius*options.series.pie.tilt>=canvasHeight/2-shadow
Top||radius<=edge){return}ctx.save();ctx.translate(shadowLeft,shadowTop);ctx.glo
balAlpha=alpha;ctx.fillStyle="#000";ctx.translate(centerLeft,centerTop);ctx.scal
e(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(
){var startAngle=Math.PI*options.series.pie.startAngle;var radius=options.series
.pie.radius>1?options.series.pie.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;i<slices.length;++i){slices[i
].startAngle=currentAngle;drawSlice(slices[i].angle,slices[i].color,true)}ctx.re
store();if(options.series.pie.stroke.width>0){ctx.save();ctx.lineWidth=options.s
eries.pie.stroke.width;currentAngle=startAngle;for(var i=0;i<slices.length;++i){
drawSlice(slices[i].angle,options.series.pie.stroke.color,false)}ctx.restore()}d
rawDonutHole(ctx);ctx.restore();if(options.series.pie.label.show){return drawLab
els()}else return true;function drawSlice(angle,color,fill){if(angle<=0||isNaN(a
ngle)){return}if(fill){ctx.fillStyle=color}else{ctx.strokeStyle=color;ctx.lineJo
in="round"}ctx.beginPath();if(Math.abs(angle-Math.PI*2)>1e-9){ctx.moveTo(0,0)}ct
x.arc(0,0,radius,currentAngle,currentAngle+angle/2,false);ctx.arc(0,0,radius,cur
rentAngle+angle/2,currentAngle+angle,false);ctx.closePath();currentAngle+=angle;
if(fill){ctx.fill()}else{ctx.stroke()}}function drawLabels(){var currentAngle=st
artAngle;var radius=options.series.pie.label.radius>1?options.series.pie.label.r
adius:maxRadius*options.series.pie.label.radius;for(var i=0;i<slices.length;++i)
{if(slices[i].percent>=options.series.pie.label.threshold*100){if(!drawLabel(sli
ces[i],currentAngle,i)){return false}}currentAngle+=slices[i].angle}return true;
function drawLabel(slice,startAngle,index){if(slice.data[0][1]==0){return true}v
ar 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,sl
ice)}var halfAngle=(startAngle+slice.angle+startAngle)/2;var x=centerLeft+Math.r
ound(Math.cos(halfAngle)*radius);var y=centerTop+Math.round(Math.sin(halfAngle)*
radius)*options.series.pie.tilt;var html="<span class='pieLabel' id='pieLabel"+i
ndex+"' style='position:absolute;top:"+y+"px;left:"+x+"px;'>"+text+"</span>";tar
get.append(html);var label=target.children("#pieLabel"+index);var labelTop=y-lab
el.height()/2;var labelLeft=x-label.width()/2;label.css("top",labelTop);label.cs
s("left",labelLeft);if(0-labelTop>0||0-labelLeft>0||canvasHeight-(labelTop+label
.height())<0||canvasWidth-(labelLeft+label.width())<0){return false}if(options.s
eries.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+"p
x;";$("<div class='pieLabelBackground' style='position:absolute;width:"+label.wi
dth()+"px;height:"+label.height()+"px;"+pos+"background-color:"+c+";'></div>").c
ss("opacity",options.series.pie.label.background.opacity).insertBefore(label)}re
turn true}}}}function drawDonutHole(layer){if(options.series.pie.innerRadius>0){
layer.save();var innerRadius=options.series.pie.innerRadius>1?options.series.pie
.innerRadius:maxRadius*options.series.pie.innerRadius;layer.globalCompositeOpera
tion="destination-out";layer.beginPath();layer.fillStyle=options.series.pie.stro
ke.color;layer.arc(0,0,innerRadius,0,Math.PI*2,false);layer.fill();layer.closePa
th();layer.restore();layer.save();layer.beginPath();layer.strokeStyle=options.se
ries.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=f
alse,i=-1,l=poly.length,j=l-1;++i<l;j=i)(poly[i][1]<=pt[1]&&pt[1]<poly[j][1]||po
ly[j][1]<=pt[1]&&pt[1]<poly[i][1])&&pt[0]<(poly[j][0]-poly[i][0])*(pt[1]-poly[i]
[1])/(poly[j][1]-poly[i][1])+poly[i][0]&&(c=!c);return c}function findNearbySlic
e(mouseX,mouseY){var slices=plot.getData(),options=plot.getOptions(),radius=opti
ons.series.pie.radius>1?options.series.pie.radius:maxRadius*options.series.pie.r
adius,x,y;for(var i=0;i<slices.length;++i){var s=slices[i];if(s.pie.show){ctx.sa
ve();ctx.beginPath();ctx.moveTo(0,0);ctx.arc(0,0,radius,s.startAngle,s.startAngl
e+s.angle/2,false);ctx.arc(0,0,radius,s.startAngle+s.angle/2,s.startAngle+s.angl
e,false);ctx.closePath();x=mouseX-centerLeft;y=mouseY-centerTop;if(ctx.isPointIn
Path){if(ctx.isPointInPath(mouseX-centerLeft,mouseY-centerTop)){ctx.restore();re
turn{datapoint:[s.percent,s.data],dataIndex:0,series:s,seriesIndex:i}}}else{var
p1X=radius*Math.cos(s.startAngle),p1Y=radius*Math.sin(s.startAngle),p2X=radius*M
ath.cos(s.startAngle+s.angle/4),p2Y=radius*Math.sin(s.startAngle+s.angle/4),p3X=
radius*Math.cos(s.startAngle+s.angle/2),p3Y=radius*Math.sin(s.startAngle+s.angle
/2),p4X=radius*Math.cos(s.startAngle+s.angle/1.5),p4Y=radius*Math.sin(s.startAng
le+s.angle/1.5),p5X=radius*Math.cos(s.startAngle+s.angle),p5Y=radius*Math.sin(s.
startAngle+s.angle),arrPoly=[[0,0],[p1X,p1Y],[p2X,p2Y],[p3X,p3Y],[p4X,p4Y],[p5X,
p5Y]],arrPoint=[x,y];if(isPointInPoly(arrPoly,arrPoint)){ctx.restore();return{da
tapoint:[s.percent,s.data],dataIndex:0,series:s,seriesIndex:i}}}ctx.restore()}}r
eturn null}function onMouseMove(e){triggerClickHoverEvent("plothover",e)}functio
n onClick(e){triggerClickHoverEvent("plotclick",e)}function triggerClickHoverEve
nt(eventname,e){var offset=plot.offset();var canvasX=parseInt(e.pageX-offset.lef
t);var canvasY=parseInt(e.pageY-offset.top);var item=findNearbySlice(canvasX,can
vasY);if(options.grid.autoHighlight){for(var i=0;i<highlights.length;++i){var h=
highlights[i];if(h.auto==eventname&&!(item&&h.series==item.series)){unhighlight(
h.series)}}}if(item){highlight(item.series,eventname)}var pos={pageX:e.pageX,pag
eY:e.pageY};target.trigger(eventname,[pos,item])}function highlight(s,auto){var
i=indexOfHighlight(s);if(i==-1){highlights.push({series:s,auto:auto});plot.trigg
erRedrawOverlay()}else if(!auto){highlights[i].auto=false}}function unhighlight(
s){if(s==null){highlights=[];plot.triggerRedrawOverlay()}var i=indexOfHighlight(
s);if(i!=-1){highlights.splice(i,1);plot.triggerRedrawOverlay()}}function indexO
fHighlight(s){for(var i=0;i<highlights.length;++i){var h=highlights[i];if(h.seri
es==s)return i}return-1}function drawOverlay(plot,octx){var options=plot.getOpti
ons();var radius=options.series.pie.radius>1?options.series.pie.radius:maxRadius
*options.series.pie.radius;octx.save();octx.translate(centerLeft,centerTop);octx
.scale(1,options.series.pie.tilt);for(var i=0;i<highlights.length;++i){drawHighl
ight(highlights[i].series)}drawDonutHole(octx);octx.restore();function drawHighl
ight(series){if(series.angle<=0||isNaN(series.angle)){return}octx.fillStyle="rgb
a(255, 255, 255, "+options.series.pie.highlight.opacity+")";octx.beginPath();if(
Math.abs(series.angle-Math.PI*2)>1e-9){octx.moveTo(0,0)}octx.arc(0,0,radius,seri
es.startAngle,series.startAngle+series.angle/2,false);octx.arc(0,0,radius,series
.startAngle+series.angle/2,series.startAngle+series.angle,false);octx.closePath(
);octx.fill()}}}var options={series:{pie:{show:false,radius:"auto",innerRadius:0
,startAngle:3/2,tilt:1,shadow:{left:5,top:15,alpha:.02},offset:{top:0,left:"auto
"},stroke:{color:"#fff",width:1},label:{show:"auto",formatter:function(label,sli
ce){return"<div style='font-size:x-small;text-align:center;padding:2px;color:"+s
lice.color+";'>"+label+"<br/>"+Math.round(slice.percent)+"%</div>"},radius:1,bac
kground:{color:null,opacity:0},threshold:0},combine:{threshold:-1,color:null,lab
el:"Other"},highlight:{opacity:.5}}}};$.plot.plugins.push({init:init,options:opt
ions,name:"pie",version:"1.1"})})(jQuery); |