D3.js donut chart

by slandmann

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.16/d3.js"></script>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
<svg></svg>

CSS

line{
  fill: transparent;
  display: none;
}

circle{
  fill: #ffd502;
}

rect{
  fill: none;
}

#circleMask{
  fill: green;
  opacity: 0.5;
}

JavaScript

var width = 250,
    height = 250,
		primaryCircleSize = width * 0.15,
		circleDistances = [0.50, 0.75, 1.00],
    circleSizes = [0.25, 0.20, 0.15],
    arms = 8,
    armAngle = (360/arms),
    lines =	function(){
			var lines = [],
  			offsetDegrees = 15;
  		for(var i = 0; i < arms; i++){
  			lines.push((i * armAngle) + offsetDegrees);
  		}
  		return lines;
		},
		armLength = 3 * primaryCircleSize,
    centerX = width / 2,
    centerY = height / 2,
    chunksRotated = 0,
    maskRotations = 0,
    chunkRotationSpeedInMs = 500,
    maskRotationSpeedInMS = 750,
    maxRadius = armLength + (circleSizes[circleSizes.length - 1] * primaryCircleSize),
    degressOfCircleVisibleOnMask = 245;
    
var svg = d3.select("svg")
    .attr("width", width)
    .attr("height", height)
    .append("g")
    .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")");
    
var arc = d3.svg.arc()
    .innerRadius(0)
    .outerRadius(maxRadius)
    .startAngle(0);
    
svg.append("defs")
 		.append("clipPath")
    .attr("id", "mask")
    .append("path")
   .datum({endAngle: (degressOfCircleVisibleOnMask / 360) * (2*3.14)})
   .style("fill", "red")
   .attr("d", arc)
   .call(spin, maskRotationSpeedInMS);

function buildPrimaryCircle(){
	svg.append("g")
  	.attr("id", "primaryCircleG")
    .attr("clip-path", "url(#mask)")
  	.append("circle")
    .attr("class", "primaryCircle")
    .attr("r", primaryCircleSize);
    //.attr("clip-path", "url(#mask)");
}

function buildLines(){
	svg.append("g")
  	.attr("id", "lineG")
    .attr("clip-path", "url(#mask)")
    .selectAll("line")
  	.data(lines)
    .enter()
    .append("g")
    .attr("class", "lineGroup")
    .attr("id", function(d, i){
    	return "lineGroup" + i;
    })
    .append("line")
    .attr("x1", 0)
    .attr("y1", 0)
    .attr("x2", -armLength)
    .attr("y2", 0);
}

function buildCirclesOnLines() {
	for(var i = 0; i < circleDistances.length; i++){
    svg.selectAll('.lineGroup')
    .each(function(d,j) { 
    ...