// 'use strict'; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; function Sektor(selector, options) { this.element = document.querySelector(selector); var defaultOptions = { size: 100, stroke: 10, arc: false, angle: 225, sectorColor: '#789', circleColor: '#DDD', fillCircle: true }; // Merge options with default ones options = _extends(defaultOptions, options); // Reset stroke to 0 if drawing full sector options.stroke = options.arc ? options.stroke : 0; // Circle dimenstions options.center = options.size / 2; options.radius = options.stroke ? options.center - options.stroke / 2 : options.center; this.options = options; this.checkAngle(); var svg = '\n ' + this.getCircle() + '\n ' + this.getSector() + '\n '; this.element.innerHTML = svg; this.sector = this.element.querySelector('.Sektor-sector'); } Sektor.prototype.checkAngle = function () { if (this.options.angle > 360) { this.options.angle = this.options.angle % 360; } }; Sektor.prototype.changeAngle = function (angle) { this.options.angle = angle; this.checkAngle(); this.sector.setAttribute('d', this.getSector(true)); }; Sektor.prototype.step = function (angleOffset, endAngle, time, endTime) { var _this = this; var now = new Date().valueOf(); var timeOffset = endTime - now; if (timeOffset <= 0) { this.changeAngle(endAngle); } else { var angle = endAngle - angleOffset * timeOffset / time; this.changeAngle(angle); requestAnimationFrame(function () { return _this.step(angleOffset, endAngle, time, endTime); }); } }; Sektor.prototype.animateTo = function (angle) { var _this2 = this; var time = arguments.length <= 1 || arguments[1] === undefined ? 300 : arguments[1]; if (angle > 360) { angle = angle % 360; } var startTime = new Date().valueOf(); var endTime = startTime + time; var angleOffset = angle - this.options.angle; requestAnimationFrame(function () { return _this2.step(angleOffset, angle, time, endTime); }); }; Sektor.prototype.getSector = function () { var returnD = arguments.length <= 0 || arguments[0] === undefined ? false : arguments[0]; var options = this.options; // Colors var sectorFill = options.arc ? 'none' : options.sectorColor; var sectorStroke = options.arc ? options.sectorColor : 'none'; // Arc angles var firstAngle = options.angle > 180 ? 90 : options.angle - 90; var secondAngle = -270 + options.angle - 180; // Arcs var firstArc = this.getArc(firstAngle, options); var secondArc = options.angle > 180 ? this.getArc(secondAngle, options) : ''; // start -> starting line // end -> will path be closed or not var end = ''; var start = null; if (options.arc) { start = 'M' + options.center + ',' + options.stroke / 2; } else { start = 'M' + options.center + ',' + options.center + ' L' + options.center + ',' + options.stroke / 2; end = 'z'; } var d = start + ' ' + firstArc + ' ' + secondArc + ' ' + end; if (returnD) { return d; } return ''; }; Sektor.prototype.getCircle = function () { var options = this.options; var circleFill = options.fillCircle || !options.arc ? options.circleColor : 'none'; return ''; }; // Generates SVG arc string Sektor.prototype.getArc = function (angle) { var options = this.options; var x = options.center + options.radius * Math.cos(this.radians(angle)); var y = options.center + options.radius * Math.sin(this.radians(angle)); return 'A' + options.radius + ',' + options.radius + ' 1 0 1 ' + x + ',' + y; }; // Converts from degrees to radians. Sektor.prototype.radians = function (degrees) { return degrees / 180 * Math.PI; };